From bf36f6102265b92095ef5d87575390cd9ed018d9 Mon Sep 17 00:00:00 2001 From: emreyigit Date: Tue, 18 Nov 2025 16:19:58 +0300 Subject: [PATCH 1/9] Add required variables for manual "Trigger Release" workflow --- .github/workflows/trigger-release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/trigger-release.yml b/.github/workflows/trigger-release.yml index 4ef447ca7..d0fb8ff9f 100644 --- a/.github/workflows/trigger-release.yml +++ b/.github/workflows/trigger-release.yml @@ -56,6 +56,11 @@ jobs: # finalize + trigger the release - name: Trigger Release if: ${{ github.event.inputs.dryrun == 'false' }} + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_OWNER: hazelcast + GH_REPO: hazelcast-csharp-client + GH_BRANCH: release/${{ github.ref_name }} shell: pwsh run: | ./hz.ps1 -noRestore -localRestore update-doc-version From 6d1f3bbc7ac52b908de9a20ccf98db46c8a5f73b Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Tue, 25 Nov 2025 16:59:42 +0300 Subject: [PATCH 2/9] [Breaking Change] Upgrade LINQ dependency [API-2335] (#1007) This PR upgrades `System.Linq.Async` and `System.Linq.Async.Queryable` to resolve clashes on .NET10 runtime. ### Note to `netstandart2.0` users on .NET10 runtime; `Hazelcast.Net` package has some poly fills to adapt some features on legacy framework. This is presented over `netstandart2.0` target. However, if you are running `netstandart2.0` built over .NET10 runtime, you should override the transient dependency `Microsoft.Bcl.Memory` package which comes with `Hazelcast.Net.Linq.Async` to escape from any clashes on .NET10 runtime. In your `csproj` file; ``` MicrosoftBclMemory ``` We present the `netstandart2.0` target for legacy framework support as intention of `netstandart2.0`. If you are trying to run it on modern runtimes, please consider to target `netstandart2.1` or such as .NET10 for better performance and user experience. --- .../Hazelcast.Net.Examples.csproj | 22 +++++-------------- .../Hazelcast.Net.Linq.Async.csproj | 11 ++++------ .../Hazelcast.Net.Testing.csproj | 17 +++++++++++--- .../Hazelcast.Net.Tests.csproj | 16 ++------------ 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/src/Hazelcast.Net.Examples/Hazelcast.Net.Examples.csproj b/src/Hazelcast.Net.Examples/Hazelcast.Net.Examples.csproj index 9634dd525..de03dfd2d 100644 --- a/src/Hazelcast.Net.Examples/Hazelcast.Net.Examples.csproj +++ b/src/Hazelcast.Net.Examples/Hazelcast.Net.Examples.csproj @@ -8,6 +8,11 @@ net8.0;net9.0;net10.0 + + + $(NoWarn);CS1591 + + Exe Hazelcast.Examples @@ -35,21 +40,4 @@ - - - - - - - - - - SystemLinqAsyncEnumerable - - - - - diff --git a/src/Hazelcast.Net.Linq.Async/Hazelcast.Net.Linq.Async.csproj b/src/Hazelcast.Net.Linq.Async/Hazelcast.Net.Linq.Async.csproj index a520abe9a..4b0d1e856 100644 --- a/src/Hazelcast.Net.Linq.Async/Hazelcast.Net.Linq.Async.csproj +++ b/src/Hazelcast.Net.Linq.Async/Hazelcast.Net.Linq.Async.csproj @@ -51,13 +51,10 @@ - - - + + - + - - + diff --git a/src/Hazelcast.Net.Testing/Hazelcast.Net.Testing.csproj b/src/Hazelcast.Net.Testing/Hazelcast.Net.Testing.csproj index 6e16de9b5..aa2400546 100644 --- a/src/Hazelcast.Net.Testing/Hazelcast.Net.Testing.csproj +++ b/src/Hazelcast.Net.Testing/Hazelcast.Net.Testing.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netstandard2.1 + netstandard2.0;netstandard2.1; @@ -33,10 +33,21 @@ - - + + + + + + + + + MicrosoftBclMemory + + + + diff --git a/src/Hazelcast.Net.Tests/Hazelcast.Net.Tests.csproj b/src/Hazelcast.Net.Tests/Hazelcast.Net.Tests.csproj index 5911df0af..8142d84e8 100644 --- a/src/Hazelcast.Net.Tests/Hazelcast.Net.Tests.csproj +++ b/src/Hazelcast.Net.Tests/Hazelcast.Net.Tests.csproj @@ -49,21 +49,9 @@ - - - + + - - - - - SystemLinqAsyncEnumerable - - - - From 290cc776f8bac597d728029d15cd518f9f858c16 Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Fri, 28 Nov 2025 19:05:52 +0300 Subject: [PATCH 3/9] Server Condition Fix [HZ-5273] (#1008) Fix server condition issue detected during release testing, and fixed the vector collection after run the tests properly. --- .../TestData/EmployeeTestObject.cs | 13 +++++++ src/Hazelcast.Net.Tests/CP/CPRoutingTests.cs | 2 +- .../Remote/UnisocketTests.cs | 4 +-- .../Vector/VectorCollectionTests.cs | 2 +- .../Impl/HVectorCollection.cs | 36 ++++++++++++++----- src/Hazelcast.Net/Hazelcast.Net.csproj | 2 +- .../Models/SingleVectorValues.cs | 14 ++++++-- 7 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/Hazelcast.Net.Testing/TestData/EmployeeTestObject.cs b/src/Hazelcast.Net.Testing/TestData/EmployeeTestObject.cs index c8496d7cd..a6722aa34 100644 --- a/src/Hazelcast.Net.Testing/TestData/EmployeeTestObject.cs +++ b/src/Hazelcast.Net.Testing/TestData/EmployeeTestObject.cs @@ -33,5 +33,18 @@ public DateTime Started } public long StartedAtTimeStamp { get; set; } public char Type { get; set; } + + public override bool Equals(object obj) + { + if (this == obj) return true; + if (obj == null || GetType() != obj.GetType()) return false; + var that = (EmployeeTestObject)obj; + return Id == that.Id && + Name == that.Name && + Salary.Equals(that.Salary) && + StartedAtTimeStamp == that.StartedAtTimeStamp && + Type == that.Type; + } + } } diff --git a/src/Hazelcast.Net.Tests/CP/CPRoutingTests.cs b/src/Hazelcast.Net.Tests/CP/CPRoutingTests.cs index 331bcdff8..1a0997202 100644 --- a/src/Hazelcast.Net.Tests/CP/CPRoutingTests.cs +++ b/src/Hazelcast.Net.Tests/CP/CPRoutingTests.cs @@ -26,7 +26,7 @@ namespace Hazelcast.Tests.CP { [Category("enterprise")] - [ServerCondition("[5.5)")] + [ServerCondition("[5.5,)")] [Timeout(30_000)] public class CPRoutingTests : MultiMembersRemoteTestBase { diff --git a/src/Hazelcast.Net.Tests/Remote/UnisocketTests.cs b/src/Hazelcast.Net.Tests/Remote/UnisocketTests.cs index 5387c44e4..70dc4d469 100644 --- a/src/Hazelcast.Net.Tests/Remote/UnisocketTests.cs +++ b/src/Hazelcast.Net.Tests/Remote/UnisocketTests.cs @@ -126,7 +126,7 @@ public async Task TestClientConnectsToOneMember() [Test] - [ServerCondition("[6.0)")] + [ServerCondition("5.6.0")] public async Task TestRoutingModesInOrderWithServer() { var script = @"result = com.hazelcast.client.config.RoutingMode.SINGLE_MEMBER.getId() + @@ -147,7 +147,7 @@ public async Task TestRoutingModesInOrderWithServer() } [Test] - [ServerCondition("[5.5.0,6.0)")] + [ServerCondition("[5.5,)")] public async Task TestRoutingModesInOrderWithServerWithPreviousPackage() { var script = @"result = com.hazelcast.client.impl.connection.tcp.RoutingMode.SINGLE_MEMBER.getId() + diff --git a/src/Hazelcast.Net.Tests/Vector/VectorCollectionTests.cs b/src/Hazelcast.Net.Tests/Vector/VectorCollectionTests.cs index 04e726514..d101ef05b 100644 --- a/src/Hazelcast.Net.Tests/Vector/VectorCollectionTests.cs +++ b/src/Hazelcast.Net.Tests/Vector/VectorCollectionTests.cs @@ -21,7 +21,7 @@ using NUnit.Framework; namespace Hazelcast.Tests.Vector { - [ServerCondition("[5.5.0")] + [ServerCondition("5.5")] [Category("enterprise")] public class VectorCollectionTests : SingleMemberClientRemoteTestBase { diff --git a/src/Hazelcast.Net/DistributedObjects/Impl/HVectorCollection.cs b/src/Hazelcast.Net/DistributedObjects/Impl/HVectorCollection.cs index 6c6352e69..5eb1a479c 100644 --- a/src/Hazelcast.Net/DistributedObjects/Impl/HVectorCollection.cs +++ b/src/Hazelcast.Net/DistributedObjects/Impl/HVectorCollection.cs @@ -17,6 +17,7 @@ using System.Threading.Tasks; using Hazelcast.Clustering; using Hazelcast.Core; +using Hazelcast.Messaging; using Hazelcast.Models; using Hazelcast.Protocol.Codecs; using Hazelcast.Serialization; @@ -67,22 +68,39 @@ public async Task> PutIfAbsentAsync(TKey key, IVectorDocum var rawResponse = VectorCollectionPutIfAbsentCodec.DecodeResponse(response).Value; return await DeserializeIVectorDocumentAsync(rawResponse).CfAwait(); } - public Task PutAllAsync([NotNull] IDictionary> vectorDocumentMap) + public async Task PutAllAsync([NotNull] IDictionary> vectorDocumentMap) { vectorDocumentMap.ThrowIfNull(); + var entriesByPartition = new Dictionary>>>(); - var rawEntries = new List>>(); foreach (var kvp in vectorDocumentMap) { var key = kvp.Key ?? throw new ArgumentException($"Key cannot be null in {nameof(vectorDocumentMap)}."); var val = kvp.Value ?? throw new ArgumentException($"Value cannot be null in {nameof(vectorDocumentMap)}."); - var dataKey = ToSafeData(key); - var dataValue = ToSafeData(val); - var rawDocument = new VectorDocument(dataValue, kvp.Value.Vectors); - rawEntries.Add(new KeyValuePair>(dataKey, rawDocument)); + var(dataKey, rawDocument) = PrepareForPut(key, val); + var partitionId = Cluster.Partitioner.GetPartitionId(dataKey.PartitionHash); + + if (entriesByPartition.TryGetValue(partitionId, out var list)) + { + list.Add(new KeyValuePair>(dataKey, rawDocument)); + } + else + { + entriesByPartition[partitionId] = new List>>() + { + new KeyValuePair>(dataKey, rawDocument) + }; + } } - var message = VectorCollectionPutAllCodec.EncodeRequest(Name, rawEntries); - return Cluster.Messaging.SendAsync(message); + + var tasks = new List>(); + foreach (var entry in entriesByPartition) + { + var message = VectorCollectionPutAllCodec.EncodeRequest(Name, entry.Value); + tasks.Add(Cluster.Messaging.SendToPartitionOwnerAsync(message, entry.Key)); + } + + await Task.WhenAll(tasks).CfAwait(); } public async Task> RemoveAsync(TKey key) { @@ -143,7 +161,7 @@ private async Task> DeserializeIVectorDocumentAsync( { return null; } - + var userObject = await ToObjectAsync(rawResponse.Value).CfAwait(); return new VectorDocument(userObject, rawResponse.Vectors); } diff --git a/src/Hazelcast.Net/Hazelcast.Net.csproj b/src/Hazelcast.Net/Hazelcast.Net.csproj index 75d5a0582..f7a7eb4a3 100644 --- a/src/Hazelcast.Net/Hazelcast.Net.csproj +++ b/src/Hazelcast.Net/Hazelcast.Net.csproj @@ -68,7 +68,7 @@ - + diff --git a/src/Hazelcast.Net/Models/SingleVectorValues.cs b/src/Hazelcast.Net/Models/SingleVectorValues.cs index bbd132cb8..882e6503c 100644 --- a/src/Hazelcast.Net/Models/SingleVectorValues.cs +++ b/src/Hazelcast.Net/Models/SingleVectorValues.cs @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -using Hazelcast.Serialization; +using System.Linq; namespace Hazelcast.Models { public class SingleVectorValues : VectorValues @@ -22,12 +22,22 @@ internal SingleVectorValues(float[] vector) Vector = vector; } public float[] Vector { get; } - + + + /// public override string ToString() { var val = Vector == null ? "null" : $"[{string.Join(", ", Vector)}]"; return $"SingleVectorValues{{vector={val}}}"; } + /// + public override bool Equals(object obj) + { + if (this == obj) return true; + if (obj == null || GetType() != obj.GetType()) return false; + var that = (SingleVectorValues)obj; + return Vector.SequenceEqual(that.Vector); + } } } From fba2e3c92d7a01ce1855a0559521b1bd0d76e778 Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Mon, 1 Dec 2025 09:07:39 +0300 Subject: [PATCH 4/9] Handle Public API changes `5.6.z` (#1013) --- src/Hazelcast.Net/PublicAPI/PublicAPI.Shipped.txt | 3 ++- src/Hazelcast.Net/PublicAPI/net10.0/PublicAPI.Shipped.txt | 1 + src/Hazelcast.Net/PublicAPI/net8.0/PublicAPI.Shipped.txt | 1 + src/Hazelcast.Net/PublicAPI/net9.0/PublicAPI.Shipped.txt | 1 + .../PublicAPI/netstandard2.0/PublicAPI.Shipped.txt | 2 +- .../PublicAPI/netstandard2.1/PublicAPI.Shipped.txt | 2 +- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Hazelcast.Net/PublicAPI/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/PublicAPI.Shipped.txt index 931c268de..06c38c3c2 100644 --- a/src/Hazelcast.Net/PublicAPI/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/PublicAPI.Shipped.txt @@ -2653,4 +2653,5 @@ override Hazelcast.Models.ClusterVersion.GetHashCode() -> int ~Hazelcast.Networking.NetworkingOptions.RoutingMode.get -> Hazelcast.Networking.RoutingMode ~override Hazelcast.Models.ClusterVersion.Equals(object obj) -> bool ~override Hazelcast.Models.ClusterVersion.ToString() -> string -~static Hazelcast.Models.ClusterVersion.Parse(string value) -> Hazelcast.Models.ClusterVersion \ No newline at end of file +~static Hazelcast.Models.ClusterVersion.Parse(string value) -> Hazelcast.Models.ClusterVersion +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool \ No newline at end of file diff --git a/src/Hazelcast.Net/PublicAPI/net10.0/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/net10.0/PublicAPI.Shipped.txt index 12001093c..4daf08313 100644 --- a/src/Hazelcast.Net/PublicAPI/net10.0/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/net10.0/PublicAPI.Shipped.txt @@ -2711,3 +2711,4 @@ virtual Hazelcast.Serialization.Compact.CompactSerializerBase.TypeName.get -> ~virtual Hazelcast.Query.PredicateBuilder.IsLike(string pattern) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.IsNotEqualTo(object value) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.Matches(string regex) -> Hazelcast.Query.IPredicate +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool \ No newline at end of file diff --git a/src/Hazelcast.Net/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/net8.0/PublicAPI.Shipped.txt index 12001093c..4daf08313 100644 --- a/src/Hazelcast.Net/PublicAPI/net8.0/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/net8.0/PublicAPI.Shipped.txt @@ -2711,3 +2711,4 @@ virtual Hazelcast.Serialization.Compact.CompactSerializerBase.TypeName.get -> ~virtual Hazelcast.Query.PredicateBuilder.IsLike(string pattern) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.IsNotEqualTo(object value) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.Matches(string regex) -> Hazelcast.Query.IPredicate +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool \ No newline at end of file diff --git a/src/Hazelcast.Net/PublicAPI/net9.0/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/net9.0/PublicAPI.Shipped.txt index 12001093c..4daf08313 100644 --- a/src/Hazelcast.Net/PublicAPI/net9.0/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/net9.0/PublicAPI.Shipped.txt @@ -2711,3 +2711,4 @@ virtual Hazelcast.Serialization.Compact.CompactSerializerBase.TypeName.get -> ~virtual Hazelcast.Query.PredicateBuilder.IsLike(string pattern) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.IsNotEqualTo(object value) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.Matches(string regex) -> Hazelcast.Query.IPredicate +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool \ No newline at end of file diff --git a/src/Hazelcast.Net/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index 776f4142a..1cd904f7b 100644 --- a/src/Hazelcast.Net/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -2711,5 +2711,5 @@ virtual Hazelcast.Serialization.Compact.CompactSerializerBase.TypeName.get -> ~virtual Hazelcast.Query.PredicateBuilder.IsLike(string pattern) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.IsNotEqualTo(object value) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.Matches(string regex) -> Hazelcast.Query.IPredicate - +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool diff --git a/src/Hazelcast.Net/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt b/src/Hazelcast.Net/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt index b24f79f48..7a20fbc77 100644 --- a/src/Hazelcast.Net/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt +++ b/src/Hazelcast.Net/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt @@ -2711,5 +2711,5 @@ virtual Hazelcast.Serialization.Compact.CompactSerializerBase.TypeName.get -> ~virtual Hazelcast.Query.PredicateBuilder.IsLike(string pattern) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.IsNotEqualTo(object value) -> Hazelcast.Query.IPredicate ~virtual Hazelcast.Query.PredicateBuilder.Matches(string regex) -> Hazelcast.Query.IPredicate - +~override Hazelcast.Models.SingleVectorValues.Equals(object obj) -> bool From 0655f43dbfc579a59feaa1d9d0e72c21b71837f5 Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Mon, 1 Dec 2025 13:46:38 +0300 Subject: [PATCH 5/9] Fix Test Failures[HZ-5275] (#1015) The PR fixes vector vector search hint null failure. Also, Decreases insatiability of `TestDelayedQueue` test by using atomic increment instead ++ operation. --- src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs | 2 +- src/Hazelcast.Net/Models/VectorSearchOptions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs b/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs index e74e83113..2696c0d86 100644 --- a/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs +++ b/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs @@ -217,7 +217,7 @@ async Task ConnectMembers(MemberConnectionQueue memberConnectionQueue, Cancellat { await foreach (var request in memberConnectionQueue.WithCancellation(cancellationToken)) { - dequeuedRequests++; + Interlocked.Increment(ref dequeuedRequests); if (!memberCount.TryGetValue(request.Member.Id, out var count)) count = 0; memberCount[request.Member.Id] = ++count; logger.LogDebug($"Connect request={dequeuedRequests} member={request.Member.Id.ToShortString()} count={count} result={(count == successCount ? "success" : "failed")}"); diff --git a/src/Hazelcast.Net/Models/VectorSearchOptions.cs b/src/Hazelcast.Net/Models/VectorSearchOptions.cs index 9ede16314..4d73e1582 100644 --- a/src/Hazelcast.Net/Models/VectorSearchOptions.cs +++ b/src/Hazelcast.Net/Models/VectorSearchOptions.cs @@ -34,7 +34,7 @@ public VectorSearchOptions(bool includeValue = default, IncludeValue = includeValue; IncludeVectors = includeVectors; Limit = limit; - Hints = hints; + Hints = hints ?? new Dictionary(); } /// From a2f8e45bb08cef0efac22ae41b19a5e22e644344 Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Wed, 3 Dec 2025 12:55:20 +0300 Subject: [PATCH 6/9] Fix `Remote.UnisocketTests.TestDistributedObjectEventsWithDummyClient` [HZ-5280] (#1021) Added null check to prevent usage of `_subscribeTasks` during client dispose. closes #965 The test output that helped to catch issue: ``` Standard Output Messages: + Unobserved Exception: System.NullReferenceException: Object reference not set to an instance of an object. at Hazelcast.Clustering.ClusterEvents.AddSubscriptionsAsync(MemberConnection connection, IReadOnlyCollection`1 subscriptions, CancellationToken cancellationToken) in /home/runner/work/client-compatibility-suites/client-compatibility-suites/client/src/Hazelcast.Net/Clustering/ClusterEvents.cs:line 346 at Hazelcast.Clustering.ClusterEvents.DisposeAsync() in /home/runner/work/client-compatibility-suites/client-compatibility-suites/client/src/Hazelcast.Net/Clustering/ClusterEvents.cs:line 1014 at Hazelcast.Clustering.Cluster.DisposeAsync() in /home/runner/work/client-compatibility-suites/client-compatibility-suites/client/src/Hazelcast.Net/Clustering/Cluster.cs:line 219 ``` --- src/Hazelcast.Net/Clustering/ClusterEvents.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Hazelcast.Net/Clustering/ClusterEvents.cs b/src/Hazelcast.Net/Clustering/ClusterEvents.cs index 8e6499e97..503821119 100644 --- a/src/Hazelcast.Net/Clustering/ClusterEvents.cs +++ b/src/Hazelcast.Net/Clustering/ClusterEvents.cs @@ -343,7 +343,7 @@ private async Task AddSubscriptionsAsync(MemberConnection connection, IReadOnlyC } // we are done now - lock (_subscribeTasksMutex) _subscribeTasks.Remove(connection); + lock (_subscribeTasksMutex) _subscribeTasks?.Remove(connection); } /// From 31cf306178e3c6d1c332d4547fc6f979aa3a2b3f Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Thu, 4 Dec 2025 10:08:24 +0300 Subject: [PATCH 7/9] Fix `Clustering.ConnectMembersTests.TestDelayedQue` (#1020) closes #1018 The `MemberRequest` and queue were using different time sources, that was causing slightly differences in new runtimes due to their better performance. Now, both are using same source, there is no differences anymore. --- src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs b/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs index 2696c0d86..398e96bdd 100644 --- a/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs +++ b/src/Hazelcast.Net.Tests/Clustering/ConnectMembersTests.cs @@ -246,9 +246,12 @@ await AssertEx.SucceedsEventually(() => cancellation.Cancel(); await connecting.CfAwaitCanceled(); - // each member retried twice = twice the 1s delay = 2s + // each member retried twice = twice the ~1s delay ~ 2s // we should not have completed faster than that, even so the code runs fully in-memory - Assert.That(elapsed, Is.GreaterThanOrEqualTo(TimeSpan.FromSeconds(2))); + // Note: The queue has 10ms error margin per wait, so we take 20ms total margin for two unsuccessful tries + var failedCount = successCount - 1; + var expectedMinTotalDelay = TimeSpan.FromMilliseconds(failedCount * 990); // 990ms per failed try including 10ms margin + Assert.That(elapsed, Is.GreaterThanOrEqualTo(expectedMinTotalDelay)); HConsole.WriteLine(this, $"Elapsed: {elapsed}"); Assert.That(queue.Count, Is.EqualTo(0)); From 41e2c698124af7f114f5aeb74bfa85940225544f Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Fri, 5 Dec 2025 16:00:42 +0300 Subject: [PATCH 8/9] Fix Release Action (#1023) The release action failed due to mis placed install action. It should be called after checkout. --- .github/actions/install/action.yml | 2 +- .github/workflows/build-release.yml | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/actions/install/action.yml b/.github/actions/install/action.yml index 16a73c323..614811d95 100644 --- a/.github/actions/install/action.yml +++ b/.github/actions/install/action.yml @@ -59,7 +59,7 @@ runs: - name: Install .NET #on Windows - #if: inputs.dotnet == 'true' && inputs.os == 'windows-latest' + if: inputs.dotnet == 'true' # && inputs.os == 'windows-latest' uses: actions/setup-dotnet@v5 with: dotnet-version: | diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 9ac1f4699..681585ade 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -285,15 +285,7 @@ jobs: needs: [ analyze, build-release ] if: needs.analyze.outputs.todo == 'release' - steps: - - # Install our environment - - name: Install environment - uses: ./.github/actions/install - with: - os: ubuntu-latest - dotnet: true - java: false + steps: # checkout the hazelcast/hazelcast-csharp-client repository - name: Checkout code From 20e7d2346ad7813aecc8a601dfd679acb2f2ebce Mon Sep 17 00:00:00 2001 From: Emre Yigit Date: Fri, 5 Dec 2025 19:05:10 +0300 Subject: [PATCH 9/9] Merge `v5.6.0` tag Back to Maintenance Branch [HZ-5255][HZ-2336] (#1024) Merge the tag back to maintenance branch. --------- Co-authored-by: GitHub Actions (Trigger Release) --- doc/latest-version | 2 +- doc/versions.md | 2 +- doc/xrefmap.yml | 5 +++++ src/Directory.Build.props | 6 +++--- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/latest-version b/doc/latest-version index 1e20ec35c..4cc0e35cb 100644 --- a/doc/latest-version +++ b/doc/latest-version @@ -1 +1 @@ -5.4.0 \ No newline at end of file +5.6.0 \ No newline at end of file diff --git a/doc/versions.md b/doc/versions.md index 85c2d6871..f118930cc 100644 --- a/doc/versions.md +++ b/doc/versions.md @@ -6,7 +6,7 @@ Versions lifecycle and support period follows the Hazelcast [Version Support Win ### Current Version -* 5.5.0 [general documentation](xref:doc-index-5-4-0) and [API reference](xref:api-index-5-4-0) +* 5.6.0 [general documentation](xref:doc-index-5-6-0) and [API reference](xref:api-index-5-6-0) ### Preview diff --git a/doc/xrefmap.yml b/doc/xrefmap.yml index 6fa3a8881..e77fa4809 100644 --- a/doc/xrefmap.yml +++ b/doc/xrefmap.yml @@ -88,3 +88,8 @@ references: href: 5.4.0/doc/index.html - uid: api-index-5-4-0 href: 5.4.0/api/index.html +- uid: doc-index-5-6-0 + name: 5.6.0 + href: 5.6.0/doc/index.html +- uid: api-index-5-6-0 + href: 5.6.0/api/index.html diff --git a/src/Directory.Build.props b/src/Directory.Build.props index cc1e7da32..5dd94b394 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -83,9 +83,9 @@ 4.0.0-alpha.2 --> - 5.5.0 - 5.5.0 - 5.5.0 + 5.6.0 + 5.6.0 + 5.6.0