C# Client Library Release Notes

  • 4.2.6
    Release Date: November 22, 2021


    • CLIENT-1636 Fix race condition in AsyncCommandDelayingQueue that might result in a new async command being ignored.

  • 4.2.4
    Release Date: October 18, 2021


    • Add Exp.expr() to merge precompiled expressions into a greater expression.

    • Allow record parse customization. This gives finer control over memory allocations and how the received data is interpreted.

    • Make ThreadLocalData.THREAD_LOCAL_CUTOFF public and modifiable.

    • Add ScanResume example.


    • CLIENT-1611 Set partition's last digest received only after the scan callback returns. If the scan callback throws an exception, the last digest will not be set and that record will be returned again if the scan is resumed at a later time.

    • Do not retry scan on QUOTA_EXCEEDED.

  • 4.2.3
    Release Date: September 17, 2021


    • CLIENT-1580 Allow null sessionExpiration for compatibility with older servers.

    • CLIENT-1604 Return consistent PartitionStatus array in PartitionFilter when sync/async ScanPartitions() or async QueryPartitions() fails.

    • CLIENT-1604 Retry scan on QUOTA_EXCEEDED.

    • Require TLS configuration if authMode == PKI.

    • Fix Exp.GeoBin() doc example.

    • Allow User and Password properties to not be specified in unit test configuration.

  • 4.2.2
    Release Date: August 11, 2021


    • CLIENT-1569 Support PKI authentication where the TLS certificate's common name (CN) specifies the Aerospike user name. This feature requires server version 5.7+.

    • CLIENT-1571 Support batch read operations.

    • CLIENT-1572 Support scan-show and query-show info commands.

    • CLIENT-1567 Add seed and peer nodes at the same time on startup. Refresh peers of new nodes in same cluster tend iteration.


    • CLIENT-1574 Avoid using previous failed node when possible in batch retry.

    • Set "Node.rebalanceChanged" to "Cluster.rackAware" when creating node.

    • Remove supported feature checks in AerospikeDemo because each feature is supported on minimum server version (4.9).

    • Only read volatile sessionToken if cluster username is defined.

    • Do not run durable delete tests on community servers.

  • 4.2.1
    Release Date: July 15, 2021


    • CLIENT-1556 Add new map Bin constructor that accepts MapOrder as an argument.

    • CLIENT-1557 Support a list of preferred racks rather than a single rack when replica is PREFER_RACK.

    • For scan exception result code MAX_RETRIES_EXCEEDED, include all retry sub-exceptions in exception message.

    • Add Exp.BoolBin().


    • CLIENT-1544 Perform only one cluster tend in WaitTillStabilized() because the tend now requests partition maps in same iteration as adding the nodes.

    • CLIENT-1544 Attempt to contact an invalid node (referenced by seeds or peers) only once for each cluster tend iteration.

    • CLIENT-1544 Add invalidNodeCount to ClusterStats and also provide direct access in "Cluster.InvalidNodeCount". invalidNodeCount is the count of referenced nodes that cannot be added to the cluster in the most recent cluster tend iteration.

    • CLIENT-1550 Do not create Key object when parsing batch read results because it is no longer used.

    • CLIENT-1560 Relogin to node when quick node restart detected. Also, use volatile references to node's sessionToken.

    • DOCS-217 Fix REVERSE_RANK doc to say "Return reverse value order."

  • 4.2.0
    Release Date: April 30, 2021


    • CLIENT-1461 Support boolean particle type. If "Value.UseBoolBin" is true, a boolean is sent to the server as a boolean bin instead of an integer bin. Server version 5.6+ is required when "Value.UseBoolBin" is true. Default is false.

    • CLIENT-1475 Support new math, bit, and conditional expressions. These expressions require server version 5.6+.

    • CLIENT-1486 Support user quotas and statistics. This feature requires server version 5.6+.

    • CLIENT-1501 Remove Policy.priority, ScanPolicy.scanPercent and ScanPolicy.failOnClusterChange. The server no longer supports these fields. See Incompatible API change.

    • CLIENT-1502 Support aggregation queries in .NET Core. Upgrade to NeoLua 1.3.13.


    • CLIENT-1494 Detect quick node restart when restarted node never left the cluster. If detected, reset error count and balance connections.

    • CLIENT-1502 Remove unused largelist_example.lua from AerospikeTest.

    • CLIENT-1519 Retry on server timeout if maxRetries and totalTimeout have not been reached. Increment error count on server timeout.

  • 4.1.6
    Release Date: April 14, 2021


    • CLIENT-1454 Support scan pagination with PartitionFilter.


    • CLIENT-1499 Check for null node and connection in AsyncCommand.FailOnApplicationError().

    • CLIENT-1499 Do not keep connection on all client side errors.

    • CLIENT-1499 Do not copy old node reference on retry. Node is initialized at the start of the retry.

    • CLIENT-1487 Remove ability to use old authentication protocol since the new authentication protocol was created in server version 4.1 and the client already requires server version 4.9+.

    • CLIENT-1485 Remove ability to configure password hash as the password when using authentication.

    • Create new async connections sequentially when balancing async connections from cluster tend.

    • Rename namespace BCrypt.Net to Aerospike.Client.

  • 4.1.5
    Release Date: March 17, 2021


    • CLIENT-1460 Support AsyncClientPolicy asyncMaxCommandInQueue. Reject new async commands if asyncMaxCommandInQueue > 0 and delay queue size >= asyncMaxCommandInQueue.

    • CLIENT-1473 Accept new bool particle type on reads, but continue writing bool as an integer bin. This is an interim step that allows rolling upgrades with bool support when server version 5.6 is released.

  • 4.1.4
    Release Date: March 2, 2021


    • CLIENT-1459 Fix .NET Core on Linux issues.

    • If SocketAsyncEventArgs.BytesTransferred is zero on send, close connection and retry if maxRetries not reached.

    • Fix infinite loop in Util.GetErrorMessage() when exception's InnerException is always populated on all levels.

    • Fix Log.Callback doc to say the log is disabled by default.

  • 4.1.3
    Release Date: February 5, 2021


    • CLIENT-1377 Reject command when assigned node's error rate exceeds ClientPolicy.maxErrorRate per ClientPolicy.errorRateWindow. The node's error count is incremented on any error that causes the connection to close (socket errors and client timeouts) plus ResultCode.DEVICE_OVERLOAD. Attempt retry before throwing AerospikeException.Backoff. Default maxErrorRate (0) disables error rate rejection.

    • Retry on ResultCode.DEVICE_OVERLOAD.


    • CLIENT-1446 Add ShouldSerializeNode() to AerospikeException. This method signals the Newtonsoft JSON serializer to ignore the node member variable when serializing an AerospikeException instance.

  • 4.1.2
    Release Date: January 19, 2021


    • CLIENT-1415 Enforce hard limit on asyncMaxConnsPerNode.

    • CLIENT-1396 Avoid wrapping AerospikeException within another AerospikeException when using async commands.

    • CLIENT-1391 Consolidate generation reset in RefreshFailed().

  • 4.1.1
    Release Date: December 18, 2020


    • Add Exp.Val(ulong val).

    • CLIENT-1387 Deprecate MapOperation.Decrement(). Use MapOperation.Increment() with a negative value instead.


    • CLIENT-1391 Reset peers, partition and rebalance generations on node tend errors. This forces a client node refresh when a node is quickly restarted with the same generation, but with different peers, partition maps or rack nodes.

    • CLIENT-1395 Fix NullReferenceException when async query is run with failOnClusterChange set to true.

  • 4.1.0
    Release Date: December 8, 2020


    • Set Framework minimum version to Visual Studio 15 and .NET Framework 4.5.

    • CLIENT-1375 Add Expression.GetBase64() to return base64 encoded string of packed expression bytes.

    • CLIENT-1378 Add AerospikeClient.SetXDRFilter().

    • Add ResultCode.LOST_CONFLICT

    • Deprecate Policy.priority and ScanPolicy.failOnClusterChange.


    • CLIENT-1385 Allow async socketTimeout/totalTimeout to be specified together and enforce totalTimeout when command is in delay queue.

    • CLIENT-1386 Force volatile partition map reads when it occurs from a non cluster tend thread.

  • 4.0.3
    Release Date: November 11, 2020
    • Requires server version 4.9+.


    • CLIENT-1373 Retrofit support for old PredExp in addition to new Expressions. Both expression filters will be supported for 1 year in order to ease the transition to new Expression APIs. After that, PredExp support will be permanently removed. Also, support server version 4.9+ instead of the more strict requirement. Expression API usage still requires server

  • 4.0.2
    Release Date: November 2, 2020
    • Requires server version It's not recommended to use this client version since client 4.0.3 has more relaxed server version requirements.


    • CLIENT-1372 Do not put SocketAsyncEventArgs back into pool when preparing for normal (non-split) async batch retry. The SocketAsyncEventArgs instance is used in the retry.

  • 4.0.1
    Release Date: October 28, 2020
    • Requires server version It's not recommended to use this client version since client 4.0.3 has more relaxed server version requirements.


    • CLIENT-1370 Fix NullReferenceException in async batch that can happen when multiple retries occur.

    • Remove extraneous newline in ClusterStats ToString().

  • 4.0.0
    Release Date: October 21, 2020
    • Requires server version It's not recommended to use this client version since client 4.0.3 has more relaxed server version requirements.


    • CLIENT-1359 Replace PredExp with new Expressions. Expression filters give access to the full data type APIs (List, Map, Bit, HyperLogLog, Geospatial) and expanded metadata based filtering, to increase the power of filters in selecting records. This client requires server version See Incompatible API change.

    • CLIENT-1369 Remove legacy client code for old servers since this client now requires server version

    • CLIENT-1181 Add Log.SetCallbackStandard().


    • CLIENT-1355 Skip orphan seeds that do not have peers when other seeds have peers.

  • 3.9.14
    Release Date: August 20, 2021


    • CLIENT-1580 Allow null sessionExpiration for compatibility with older servers.

  • 3.9.13
    Release Date: July 19, 2021


    • CLIENT-1560 Relogin to node when quick node restart detected. Also, add volatile keyword to node's sessionToken.

  • 3.9.12
    Release Date: November 2, 2020


    • CLIENT-1372 Do not put SocketAsyncEventArgs back into pool when preparing for normal (non-split) async batch retry. The SocketAsyncEventArgs instance is used in the retry.

  • 3.9.11
    Release Date: October 28, 2020


    • CLIENT-1355 Skip orphan seeds that do not have peers when other seeds have peers.

    • CLIENT-1370 Fix NullReferenceException in async batch that can happen when multiple retries occur.

    • Remove extraneous newline in ClusterStats ToString().

  • 3.9.10
    Release Date: September 18, 2020


    • CLIENT-1350 Always fail server certificate validation if SslPolicyErrors exist. If SslPolicyErrors do not exist, then match tlsName with subject common name or subject alternative names.

  • 3.9.9
    Release Date: August 7, 2020


    • CLIENT-1338 Restart stopwatch in async batch retry when socketTimeout is defined and totalTimeout is not defined. Also, queue timeout just before retry execution to be consistent with initial attempt.

  • 3.9.8
    Release Date: July 20, 2020


    • CLIENT-1335 Apply lock to async batch retry logic and separate AsyncBatchExecutor from AsyncMultiExecutor.

    • CLIENT-1310 Allow ScanPolicy scanPercent to be sent for server versions >= 4.9 when scanPercent is changed from the default. Also, throw an exception if both scanPercent and maxRecords are changed from the default. scanPercent/maxRecords are mutually exclusive.

  • 3.9.7
    Release Date: July 13, 2020


    • CLIENT-1291 Allow maxSocketIdle to be set to zero (no reap). Connections retrieved from pools in transaction threads will not be checked for maxSocketIdle when maxSocketIdle is zero. Idle connections will still be trimmed down from peak connections to min connections in the cluster tend thread using a hard-coded 55 second limit when maxSocketIdle is zero.

    • Add Cluster property to AerospikeClient.

    • Add OperateListBounded test.


    • Add [Flags] attribute to all enums that are used as bit flags.

  • 3.9.6
    Release Date: May 18, 2020


    • CLIENT-1287 If a batch request to a node fails, continue processing other node responses for async batch read methods that accept a sequence listener (ExistsSequenceListener, BatchSequenceListener, RecordSequenceListener).


    • CLIENT-1289 Always send integers with size 8 bytes in wire protocol.

  • 3.9.5
    Release Date: May 8, 2020


    • CLIENT-1278 Support minimum connections.

    • Add create nested map and create nested list examples.


    • CLIENT-1279 Handle all native integer types (including short/ushort) when packing items in list/map.

    • CLIENT-1281 Prevent recursive error stack overflow for async commands.

    • Update QueryPolicy docs to mention maxRecords only supported on query with null filter.

    Known Issues

    • This client sends byte/short/int bins to the server using 1/2/4 bytes. This will cause problems when negative numbers are sent and the bin is used in a secondary index query, lua function or different language client. Fixed in version 3.9.6

  • 3.9.4
    Release Date: April 5, 2020


    • CLIENT-1170 Support partition scans. This feature requires server versions >= 4.9.

    • CLIENT-1201 Support maxRecords in scans. This feature requires server versions >= 4.9.

    • CLIENT-1202 Support creation of list/map in a CDT context. This feature requires server versions >= 4.9.

    • CLIENT-1234 Support HyperLogLog operations. This feature requires server versions >= 4.9.


    • CLIENT-1160 For single record transactions, send socketTimeout to the server instead of totalTimeout when socketTimeout < totalTimeout.

    • CLIENT-1200 Allow keys of type byte/sbyte. Optimize integer size sent to server when possible.

    • CLIENT-1218 Set compression level to BestSpeed (1) when compression is enabled.

    • Only run enterprise feature tests when using enterprise cluster.

    • Fix Replica doc comment.

    Known Issues

    • This client sends byte/short/int bins to the server using 1/2/4 bytes. This will cause problems when negative numbers are sent and the bin is used in a secondary index query, lua function or different language client. Fixed in version 3.9.6

  • 3.9.3
    Release Date: February 20, 2020


    • Do not zero socket SendBufferSize and ReceiveBufferSize on Unix or MacOS platforms.

    • In nuspec file, target net452 instead of net to fix warning.

    • Simplify compress policy online doc.

  • 3.9.2
    Release Date: December 5, 2019


    • CLIENT-1156 Support compressed commands and responses. This feature requires Enterprise Server versions >= 4.8.

    • CLIENT-1161 Use new sindex-exists info command when checking for DropIndex task completion.

    • Add IRecordSet and IResultSet derived interfaces for easier usage within mocking libraries.

    • Clarify when to make scan callbacks thread-safe in scan examples.

    • Document that Statement instance is not suitable for reuse between method calls because it's modified inside query methods.

    • Add icon to nuspec file.


    • CLIENT-1162 Update connection lastUsed after command's last socket read instead of command end.

    • Fix online docs so DateTime uses months that start at 1.

    • Call AuthenticateAsClient on .NET Core.

    • Add TestCategory attribute when running .NET Core tests.

  • 3.9.1
    Release Date: October 2, 2019


    • CLIENT-1129 Add total opened/closed connection counts per node to cluster statistics.


    • CLIENT-1128 Move QueryPolicy recordsPerSecond field to Statement in order to add support for background queries (via Execute()).

    • Remove client support for bit operations on nested list/maps because the server will not support this functionality in the near future.

  • 3.9.0
    Release Date: September 24, 2019


    • CLIENT-1120 Support predicate expressions for all transactions. This feature requires server versions >= 4.7.

    • CLIENT-1123 Support delete record operation in Operate(). This feature requires server versions >= 4.7.

    • CLIENT-1127 Support write operations in background scan/query. This feature requires server versions >= 4.7.

    • CLIENT-1128 Support ScanPolicy recordsPerSecond field to limit scan throughput. This feature requires server versions >= 4.7.

    • CLIENT-1132 Support binary serialization in .NET Core.

    • Target .NET Core client library to .NET Standard 2.0.


    • CLIENT-1119 Do not verify record digest in batch read as it's redundant.

    • CLIENT-1133 Allow error code to be empty when parsing info command errors. Also, change info command default error code to generic server error (1).

    • Fix documentation result for BitOperation.get().

  • 3.8.2
    Release Date: August 9, 2019


    • CLIENT-1115 Support bitwise operations. This feature requires server versions >= 4.6.

    • CLIENT-1116 Support nested CDT operations. This feature requires server versions >= 4.6.

    • CLIENT-1118 Support mixed security modes in cluster to enable rolling upgrade with security changes.


    • Declare AerospikeException.SetInDoubt() as internal.

  • 3.8.1
    Release Date: June 28, 2019


    • Add policy socketTimeout, totalTimeout and maxRetries to exception messages when available.

    • TOOLS-1342 Support write only (write) privilege for user roles. This feature requires Aerospike Enterprise Server 4.6.

    • TOOLS-1343 Support IP address whitelist functionality for user roles. This feature requires Aerospike Enterprise Server 4.6.

    • Expose client policies from IAerospikeClient interface.

    • Expose Cluster and NodeAddress from Node.


    • CLIENT-1077 Perform retry when current node has exhausted all connections.

    • CLIENT-1078 For replica PREFER_RACK, do not retry on same node where command failed if a fallback node exists on any rack.

    • CLIENT-1089 Use first valid seed node when iterating through seeds on cluster initialization. That seed node will provide the other peer nodes in the cluster.

  • 3.8.0
    Release Date: March 28, 2019


    • CLIENT-1059 Use stack based connection pools for more aggressive trimming of idle connections.

    • CLIENT-1068 Support new relaxed read modes for SC namespaces.

    • Replace linearizeRead boolean with ReadModeSC enum. See Incompatible API change.

    • Rename Policy consistencyLevel to readModeAP.

    • Extract interface IAsyncClient from AsyncClient for better extensibility. Enchancement provided by akovalov.

    • Add ClusterStats.ToString().

    • Add readModeAP and readModeSC arguments to benchmarks.


    • Async Socket SendBufferSize/ReceiveBufferSize should not be set to zero on MacOS.

    • Do not retry on error code NO_MORE_CONNECTIONS.

    • Change MS nuspec file to use new license tag.

  • 3.7.0
    Release Date: February 4, 2019


    • CLIENT-1057 Conform to server fallback and retry behavior specification.

    • CLIENT-1055 Add iteration and node to more AerospikeException messages.

    • AER-6009 Support new server "truncate-namespace" info command.

    • Default socketTimeout to 30 seconds for all commands.

    • Remove old deprecated Statement Filters property. Use Filter property instead. The server accepts only one filter. See Incompatible API change.

    • Remove "Value.UseDoubleType" global variable. Always use server double type to store floating point values.

    • Remove "ClientPolicy.requestProleReplicas". Replicas will always be requested.

    • Remove all unused old batch direct protocol code.


    • CLIENT-1053 Do not clear partition map entry when a node reports that it no longer owns that partition entry. The client will now wait until another node claims ownership of that partition with the proper regime. This is done to remove any possible gaps in node ownership.

    • CLIENT-1056 If batch read transaction fails on a node, retry batch keys from that node to other nodes when replica policy is SEQUENCE and maxRetries is not exceeded.

    • Use custom BufferedConnection that calls Poll() before every socket read, so tight timeouts can be enforced on batch reads.

    • Fix GetNode() to return master node on write operations when chosen replica is not the default.

  • 3.6.8
    Release Date: November 27, 2018


    • AER-5957 Support rack aware clients.

    • AER-5955 Support truncate info command argument "lut=now" for servers that require it.

    • AER-5945 Add INFINITY and WILDCARD values for use in CDT map/list comparators.

    • CLIENT-1049 Provide more descriptive error message when namespace can't be found in partition map.


    • Fix docs to note that the server executes operations in the same order as the operations array in Operate() call.

    • Remove the ability to force old batch direct protocol on the client because the server will be removing support for the old batch direct protocol. See Incompatible change.

    • Remove unused error codes.

    • Change admin message version to 2.

  • 3.6.7
    Release Date: October 3, 2018


    • Support running an aggregation query with lua code in a string. See "QuerySum.cs" example.


    • CLIENT-1036 Give more descriptive messages for all exceptions.

    • CLIENT-1038 Throw InvalidNode exception instead of returning random node when master and prole nodes are unavailable for AP mode (now consistent with SC mode).

    • CLIENT-1040 Add descriptive error messages to InvalidNode exception.

    • Log info message when regime < old regime.

    • Fix KeyNotFoundException in "NodeValidator.SetAddress()".

  • 3.6.6
    Release Date: July 31, 2018


    • AER-5892 Support ListWriteFlags, NO_FAIL and PARTIAL. Add MapWriteFlags which includes NO_FAIL and PARTIAL. This feature requires server versions >=

    • Support cluster statistics for connection and thread pool usage.


    • Set socketTimeout to totalTimeout when totalTimeout > 0 and socketTimeout is zero for both sync and async commands.

    • Disable Interlocked with volatile variable warning in projects.

  • 3.6.5
    Release Date: June 18, 2018


    • CLIENT-1024 Support scan/query consistency validation using cluster key. Set failOnClusterChange to true in ScanPolicy/QueryPolicy to enable this validation.

    • CLIENT-1020 Add QueryList example.

    • Support list/map nearest key/value get/remove operations.


    • CLIENT-1019 Disable load balancer detection if server does not support "service-clear-std" info command. This will allow client to work with old server versions. Also, continue with original seed if server's return IP address is invalid (probably internal cloud IP address).

    • In query, always return all bins if binNames array is empty.

  • 3.6.4
    Release Date: May 21, 2018


    • CLIENT-1011 Support cluster seed that is a load balancer.

    • Add new info request which takes a list of info requests.

    • Add CDT map value list range example.


    • Make AssemblyVersion the same as AssemblyFileVersion.

    • Change default socket idle timeout for scan/query to 30 seconds.

    • Authentication mode property is now case-insensitive.

    • Improve ConsistencyLevel online doc.

  • 3.6.3
    Release Date: April 20, 2018


    • Support authentication mode (ClientPolicy.authMode). When user authentication is enabled, the mode specifies internal server authentication or external (LDAP etc) authentication.

    • Support separate login timeout (ClientPolicy.loginTimeout) when authentication is enabled.

    • Support TLS specifically for logins (TlsPolicy.forLoginOnly) in addition to full TLS. If enabled, TLS will be used for login and clear sockets will be used for transactions.


    • CLIENT-1005 Send socket timeout to server for queries that do not have a filter (effectively a scan).

  • 3.6.2
    Release Date: March 16, 2018
    • If using the security feature with Aerospike Enterprise Edition Server 4.6 or later, this version is not compatible -- please upgrade to Aerospike C# Client version 3.6.3 or later.


    • Handle list extension type returned by server on sorted list operations.

    • Default "AerospikeException.resultCode" to generic "ResultCode.CLIENT_ERROR" instead of zero.

  • 3.6.1
    Release Date: March 5, 2018
    • If using the security feature with Aerospike Enterprise Edition Server 4.6 or later, this version is not compatible -- please upgrade to Aerospike C# Client version 3.6.3 or later.


    • Support LDAP authentication.


    • Add list Set() operation with ListPolicy argument.

    • Do not send ListOrder argument on list Append() and list Increment() because these operations are not valid for ordered lists.

    • Fix list Increment() argument passing.

  • 3.6.0
    Release Date: February 15, 2018


    • Upgrade Aerospike .NET Core solution to Visual Studio 2017. Older Visual Studio versions are no longer supported for .NET Core. The Aerospike .NET Framework solution still supports Visual Studio 2010 or greater.

    • Move AerospikeClient source code back into .NET Framework and link from .NET Core.

    • Add new list and map operations.

    • Return IndexTask from DropIndex().

    • Enhance AerospikeDemo benchmarks.

      • Support batch reads.
      • Support alternate latency display format.
      • Support latency summary when benchmarks end.
      • Support throughput (tps) limit for sync benchmarks.


    • Prevent rogue node from taking ownership of a partition previously owned by legitimate strong consistency node.

    • Remove enterprise requirement in truncate docs.

  • 3.5.3
    Release Date: January 12, 2018


    • Add inDoubt to AerospikeException. inDoubt indicates if a write command may have completed even though an exception was thrown. This scenario can occur on a client timeout for a command that has been sent to the server.

  • 3.5.2
    Release Date: December 14, 2017


    • Add new async "MaxCommandAction.DELAY" mode. This mode limits the number of concurrent async commands to be executed, but allows new commands to be queued for later execution. Unlike "MaxCommandAction.BLOCK", "MaxCommandAction.DELAY" does not block the current thread when waiting for a new command slot. Thanks to Fabien Barbier for the enhancement!

  • 3.5.1
    Release Date: December 7, 2017


    • Replace BlockingCollection with ConcurrentQueue where possible.

    • Disable retries by default for writes.

    • Use read defaults (maxRetries = 2) on operate calls when the policy is null and all operations are reads.

    • Set query idle socket_timeout default to 10 seconds.

    • Make SERVER_NOT_AVAILABLE a client generated error.

    • Use PARTITION_UNAVAILABLE for server error code 11.

  • 3.5.0
    Release Date: November 13, 2017


    • Policy rewrite. See Incompatible API change for more details.

    • Split Policy timeout into socketTimeout and totalTimeout.

    • Changed Policy replica default to Replica.SEQUENCE.

    • Changed Policy maxRetries default to 2.

    • Removed Policy retryOnTimeout. If a transaction timed out on socketTimeout, retries will now occur until maxRetries is exceeded or totalTimeout is reached.

    • CLIENT-890 Try different node when the current node fails.

    • Support Strong Consistency mode for servers that also support Strong Consistency mode.

    • Support CDT list increment operation.


    • CLIENT-938 Throw exception in CreateIndex() when index already exists. Also, throw exception in DropIndex() when index does not exist. See Incompatible change.

    • CLIENT-933 Client does not always revert to seeds when entire cluster is unreachable. Fix by reverting to seeds after all node info requests fail 5 consecutive times (5 seconds) regardless of cluster size.

    • CLIENT-930 Remove LDT client methods. Large data types have been deprecated on the server.

    • Do not allow nodes into cluster until node partition maps are fully initialized (partition-generation != -1).

    • In WaitTillStabilized(), replace timeout with max cluster tend iterations (3).

    • Add copy constructors for policy classes that did not have them.

    • Rename ResultCode NO_XDS to ALWAYS_FORBIDDEN.

  • 3.4.5
    Release Date: October 23, 2017


    • Support "QueryPolicy.includeBinData". Default is true.


    • Fix NeoLua dependency version at exactly "0.9.14" in nuget specification. AerospikeClient only works with this version.

  • 3.4.4
    Release Date: June 16, 2017


    • Target .NET Standard 1.5. Thanks to Brian Williams for the fix.

    • Enable retry logic for async batch commands. Thanks to windsnow98 for the fix.

    • Only set "peers.genChanged" to true when peers protocol is supported by the server.

    • Handle polling tasks with a timeout the same way as a no-timeout task.

  • 3.4.3
    Release Date: May 23, 2017


    • CLIENT-891 Propagate batch read consistencyLevel to sub-transactions.

    • AER-5650 Fixed PredExp.GeoJSONValue().

    • Return key not found exception (instead of returning null record) for UDF Execute() or Operate() command where operations include a write. This is done to be consistent with other writes (Put(), Add()…) when key is not found.

    • In cluster tend, set node’s new peers generation only if all referenced peers are added to the cluster.

    • In ExecuteTask, task is now not considered complete when the task is not found.

    • Change BaseTask.IsDone() to re-request status after delay when “not found” status is returned.

    • Always issue asynchronous batch node requests in parallel.

    • Add retry for connection timeout. Thanks to windsnow98 for the fix.

    • Add optimization to project.json. Thanks to windsnow98 for the fix.

    • Merge async RetryOnInit() and RetryAfterInit() into ConnectionFailed().

    • Catch async exception if OnFailure() fails.

  • 3.4.2
    Release Date: April 4, 2017


    • CLIENT-865 Add predicate expression function PredExp.RecDigestModulo().

    • CLIENT-869 Support configurable scan socket write timeout on server side (ScanPolicy.socketTimeout).


    • CLIENT-878 Fix node reconnect failure after cluster-wide restart.

    • Remove unnecessary Register() from PredExp example.

  • 3.4.1
    Release Date: March 15, 2017


    • Support query filtering with predicate expressions. Requires Aerospike Server versions >= 3.12.

    • Support new truncate namespace/set functionality. Requires Aerospike Server versions >= 3.12.

    • Support multiple connection pools per node to reduce contention on machines with large number of cpu cores.


    • Add/Use Statement.SetFilter() because the old SetFilters() only allowed one filter.

  • 3.4.0
    Release Date: January 31, 2017


    • Support .NET Core 1.1.

  • 3.3.2
    Release Date: January 9, 2017


    • Mark LDT functionality as deprecated.


    • CLIENT-813 Authenticate user in security mode if tend connection fails and a new tend connection is created.

    • Verify Policy.scanPercent > 0 and <= 100.

  • 3.3.1
    Release Date: November 16, 2016


    • Support TLS serial number exclude list.

    • Support TLS search "subject alternative names" in addition to certificate names.

    • Support TLS mutual authentication.


    • NullValue is now cached to avoid unnecessary object instantiations and improve performance.

    • Remove methods that have been deprecated for over a year.

  • 3.3.0
    Release Date: October 4, 2016


    • Support TLS 1.2 secure socket protocol. Dependent on future Aerospike Server release.

    • Support IPv6 socket protocol. Dependent on Aerospike Server 3.10+.

    • Support cluster-name verification. Dependent on Aerospike Server 3.10+.

    • Support new peers info protocol. Dependent on Aerospike Server 3.10+.

    • Support durable deletes. Dependent on Aerospike Server 3.10+.

    • Support retryOnTimeout policy field.

    • Support "Replica.SEQUENCE" for single record reads.


    • Always use master node for record UDF calls.

    • Fix parsing of empty map bins.

    • Use TrySetException instead of SetException in async task ListenerAdapter. Fix provided by jholovacs.

    • Handle case where multiple nodes go down simultaneously, but still protect against split brain rogue node.

    • Perform async single record retries by cloning async command.

  • 3.2.4
    Release Date: July 13, 2016


    • Allow AerospikeClient to be mocked in unit tests.


    • Do not peek for map extension type when map is empty.

    • Use parse error when appropriate.

  • 3.2.3
    Release Date: June 8, 2016


    • Support new server map operations. Requires Aerospike Server version 3.8.4 and above.

    • Add AerospikeClient.RegisterUdfString() to register lua functions contained in a string.

    • Use server double particle type for double by default.


    • For single node cluster, drop node if 5 consecutive info requests fail without checking for seeds. Seeds will be checked in next cluster tend iteration.

    • Avoid stomping AdminCommand buffer when opening new connections for enterprise administration commands.

  • 3.2.2
    Release Date: April 13, 2016


    • Add GeoWithinRegion(), GeoWithinRadius() and GeoContains() query filter methods with IndexCollectionType argument.

    • Add QueryGeoCollection example.


    • Fix BaseTask.Wait() when index has already been created.

    • Skip over unknown type extensions in Unpacker.

    • xorshift128+ algorithm has changed slightly.

  • 3.2.1
    Release Date: March 3, 2016


    • Rework NodeValidator to handle all edge cases.

    • Ensure connection is closed if NodeValidator returns a duplicate node.

    • Catch connection failure and decrement connectionCount.

  • 3.2.0
    Release Date: February 26, 2016


    • Rename ClientPolicy maxThreads to maxConnsPerNode. See Incompatible API change.

    • Enforce maxConnsPerNode as a hard limit. Return new result code NO_MORE_CONNECTIONS if this limit would be exceeded.

    • Use separate connection for tend thread to guarantee a tend connection.

    • Reduce result codes that require closing of socket.

    • Support GeoJSON in list/map.

    • Remove methods that have been deprecated for over one year.


    • CLIENT-590 Pass in set name for batch reads when BatchPolicy.sendSetName is true.

    • Do not test LDT if server has disabled LDT.

    • Use ClientPolicy.timeout for connection timeout when refreshing nodes in cluster tend.

  • 3.1.7
    Release Date: January 28, 2016


    • Support list operations (ListOperation) that can be used in client Operate(). Requires Aerospike Server versions 3.7 and above.

    • Support geo-spatial queries. Requires Aerospike Server versions 3.7 and above.

    • Support ScanPolicy.includeLDT flag. If includeLDT is true, LDT data structures will be returned on scan. The default remains false.

    • CLIENT-629 Support "services-alternate" info request during cluster tend.

    • CLIENT-623 Support set/get properties in Statement class.


    • Use async buffer pool that contains a single large byte array with byte segments allocated to each async command. This was done to reduce the effects of memory pinning because only one single byte array is being pinned. Also, the large byte array will be placed on the LOH (large object heap) which is not compacted by default.

    • Task Wait()/QueryIfDone() no longer treats error conditions as done. Instead, the error is stored and the status request is retried until timeout. If timeout, the last error is thrown as an exception.

    • Move RandomShift from AerospikeDemo to AerospikeClient. Generate default task ids using RandomShift instead of timestamp.

  • 3.1.6
    Release Date: November 6, 2015


    • Change ClientPolicy.maxSocketIdle default to 55 seconds.


    • Check for null in LargeList.exists().

    • IsConnected() now returns false when all nodes haven't responded to cluster tend requests for 5 consecutive iterations (usually 5 seconds).

    • Dispose of CancellationTokenRegistration when done with async task.

    • Fixed Async UDF example.

  • 3.1.5
    Release Date: September 8, 2015


    • Added LargeList.Exists().


    • Check for exception in RecordSet cancellation.

    • For "jobs" info command used to track scan/query jobs, handle both old and new server formats.

    • Override ttl, so tests will work regardless of default-ttl configuration on the server.

    • Support message pack format specification additions in list/map deserializations.

    • Added ability to bypass form prompt in AerospikeTest. Do not prompt with form by default.

  • 3.1.4
    Release Date: July 31, 2015


    • Support new server double data type. This functionality requires Aerospike Server versions >= 3.6.0 and is currently disabled by default. See More Information.

    • Use jobs info command for ExecuteTask wait.

    • Added extra information to async timeout exception.

    • Added Value.GetFromRecordObject().

    • Added unit tests.

    • Support asynchronous query and execute.


    • Send original key (with namespace/set) back to sequence listeners in asynchronous batch.

  • 3.1.3
    Release Date: June 26, 2015


    • Support new batch index protocol which allows multiple namespaces, bin name filters, and read types (read, exists) to be specified in a single batch call. This new functionality is supported by Aerospike Server versions >= 3.6.0 (which has not been released yet). The old batch direct protocol is still supported for compatibility with older servers.

    • Added Record.TimeToLive which converts server absolute time back to expiration ttl.

    • Implement Equals on every extended Value class.

    • Implement GetHashCode and Equals on Bin, Value and Filter.

    • Ignore sleepBetweenRetries when in async mode.

    • Change ClientPolicy.failIfNotConnected default to true.

    • Limit ClientPolicy.maxSocketIdle to 24 hours.


    • Check for null in ByteUtil.BytesToHexString().

    • Check for zero-sized arrays and call onSuccess() in async batch get.

    • AER-3648: Handle duplicate node-ids caused by multiple ethernet interfaces.

    • Transfer timeout from command to future task.

  • 3.1.2
    Release Date: April 27, 2015


    • Support distributing read commands over replicated nodes in addition to master node. See "ClientPolicy.requestProleReplicas" and "Policy.replica". This functionality is disabled by default and can be enabled by users if using Aerospike server versions >= 3.5.9.

    • Added new LargeList methods which are supported by Aerospike server versions >= 3.5.8.

    • Replaced configuration userModule/createModule with LargeList.setPageSize().

    • Removed unnecessary LargeList getCapacity() and setCapacity().

    • Support new data-admin security role for use in server's enterprise edition.

    • Show node in timeout exception.


    • Do not close AsyncWaitHandle because the disposed handle can be referenced after the exception is thrown. The handle will eventually get closed by the garbage collector.

    • If the call to onSuccess() generates an exception in async mode, call onFailure(). This is important in cases where user's code is waiting for a completion notification which wasn't yet called in onSuccess().

  • 3.1.1
    Release Date: March 27, 2015


    • Added Task based methods to AsyncClient.

    • Added Record.getString(name).

    • Added Bin constructors for list/map. Previous code that wrote list/map bins with the default object constructor may now need to be modified to preserve previous behavior. See Incompatible API change.

    • Only optimize Util.ByteArrayEquals() when AS_OPTIMIZE_WINDOWS is enabled.

    • Make it easier to detect async command state when a node is removed from the cluster (which causes node's connections to be closed).

    • Remove LITE conditional statements which are no longer necessary.


    • Check all nodes before shutting down benchmarks when receiving benchmark errors.

    • Throw exception if bin name length > 14 characters on query.

  • 3.1.0
    Release Date: March 12, 2015


    • Replaced old unmanaged LuaInterface Lua interpreter (written in C) with a fully managed NeoLua Lua interpreter (written in C#). Since NeoLua uses the Lua 5.3 specification, slight code modifications may be necessary in your aggregation queries. Incompatible API change.

    • Removed AerospikeLite solution because it is no longer necessary. The default Aerospike solution is now fully managed.

    • Added capability to load Lua scripts from a resource.

    • Added new query methods that take in an "Action" callback argument.

    • C# clients are now available on NuGet.


    • Make mismatched batch digests an error condition.

  • 3.0.14
    Release Date: February 20, 2015


    • Optimize number/byte conversions.


    • Ensure query threads are initialized before threads are aborted when a query initialization exception occurs.

    • Remove zero size packet exception and keep processing query/scan. The server will eventually send the finish notification.

    • Support batch get when allowProleReads is true.

  • 3.0.13
    Release Date: February 9, 2015


    • Support secondary indexes on bins containing a collection.

    • Support new server error codes.

    • Support user-defined roles with namespace/set scoping. Rename UserRoles to User.

    • Send key on both reads and writes when "Policy.sendKey" is true.


    • Server has been handling NOBINDATA flag correctly for a long time on read record header, so remove old workaround code.

    • Check if server enabled LDT before running LDT examples.

    • Make receiving a zero-sized data packet from server an error condition which results in a socket close.

    • Fix user key send buffer byte size calculation.

    • Check for null before performing client join.

  • 3.0.12
    Release Date: December 5, 2014


    • Support large list remove range.

    • Support read consistency level policy.

    • Support transaction commit level write policy.

    • Support double/float on client-side. Server will store these values as longs.

    • Implement IDisposable in AerospikeClient, RecordSet and ResultSet so the using statement can be used.

    • Use xorshift128plus algorithm to generate random values in benchmarks.


    • Validate that value type can be used as a key.

    • Separate large collection userModule into createModule and filterModule.

  • 3.0.10
    Release Date: November 19, 2014


    • Add "Debug IIS" and "Release IIS" configuration targets. These IIS targets use HttpContext to store reusable buffers (instead of using ThreadStatic).

    • Change "Policy.maxRetries" default from 2 to 1.

    • Change scan/query maxRetries value to zero in default constructor (used to be changed in transaction code).

    • Removed deprecated RecordExistsAction generation enum values. Use "WritePolicy.generationPolicy" instead.

    • Add udf methods that take WritePolicy (instead of base Policy) as an argument, so ttl can be specified.

    • Add LargeMap.exists().


    • Do not interrupt thread on scan and batch cancels.

    • Cancel token only once on query.

    • Filter out unreferenced bins in async batch.

    • Send user key in multi-operation call if set in write policy.

    • Fix LargeSet.exists().

  • 3.0.9
    Release Date: October 31, 2014


    • Use CancellationToken for queries instead of Thread.Interrupt().

    • Create generic thread Executor class which is used by synchronous scan, batch, and udf execute.


    • Fix aggregation query race condition.

    • Filter out null keys on aggregation queries.

    • Close lua instance if not able to put back into pool.

  • 3.0.8
    Release Date: October 23, 2014


    • Change taskId from int to long. Generate taskId if not set.

    • Always send taskId on queries. Set taskId on scans too.

    • Support more server error codes.

    • Try seeds when single node cluster stops responding to info requests.

    • Retrieve partition-generation at the same time as replicas-master.


    • Fix BlobValue.Pack() method.

    • Handle record not found case in large collection size() and getCapacity().

    • Detect "split cluster" case where this node thinks it's a 1-node cluster.

  • 3.0.7
    Release Date: September 25, 2014


    • Batch performance improvements.

    • Add BatchPolicy. Run batch requests in sequence on transaction thread when BatchPolicy.maxConcurrentThreads = 1.

    • Add large list update().

    • Large list find() now returns null when requested record or item entry does not exist. Previously, an exception was thrown.

    • Add Record integer conversion methods.

    • Support new server error codes.


    • Unblock query threads when caller calls close before all records have been read and the queue is full.

    • Calculate send user key size when sendKey is enabled.

    • Return immediately if batch keys length is zero.

  • 3.0.6
    Release Date: August 28, 2014


    • Support key storage/retrieval functionality. Note that "Key.userKey" field type has changed from "Object" to "Value".

    • Store default policies in client so they don't have to be instantiated on each command.

    • Support new lua bytes library.

    • Make cluster tend interval configurable.

    • Add Remove() to LargeMap.

    • Add server side existence check example.


    • Fix bin name filters when running query without additional filters.

    • Check if task has already completed before querying servers for status.

    • Propagate error message when query aggregation fails.

    • Parse info response for errors.

    • Fix read/write percentage calculation in demo application.

  • 3.0.5
    Release Date: July 24, 2014


    • Support user/role administration and authentication with enterprise servers.

    • Add AerospikeAdmin application to manage users.

    • Add AerospikeLite solution which does not include Lua interpreter. AerospikeLite is a fully managed solution while Aerospike contains an unmanaged DLL (Lua interpreter).

    • Support x86 (32-bit) and x64 (64-bit) compile targets.

    • Use IList<object>/IDictionary<object,object> instead of List<object>/Dictionary<object,object> in large collection API.

    • Add Record.ToString().

    • Add AerospikeClient.Join() methods.

    • Add LargeList example.


    • Check for null in log enabled methods.

    • Fix estimated length calculation in udf calls.

  • 3.0.4
    Release Date: May 16, 2014


    • Support Policy.allowProleReads in synchronous batch operations.


    • Use more efficient algorithm to determine if all scan/batch/query threads have completed.

    • Add new result codes. Keep connection on more errors than before.

  • 3.0.3
    Release Date: February 14, 2014


    • Use thread pool for batch, scan and query commands.


    • Removed dependency on msgpack library.


    • Move EXPECT_GEN_EQUAL, EXPECT_GEN_GT from RecordExistsAction to GenerationPolicy.

    • Throw exception when running scan/query and the cluster is empty.

    • Put connection back into pool for some error codes.

    • Give more detailed error message when UDF registration fails.

    • Handle new createIndex and dropIndex error codes.

    • Update license and copyright message.

  • 3.0.2
    Release Date: January 10, 2014


    • Allow records to be set to NO EXPIRE via sending -1 TTL. Requires server 2.7.4+ or 3.1.10+.

    • Created user configurable benchmarks.

    • Added Operate and QueryFilter examples.


    • Do not sleep if maxRetries has been reached or the transaction would timeout after sleepBetweenRetries is applied. Instead, timeout immediately. Also, never sleep if sleepBetweenRetries is zero.

  • 3.0.1
    Release Date: December 12, 2013


    • Optimize asynchronous performance.

    • Support automatic retry for asynchronous commands.

    • Use near contiguous buffer pool for asynchronous commands.

    • Use single thread-local buffer for both socket send and receive for synchronous commands.

  • 3.0.0
    Release Date: November 20, 2013


    • Introduced AerospikeClient.

    • Full support for Aerospike 3 servers. - User-Defined Functions (UDFs). UDF code is written in the Lua programming language. - Secondary index queries. - Secondary index queries with UDF aggregations. - Secondary index query/UDF execute. - Large Data Types (LDT) which allow the creation/management of a collection within a single bin.

    • Continued full support for Aerospike 2 servers.

    • Introduced AsyncClient. The client package now supports both synchronous (AerospikeClient) and asynchronous (AsyncClient) operations.

    • Enhanced node dunning methodology.