diff --git a/src/Hazelcast.Net.Tests/Remote/ClientMapTest.cs b/src/Hazelcast.Net.Tests/Remote/ClientMapTest.cs index 050cea6d8..5d8450991 100644 --- a/src/Hazelcast.Net.Tests/Remote/ClientMapTest.cs +++ b/src/Hazelcast.Net.Tests/Remote/ClientMapTest.cs @@ -13,6 +13,7 @@ // limitations under the License. using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -1407,5 +1408,42 @@ public async Task TestValuesPredicate() Assert.IsTrue(enumerator.MoveNext()); Assert.AreEqual("value1", enumerator.Current); } + + [Test] + public async Task TestTTLUpdated() + { + var map = await Client.GetMapAsync(CreateUniqueName()); + // in seconds + var maxTTL = 100; + var minTTL = 3; + var key = "key1"; + var latch = new ManualResetEvent(false); + + var starTime = Stopwatch.StartNew(); + await map.SetAsync(key, "value1", TimeSpan.FromSeconds(maxTTL)); + + // Notify when key removed + var parallelCheck = Task.Run(async () => + { + await AssertEx.SucceedsEventually( + async () => Assert.False(await map.ContainsKeyAsync(key)), + maxTTL * 1000, + 500); + latch.Set(); + }); + + // Reduce the TTL + Assert.True(await map.UpdateTimeToLive(key, TimeSpan.FromSeconds(minTTL))); + + await latch.WaitOneAsync(); + starTime.Stop(); + var elapsed = starTime.ElapsedMilliseconds; + + // Definitively, less then maxTTL + Assert.Less(elapsed, maxTTL * 1000); + + // Close to min TTL + Assert.Less(elapsed, minTTL * 1000 * 2); + } } } diff --git a/src/Hazelcast.Net/DistributedObjects/Impl/HMap.Setting.cs b/src/Hazelcast.Net/DistributedObjects/Impl/HMap.Setting.cs index 5795fde7c..630fe9dfa 100644 --- a/src/Hazelcast.Net/DistributedObjects/Impl/HMap.Setting.cs +++ b/src/Hazelcast.Net/DistributedObjects/Impl/HMap.Setting.cs @@ -392,9 +392,15 @@ Task SetTransientAsync(IData keyData, IData valueData, TimeSpan timeToLive, Time #endif } - public Task UpdateTimeToLive(TKey key, TimeSpan timeToLive) + public async Task UpdateTimeToLive(TKey key, TimeSpan timeToLive) { - throw new NotImplementedException(); + var keyData = ToSafeData(key); + var seconds = Convert.ToInt64(timeToLive.TotalSeconds); + var requestMessage = MapSetTtlCodec.EncodeRequest(Name, keyData, seconds); + + var result= await Cluster.Messaging.SendToKeyPartitionOwnerAsync(requestMessage, keyData).CfAwait(); + var decoded = MapSetTtlCodec.DecodeResponse(result); + return decoded.Response; } } }