Couchbase Java SDK Release Notes and Archives
Installation
At least Java 7 is required for current releases; all newer, vendor supported Java versions are supported (and encouraged). See the Compatibility section for details. Java 8 or later is recommended since it brings performance enhancements and lambda expressions which are very convenient when using the asynchronous API.
Version 2.6 and earlier support Java 6, though some transitive dependencies are no longer supported by those projects and have known security issues.
All stable releases of the Java SDK are primarily distributed through Maven. As a result the dependency can be included easily using your favorite package manager. For Maven itself, the current GA release’s coordinates are:
<dependencies>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>java-client</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
The java-client dependency will pull in two more transitive dependencies. One is called com.couchbase.client.core-io and is an internal dependency which performs all the underlying tasks like IO and cluster management. The other dependency is RxJava which is both used internally and exposed as a first-class API to the user in order to perform scalable and performant asynchronous, reactive operations.
Version 2.7.2 (5 December 2018)
Version 2.7.2 is the third release of the 2.7 series, bringing new features, enhancements, and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.7.2
-
com.couchbase.client:core-io:1.7.2
-
io.reactivex:rxjava:1.3.8
-
io.opentracing:opentracing-api:0.31.0
Enhancements & New Features
-
JCBC-1254: Adds experimental utility API to ingest Analytics query results back to KV layer.
-
JCBC-1258: Adds experimental support for deferred Analytics query execution. This is useful for long running queries where the results can be fetched later.
-
JCBC-1171: Allows to add hints for hash and nested loop joins in N1QL query DSL.
-
JCBC-1266: You can now compile with Java 11, which contains minor javadoc fixes.
Fixed Issues
-
JVMCBC-579: Fixes the Response Time Observability threshold logging to use descending order instead of ascending as mandated in the sdk-rfc.
Version 2.7.1 (6 November 2018)
Version 2.7.1 is the second release of the 2.7 series, bringing new features, enhancements, and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.7.1
-
com.couchbase.client:core-io:1.7.1
-
io.reactivex:rxjava:1.3.8
-
io.opentracing:opentracing-api:0.31.0
A special note for this release, the Jackson databind dependency has been upgraded to version to 2.9.7 for security updates. As the newer Jackson dependency uses Java 7 language features and older Java 6 compatible versions are no longer maintained, the SDK is no longer compatible with Java 6. Couchbase prefers to make such platform changes in minor releases, but is applying the change here given the nature of the issue and that the semantic versioning standard does allow for a dependency update.
Enhancements & New Features
-
JCBC-1253: Adds support for Sub-Document operation expansion of macro in extended attributes. This is intended for internal use for other dependent Couchbase libraries.
-
JCBC-1259: Exposes async cluster interface from cluster similar to the bucket interface behavior.
-
JVMCBC-581: Updates Jackson dependency to 2.9.7.
-
JCBC-1251: Allows to select "DISTINCT RAW" in N1ql dsl.
Fixed Issues
-
JVMCBC-579: Fixes the Response Time Observability threshold logging to use descending order instead of ascending as mandated in the sdk-rfc.
-
JCBC-1255: Allows crypto transcoder to also transcode docs with no encryption requirements.
Version 2.7.0 (2 October 2018)
Version 2.7.0 is the first release of the 2.7 series, bringing new features, enhancements, and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.7.0
-
com.couchbase.client:core-io:1.7.0
-
io.reactivex:rxjava:1.3.8
-
io.opentracing:opentracing-api:0.31.0
Enhancements & New Features
The major enhancements are:
-
Committed Analytics query interface using official endpoint for querying and direct endpoint for keep alives rather than the proxying, which is more performant.
-
Additional configuration capabilties in Bucket Settings builder with better defaults.
-
JVMCBC-571: Switched to the official endpoint for querying Analytics service (from /query/service to /analytics/service).
-
JVMCBC-575: Expose HTTP Status code as part of Search response for java-client to act on it.
-
JVMCBC-576: Allow to override the TLS protocol version used, for example TLS 1.2 must be forced in Java 7.
-
JVMCBC-569: Switched to the new performant endpoint for Analytics service keep alive requests (from /analytics/version to /admin/ping).
-
JVMCBC-572: Add the document key to the span as tag if log redaction is not enabled.
-
JCBC-1244: Expose the count of processed objects returned in the Analytics query metrics.
-
JCBC-916: Allow to configure ejection/eviction policy on bucket settings.
-
JCBC-1245: Add better defaults in BucketSettings for RAM Quota and not requiring bucket password (for use with RBAC).
-
JCBC-1195: Allow to configure different compression modes (off/active/passive) on bucket settings.
-
JCBC-1232: FTS now honors the memory quota specified and responds with status code 429 if the quota is full. Add exponential backoff and retry the query in such a failure.
-
JCBC-1248: Transparently retry certain retryable error codes as identified by sdk-rfc for Analytics queries.
Fixed Issues
-
JVMCBC-566: Signals on refresh intervals would be sent to both carrier and http refresher, which is a Noop in http refresher. Limit the refresh signals only to the carrier refresher.
-
JVMCBC-567: OnDemand service connections can still be in connected state when the service is removed. Fix the disconnect logic to be similar to pooled service.
-
JVMCBC-565: Half open http config stream can go undetected. Update to proactively fetching config from http configuration provider similar to carrier refresher on refresh signals. This handles the half open connection state in a less penalizing way than recreating a connection on idle timeout.
Version 2.6.2 (4 September 2018)
Version 2.6.2 is the third release of the 2.6 series, bringing new features, enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.6.2
-
com.couchbase.client:core-io:1.6.2
-
io.reactivex:rxjava:1.3.7
-
io.opentracing:opentracing-api:0.31.0
Enhancements & New Features
-
JCBC-1227: The pretty option is now configurable for analytics queries.
-
JCBC-1229: Support for parameterized queries has been added for analytics.
-
JCBC-1246: Support for the analytics priority param has been added.
-
JCBC-1233, JCBC-1234, JCBC-1235: various smaller enhancements overall to improve the analytics experience.
Fixed Issues
-
JCBC-1226: Fixes a NullPointerException if AnalyticsParams is not properly initialized.
-
JVMCBC-564: During rebalance, an issue has been fixed where the SDK would connect to a KV service earlier than it should, leading to errors and failed operations during rebalance. With this fix applied, especially when performing rebalance-in scenarios on memcached buckets, this problem will go away. Note that couchbase buckets are not as affected since the gradual vbucket (partition) movement prohibits sending operations to non-ready nodes.
Version 2.6.1 (23 July 2018)
Version 2.6.1 is the second release of the 2.6 series, bringing new features, enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.6.1
-
com.couchbase.client:core-io:1.6.1
-
io.reactivex:rxjava:1.3.7
-
io.opentracing:opentracing-api:0.31.0
Enhancements & New Features
-
JVMCBC-552: Improve ring buffer diagnostics. The diagnostic information about the\ requests contained in the ring buffer will be useful for debugging and adjusting configuration on backpressure exception.
Fixed Issues
-
JVMCBC-556: Allow to distinguish between nodes on the same physical host with different ports
-
JCBC-1223: 2.6.0 release introduced a bug on the async persistence API where a timeout of O will be applied if there was no timeout specified and this would cause timer to fire quickly leading to timeout exception. Fixed the behavior to be similar to previous releases.
-
JVMCBC-560: Nodes can temporarily go to service degraded state while increasing the connection pool. If the node exclusively provides query/analytics service, there might be an incorrect node disconnected event on the event bus. Fixed by not marking node as disconnected if service is degraded.
Known Issues
-
JCBC-1226: A regression has been found in 2.6.0 which will be addressed in 2.6.2: When using the analytics API without explicit params, a NullPointerException is raised (i.e. bucket.query(AnalyticsQuery.simple("myquery"));). As a workaround, please specify empty params explicitly: bucket.query(AnalyticsQuery.simple("myquery", AnalyticsParams.build()));
Version 2.6.0 (5 July 2018)
Version 2.6.0 is the first release of the 2.6 series, bringing new features, enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.6.0
-
com.couchbase.client:core-io:1.6.0
-
io.reactivex:rxjava:1.3.7
-
io.opentracing:opentracing-api:0.31.0
Enhancements & New Features
-
JCBC-1159, JCBC-1160: A new feature called "per operation tracing" has been introduced in pre-releases and is now a stable and supported feature. Please see the corresponding documentation and blog posts for more information and usage. To provide a flexible and extensible implementation we are now also depending on the opentracing-api dependency for this. This allows you to plug in your own tracer (like jaegertracing or commerical products) as well.
-
JCBC-1169, JCBC-1170: Support for Field-Level Encryption has been added to the SDK. This only works in combination with a separate library which can be found on maven central as well but can only be used with a Couchbase EE subscription. Please see the corresponding documentation and blog posts for more information and usage.
-
JVMCBC-490: Support for transparent client side compression has been added to the SDK. The Environment provides certain tunables to customize the default settings (compressionMinSize and compressionMinRatio). If the server also supports this feature (5.5 and newer), the SDK will automatically negotiate and use it. Please see the corresponding documentation and blog posts for more information and usage.
-
JCBC-1203, JVMCBC-537: Support for client certificate authentication has been expanded from pure KV only to all supported services. A new "CertAuthenticator" has been introduced and it needs to be explicitly enabled on the Environment via the "certAuthEnabled" configuration option. Please see the corresponding documentation and blog posts for more information and usage.
-
JVMCBC-542: Initial support for multi network configurations has been added. This allows the SDK to work in environments like Kubernetes and similar where internal addresses might be exposed via a different hostname or port combination. Note that there is a known issue outlined below with the current implementation which prevents you from exposing many nodes via the same hostname.
-
JVMCBC-500: Internal and external dependencies have been bumped to their newest versions.
-
JVMCBC-555: The analytics service can now also customize its IO pool if needed like the other services do.
-
JVMCBC-554: The analytics service can now also be customized through the AnalyticsServiceConfig on the environment.
-
JVMCBC-528: More information during the SASL auth steps is now provided to aid debugging.
-
JVMCBC-529: When using PersistTo/ReplicateTo overloads, the original CAS used in the mutation is now returned with the exception.
-
JVMCBC-552: Internal RingBuffer diagnostics have been improved so now more information during the BackpressureException is provided to figure out what has filled up the buffer in the first place to aid debugging.
-
JVMCBC-530: Java 9 support has been added by providing Automatic-Module-Name information to core-io and java-client.
-
JVMCBC-531: Read bytes are discarded early in the N1QL streaming parser, leading to less memory consumption on large responses.
-
JCBC-1158: The repository abstraction now allows annotations in parent classes.
-
JCBC-1179: A new "profile" option has been added to N1qlParams.
Fixed Issues
-
JVMCBC-510: Unknown bucket capabilities returned from the server config are now ignored, providing better forwards compatibility with newer server versions.
-
JVMCBC-523: When the SDK bootstraps against "good" and "bad" nodes, the bad ones are now properly cleaned up as soon as a good config can be found. This reduces noise in the logs.
-
JVMCBC-548: The original seed node list to bootstrap is now properly shuffled which allows for better distribution during bootstrap and less contention on specific nodes when many app servers are bootstrapped at the same time.
-
JVMCBC-535: The SDK now properly validates the last step in the SASL bootstrap sequence.
-
JVMCBC-513: A NullPointerException on a bad host in the connection string during bootstrap is now fixed.
-
JVMCBC-551: When loading a terse bucket config via HTTP (as a fallback from the KV approach) a bug has been fixed that confuses the bucket name with the username and as a result can’t properly load a config.
-
JCBC-1209: A handful codepaths have been audited to make sure subscribers are properly registered so timed out operations are cleaned up as early as possible once they are unsubscribed.
-
JCBC-1213: In a Search query the descending order now properly uses the "desc" token on the wire (instead of previously "descending" which the search engine did not understand and ignored).
-
JCBC-1184: The JavaDoc of the BucketManager#getDesignDocument method has been clarified that an exception is raised if the document is not found and not null returned for the blocking call (or an empty Observable in the async case).
-
JCBC-1175: An incorrect response mapping of the queue remove (via subdoc remove) has been fixed.
-
JCBC-1194: When using the ClusterManager without opening a bucket, the code now properly round-robins through the bootstrap list so if one of the nodes is down there is a chance that the operation can succeed.
-
JCBC-1207: A bug has been fixed where the SDK performed reverse DNS lookups during DNS SRV bootstrapping which should not happen.
Known Issues
-
JVMCBC-556: A new feature known as "multi network configuration" has been added, but for now only nodes with individual hostnames are supported. Support for nodes that all listen on the same physical hostname but on different ports will be added in a future release.
-
JCBC-1223: A regression has been found in 2.6.0 which will be addressed in 2.6.1: When API from the AsyncBucket is used that also uses durability requirements but not an explicit timeout, the operation will always time out immediately without a chance to complete. So affected is for example the following call: bucket.async().upsert(doc, PersistTo.MASTER); a proper workaround for now is including an explict timeout like so: bucket.async.upsert(doc, PersistTo.MASTER, 2, TimeUnit.SECONDS);
-
JCBC-1226: A regression has been found in 2.6.0 which will be addressed in 2.6.2: When using the analytics API without explicit params, a NullPointerException is raised (i.e. bucket.query(AnalyticsQuery.simple("myquery"));). As a workaround, please specify empty params explicitly: bucket.query(AnalyticsQuery.simple("myquery", AnalyticsParams.build()));
Changes
-
JVMCBC-482: Force IPv4 property to false by default. This can be reversed with the same system property as before, but is now forced to false since Couchbase Server supports IPv6 and only comes into play anyways if the JVM is forced to IPv6 but the server does not support it. If you have relied on this behavior before and cannot upgrade the server, please modify the system property "com.couchbase.forceIPv4" to "true".
Version 2.5.9 (7 June 2018)
Version 2.5.9 is the tenth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.9
-
com.couchbase.client:core-io:1.5.9
-
io.reactivex:rxjava:1.3.4
Fixed Issues
-
JVMCBC-534: Fix pooledService creating excessive endpoints on sending to downed node
-
JVMCBC-543: Clean up stale connections when query node goes offline, otherwise the connections may stick around until OS TCP timeout
-
JCBC-1207: Dont do reverse lookup on DNS SRV bootstrap
Enhancements & New Features
-
JCBC-1158: Add support for annotations in parent classes
-
JVMCBC-545: Improve debug logging on Endpoint
-
JCBC-1209: Audit and add explicit subscribers to non-kv requests to check for timeouts
Version 2.5.8 (1 May 2018)
Version 2.5.8 is the ninth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.8
-
com.couchbase.client:core-io:1.5.8
-
io.reactivex:rxjava:1.3.4
Fixed Issues
-
JCBC-1194: Enable service on nodes in the bootstrap list in round robin for cluster manager use without opening bucket.
-
JVMCBC-523: Properly clean up services on failed connect
-
JVMCBC-531: Discard read bytes in the parser on chunked response to reduce high memory consumption
Enhancements & New Features
-
JVMCBC-529: Expose original mutation cas on observe exceptions.
Version 2.6.0-beta (13 April 2018)
Version 2.6.0 is the beta release of the 2.6 series, bringing new features, enhancements and bugfixes over the last stable release.
Note that this is a beta release for upcoming functionality and should not be used in a production deployment.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.6.0-beta
-
com.couchbase.client:core-io:1.6.0-beta
-
io.reactivex:rxjava:1.3.5
It can be loaded from our prerelease maven repository:
<dependencies>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>java-client</artifactId>
<version>2.6.0-beta</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>cb-pre</id>
<name>Couchbase Prerelease Repo</name>
<url>http://files.couchbase.com/maven2</url>
</repository>
</repositories>
Enhancements & New Features
-
Support for end-to-end traceability has been added, which includes out of the box support for threshold-based trace information of requests and their timings as well as experimental support for OpenTracing compatible tracers.
-
Support for field-level-encryption which allows cross-SDK encrypting and decrypting of fields in JSON document bodies. The encryption extension is maintained on a separate repository.
-
Support for transparent end-to-end compression through snappy if the server supports it.
Please see blog posts and additional documentation / announcements around those features.
Version 2.5.7 (4 April 2018)
Version 2.5.7 is the eighth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.7
-
com.couchbase.client:core-io:1.5.7
-
io.reactivex:rxjava:1.3.4
Fixed Issues
-
JVMCBC-513: A NullPointerException has been fixed on a bad host string as part of the connection string.
-
JCBC-1175: A bug in the subdocument queuePop API has been fixed which doesn’t "swallow" concurrent access but rather returns a CAS mismatch as intended.
Enhancements & New Features
-
JCBC-1179: Volatile support for N1QL profile query param has been added which allows to get more profiling information at query time. The API is intended to be marked as comitted in the coming minor release cycle.
Version 2.5.6 (6 March 2018)
Version 2.5.6 is the seventh release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.6
-
com.couchbase.client:core-io:1.5.6
-
io.reactivex:rxjava:1.3.4
Fixed Issues
-
JVMCBC-510: Unknown bucket capabilities coming from a server config are now handled more gracefully, making sure unknown capabilites do not break the client parsing the server sent bucket config.
Enhancements & New Features
-
JVMCBC-492, JVMCBC-493: When the SDK connects to the server (Key/Value) it now negotiates its identification string via JSON, providing better capabilities to associate interactions with the server logs (if the server supports it, it can now parse and uniquely identify a client instance and us it in its logging).
-
JVMCBC-504: Snappy compression is available (if the server supports it), but disabled by default. This is mainly available for internal testing, if you want to use it in production please move to the 2.6.x branch or later which extended its internal support (Couchbase Server 5.5 and later).
-
JVMCBC-480: Infrastructure for redacted logging has been added, but only "user" information will be wrapped in redaction tags. Please consult the server documentation for additional tools which will then perform the actual redaction for both client and server data (Couchbase Server 5.5 and later).
-
JVMCBC-512: It is now possible to configure the number of allowed CouchbaseEnvironments based on a static config setting. Note that this should only be tuned under very specific settings and is considered advanced API.
Version 2.6.0-dp1 (27 February 2018)
Version 2.6.0 is the first developer preview release of the 2.6 series, bringing new features, enhancements and bugfixes over the last stable release.
Note that this is a developer preview for upcoming functionality and should not be used in a production deployment.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.6.0-dp1
-
com.couchbase.client:core-io:1.6.0-dp1
-
io.reactivex:rxjava:1.3.5
It can be loaded from our prerelease maven repository:
<dependencies> <dependency> <groupId>com.couchbase.client</groupId> <artifactId>java-client</artifactId> <version>2.6.0-dp1</version> </dependency> </dependencies> <repositories> <repository> <id>cb-pre</id> <name>Couchbase Prerelease Repo</name> <url>http://files.couchbase.com/maven2</url> </repository> </repositories>
Enhancements & New Features
-
Support for end-to-end traceability has been added, which includes out of the box support for threshold-based trace information of requests and their timings as well as experimental support for OpenTracing compatible tracers.
-
Support for field-level-encryption which allows cross-SDK encrypting and decrypting of fields in JSON document bodies.
-
Support for transparent end-to-end compression through snappy if the server supports it.
Please see blog posts and additional documentation / announcements around those features.
Version 2.5.5 (6 February 2018)
Version 2.5.5 is the sixth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.5
-
com.couchbase.client:core-io:1.5.5
-
io.reactivex:rxjava:1.3.4
Fixed Issues
-
JVMCBC-487: A regression was fixed which prevent the netty epoll native transport from being properly repackaged. It is now possible to use the native transport optionally again.
Enhancements & New Features
-
JCBC-1147: Added support for the Health Check "ping" command at the bucket level. This command allows to proactively send requests to all enabled services and get insight into their current status.
-
JVMCBC-490: Added uncomitted support for "end-to-end" compression based on snappy. Note that this preliminary support is meant for early adopters and might change in future releases.
-
JVMCBC-480: Added infrastructure and uncomitted support for log redaction. Note that this preliminary support is meant for early adopters and might change in future releases.
-
JCBC-1163: A small enhancement was added which logs the raw value if a N1QL response row couldn’t be decoded. This allows for easier troubleshooting.
-
JVMCBC-486: During reconnect attempts, not every stack trace is logged anymore which makes the logs less noisy and easier to parse.
-
JVMCBC-489: Http-based service pools now start their queries at random offsets, meaning that different nodes are getting hit on the first request, allowing for a more even query distribution especially with long running queries i.e. N1QL or analytics.
Version 2.5.4 (9 January 2018)
Version 2.5.4 is the fifth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.4
-
com.couchbase.client:core-io:1.5.4
-
io.reactivex:rxjava:1.3.3
Fixed Issues
-
JVMCBC-485: A minor issue has been fixed which did allow to go the service pool size below the configured minimum when cleaning up idle services. This has no impact on the workload but shows misleading node disconnect logs, so the logic has been changed to prevent that.
Enhancements & New Features
-
JVMCBC-475, JVMCBC-476: Support for IPv6 has been added throughout the stack, but it still disabled by default to minimize the risk of being backwards incompatible. It will be enabled with 2.6.0 by default. If you want to enable it right now, set the "com.couchbase.forceIPv4" system property to "false".
-
JCBC-1147: The HealthCheck API has been brought up to speed with the current SDK-RFC. As a result, the API has been renamed to "diagnostics" on the cluster level. Note that this API has been and still is experimental, so there might be more (smalller) changes coming before its finally stabilized.
Version 2.5.3 (5 December 2017)
Version 2.5.3 is the fourth release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.3
-
com.couchbase.client:core-io:1.5.3
-
io.reactivex:rxjava:1.3.3
Fixed Issues
-
JVMCBC-474: The internal and repackaged netty dependency has been bumped to 4.0.53.Final which contains fixes around Java 6 & 7 compatibility.
-
JCBC-1152: When the server returns the LOCKED error code via key/value, it is now properly translated on getAndLock into a TemporaryLockFailureException in addition to TMPFAIL. This is important on servers > 5.0.
Enhancements & New Features
-
JVMCBC-477: A new libcouchbase & .NET compatible memcached bucket (ketama) hashing strategy has been added, called StandardMemcachedHashingStrategy. It will become the default in the next major SDK version.
-
JVMCBC-473: A new configuration option "forceSaslPlain" has been added which falls back to PLAIN key/value authentication. This is needed if a user should be used for authentication which is to be authenticated through LDAP. If secrecy is needed, we recommend using our TLS encrypted connection feature on top.
-
JVMCBC-481: When a new config arrives, it is now quickly checked if the internal revision number is greater and only then a full blown internal config is created. While not user visible, it can help reduce the possibility of unncessary repeated hostname lookups, which in combination with slow or unreliable DNS setups can block computation threads and lead to occasional timeouts.
Version 2.5.2 (8 November 2017)
Version 2.5.2 is the third release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.2
-
com.couchbase.client:core-io:1.5.2
-
io.reactivex:rxjava:1.3.3
Fixed Issues
-
JVMCBC-471: A bug in the "healthcheck" API has been fixed which when called in the middle of nodes connecting the underlying channel would be null leading to NullPointerExceptions. This is now handled more gracefully.
-
JCBC-1144: The RetryBuilder had a bug which would not emit the underlying exception into the downstream Observable if it got emitted in the exactly last retry iteration. This has been fixed.
Enhancements & New Features
-
JVMCBC-470: It is now possible to configure the lower bound of the config poll interval via the configPollFloorInterval Environment property.
-
JVMCBC-468: The TrustStore for SSL can now be configured separately from the KeyStore, which gives you better control if both are maintained in separate files.
-
JCBC-1140: Thanks to a community contribution the allocation overhead for JsonDocument content (JsonObject, JsonArray) is reduced by roughly 10% but your mileage may vary depending on the size of the content.
-
JCBC-1141: A new document type: ByteArrayDocument has been introduced (but not as a committed API yet) which gives you the same benefits of a BinaryDocument, but comes without the burden of manual ByteBuffer management and reference counting.
-
JCBC-1142: in an effort to make the APIs between SDKs consistent, the subdocument method "createParents" has been renamed to "createPath", but in a backwards compatible way with deprecated methods. Please migrate to the new API since it will be deleted in the next major release.
Version 2.5.1 (3 October 2017)
Version 2.5.1 is the second release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.1
-
com.couchbase.client:core-io:1.5.1
-
io.reactivex:rxjava:1.3.0
Fixed Issues
-
JCBC-1129: The Subdocument API has been modified slightly so that it correctly aligns with the SDK-RFC for this feature. No methods have been removed, but the
createDocument
builder API is nowupsertDocument
and the old one has been deprecated. -
JCBC-1137: Previous releases added CouchbaseMock as a dependency, but it should actually just be a test dependency.
-
JCBC-1131: One openBucket overload didn’t actually respect the custom transcoders passed in. This is now fixed and all bucket open methods properly respect custom transcoders.
-
JVMCBC-466: When continuousKeepAlive is enabled, closed sockets would still try to run the keepalive, which could lead to reconnect attempts of nodes that are not needed anymore and "runaway" sockets.
-
JVMCBC-465, JVMCBC-467: Some changes have been made to the reconnection logic so there are no concurrent reconnect attempts. This fixes a problem where upgrading from < 5.0 Server releases to > 5.0 Server releases wasn’t possible without restarting the application server.
Version 2.5.0 (6 September 2017)
Version 2.5.0 is the first release of the 2.5 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.5.0
-
com.couchbase.client:core-io:1.5.0
-
io.reactivex:rxjava:1.3.0
Enhancements & New Features
-
JCBC-1071: Add basic KV error map testing with mock
-
JCBC-1082: Implement subdoc GET_COUNT
-
JCBC-1100: Counter API doc should inform that expiry is only honoured on creation
-
JCBC-1106: Expose more N1QL Query Options
-
JCBC-1110: Add ReplicaGet Helper Class
-
JCBC-1115: Enfore Xattr ordering on builder
-
JCBC-1117: Document example of using CoreSendHook for logging request/response/timeout and hostname
-
JCBC-1125: Add basic support for healthCheck API
-
JCBC-1126: Promote experimental APIs where appropriate
-
JCBC-1069: Adding union, intersect & except to DSL
-
JCBC-1070: Getter for object attributes added to DSL
-
JVMCBC-438: Set config poll interval to 2.5s by default
-
JVMCBC-431: Add support for InsertDoc and AccessDeleted in subdoc document flags
-
JVMCBC-460 :Discover FTS SSL through config
-
JVMCBC-441: Allow to hook in before the RingBuffer
-
JVMCBC-442: Store dispatched hostname in CouchbaseRequest
-
JVMCBC-443: Remove Deprecated DCP from Core-IO
-
JVMCBC-444: Enforce config poll floor at 50ms
-
JVMCBC-451: Implement subdoc GET_COUNT
-
JVMCBC-456: Harden and Optimize YASJL Parser
-
JVMCBC-457: Make the new parser default for query parsing
-
JVMCBC-458: Discover and bootstrap analytics service from cluster config
-
JVMCBC-461: Add basic support for healthCheck API
-
JVMCBC-462: Promote experimental APIs where appropriate
-
JVMCBC-449: Exponential Retry Delay, please check arguments
Fixed Issues
-
JCBC-1111: Handle LOCKED in the conversions
-
JVMCBC-445: ArrayOutOfBoundException in PooledService#sendFlush (concurrent access on list)
-
JVMCBC-448: Sporadic Unhandled Select Bucket status 1
-
JVMCBC-435: Issue with number of java client connections increasing rapidly after fail over on single node in cluster
-
JCBC-1086: Explicitly handle auth error for observe with xerror
Known Issues
-
JCBC-1129: Subdocument document options has createDocument flag for creating documents if the document does not exist. This flag naming does not conform to the specifications where it is named as upsertDocument. This will be fixed in upcoming release 2.5.1.
Version 2.4.8 (18 October 2017)
Version 2.4.8 is the ninth release of the 2.4 series, bringing important bugfixes over the last stable release, especially when used with Couchbase Server 5.0 and later.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.8
-
com.couchbase.client:core-io:1.4.8
-
io.reactivex:rxjava:1.2.7
Fixed Issues
-
JVMCBC-466: When continuousKeepAlive is enabled, closed sockets would still try to run the keepalive, which could lead to reconnect attempts of nodes that are not needed anymore and "runaway" sockets.
-
JVMCBC-465, JVMCBC-467: Some changes have been made to the reconnection logic so there are no concurrent reconnect attempts. This fixes a problem where upgrading from < 5.0 Server releases to > 5.0 Server releases wasn’t possible without restarting the application server.
-
JVMCBC-460: Discover FTS SSL through config
-
JVMCBC-445: ArrayOutOfBoundException in PooledService#sendFlush (concurrent access on list)
-
JVMCBC-448: Sporadic Unhandled Select Bucket status 1
-
JVMCBC-435: Issue with number of java client connections increasing rapidly after fail over on single node in cluster
Version 2.4.7 (12 July 2017)
Version 2.4.7 is the eighth release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.7
-
com.couchbase.client:core-io:1.4.7
-
io.reactivex:rxjava:1.2.7
Enhancements & New Features
-
JVMCBC-433: X.509 client side certificate support has been added.
-
JVMCBC-436: KeepAlives are now able to detect and recycle dead tcp connections/channels.
-
JVMCBC-434: Support for "Enhanced Error Messages" has been added for Couchbase Server 5.0
-
JVMCBC-430: Support for createDocument flag in subdoc single path mutations for Couchbase Server 5.0
Fixed Issues
-
JVMCBC-423: Timed out (unsubscribed) operations are discarded and not sent over the network anymore, leading to less overload of the whole core system in failure situations
-
JVMCBC-439: Fixed prepared statement dispatching with node hostname
-
JCBC-1090: Fixed DNS SRV Regression caused by JCBC-1079
Version 2.4.6 (6 June 2017)
Version 2.4.6 is the seventh release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.6
-
com.couchbase.client:core-io:1.4.6
-
io.reactivex:rxjava:1.2.7
Enhancements & New Features
-
JVMCBC-427: The SDK forces to use IPv4 addresses, even if the JVM is configured to force IPv6 lookups (since the server only supports v4 right now).
-
JCBC-1080: It is now possible to read and write full documents through the Subdocument-API when "xattr" is enabled.
-
JCBC-1078: The experimental API for extended attributes on the Subdocument-API has been renamed to "xattr" for consistency reasons.
-
JCBC-1079: When the "com.couchbase.allowReverseDns" System property is set to false, the SDK will avoid all reverse DNS lookups, making it possible to run under constrained network setups. The downside of course is that pretty hostnames can’t be used in logging and IPs must be showed all the time.
Fixed Issues
-
JVMCBC-428: The HTTP Status code 401 is now correctly mapped internally to an Authentication Error (instead of a generic failure). This should not change anything on the user-facing API.
Known Issues
-
JCBC-1090: A known regression over 2.4.5 which prevents DNS SRV bootstrap from working correctly. This will be fixed in 2.4.7, if you are using DNS SRV bootstrap please use 2.4.5 for now and upgrade once 2.4.7 has been released.
Version 2.4.5 (2 May 2017)
Version 2.4.5 is the sixth release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.5
-
com.couchbase.client:core-io:1.4.5
-
io.reactivex:rxjava:1.2.7
Enhancements & New Features
-
JCBC-1066: Add support for FTS Geo & TermRange Queries & Advanced Sort for Couchbase Server 5.0
-
JCBC-1055: Add support for ephemeral bucket management for Couchbase Server 5.0
-
JCBC-1072: Add covenient authenticate overload for Couchbase Server 5.0
-
JCBC-1068: Add dsl support to ANY AND EVERY expression
-
JCBC-1074: Support GetUsers change in returning domain instead of type for Couchbase Server 5.0
-
JVMCBC-415: Enforce CarrierRefresher poll floor for Couchbase Server 5.0 fast failover support
-
JVMCBC-417: Shift the carrier node refresh list on each attempt
-
JVMCBC-418: Add mock support for kv error map integration test
-
JVMCBC-419: Support changes in user management rest endpoints due to rename of builtin to local for Couchbase Server 5.0
Fixed Issues
-
JCBC-1067: Expose configPollInterval configurable from CouchbaseEnvironment builder.
-
JVMCBC-413: Allow to run HELLO after auth for optional backward compatibility support for older Couchbase Server versions(less than 3.0).
-
JVMCBC-421: Close LatencyStats on removal to avoid GC doing additional work by explicitly cleaning up weak references.
Version 2.4.4 (4 April 2017)
Version 2.4.4 is the fifth release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.4
-
com.couchbase.client:core-io:1.4.4
-
io.reactivex:rxjava:1.2.7
Enhancements & New Features
-
JVMCBC-394, JCBC-1060: Add username/password auth for support of RBACs in Couchbase Server 5.0.
-
JVMCBC-405, JCBC-1058: Add support for user management in Couchbase Server 5.0.
-
JVMCBC-393: Add support for the extended KV error map in Couchbase Server 5.0.
-
JVMCBC-399: Perform HELLO before AUTH
-
JVMCBC-404: Bump Dependencies
-
JVMCBC-401: propagate error on endpoint encode
-
JVMCBC-408: Deprecate DCP
-
JVMCBC-410: Allow to configure the config polling interval
-
JVMCBC-409: Resolve addresses when parsing ConnectionString
-
JVMCBC-411: Use ports when building partitioned nodes list
-
JVMCBC-396, JCBC-1061: Support to parse profiling info from N1QL query response
-
JCBC-1062: Optimize LegacyTranscoder encoding for strings
Fixed Issues
-
JVMCBC-407: Clean up stateful resources on ConfigurationProvider termination
-
JVMCBC-403: Fix incorrect escape processing in streaming parser
-
JVMCBC-402: Fix ignored callbacksOnIoPool in N1ql and Analytics query row callbacks
-
JVMCBC-412: Fix extras leak on IllegalReferenceCountException
-
JCBC-1065: Fix api doc to correctly mention about DesignDocumentDoesNotExistException
-
JCBC-1063: Never compress JSON in LegacyDocument.
Version 2.4.3 (7 March 2017)
Version 2.4.3 is the fourth release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.3
-
com.couchbase.client:core-io:1.4.3
-
io.reactivex:rxjava:1.2.3
Enhancements & New Features
This release fixes the following issues:
-
JVMCBC-391: Fixes a bug where empty documents can be written to server on NMV rescheduling, if SSL is used
-
JCBC-1030, JVMCBC-390: Add experimental support for Couchbase Analytics.
-
JVMCBC-395: Add support for detecting Ephemeral buckets using bucket capabilities in configuration and short circuit persistTo calls
-
JVMCBC-392: Integrate an optional generic json parser yasjl for parsing N1QL query responses
-
JVMCBC-397: Avoid concurrent modification/reading of bucketConfigs map
-
JCBC-1043: Add toString for N1QL Rows and Sync Result
-
JCBC-1045: Pre-check connection string to avoid IOOB exception
Version 2.4.2 (9 February 2017)
Version 2.4.2 is the third release of the 2.4 series, bringing enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.2
-
com.couchbase.client:core-io:1.4.2
-
io.reactivex:rxjava:1.2.3
Enhancements & New Features
This release fixes the following issues:
-
JVMCBC-380 JVMCBC-385: To address a potential performance regression introduced in 2.4.1 with N1QL (due to disabling the pipelining for ensuring correctness) the Service pooling has been overhauled completely, leading to better out of the box performance and more flexibility.
-
JVMCBC-341: The FTS service endpoint has been equipped with application-level keepalive (similar to the other services), bringing it in line functionality wise with its counterparts. It uses the internal /admin/ping HTTP endpoint.
-
JCBC-1028, JVMCBC-384: Experimental support for "Extended Attributes" (XATTR) has been added to the API in preparation for Couchbase Server 5.0.
Version 2.4.1 (19 January 2017)
Version 2.4.1 is the second release of the 2.4 series, bringing small enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.1
-
com.couchbase.client:core-io:1.4.1
-
io.reactivex:rxjava:1.2.3
Fixed Issues
This release fixes the following issues:
-
JVMCBC-380, JVMCBC-381: Pipelining for all HTTP-based services has been disabled (N1QL, FTS, Views) because it is not properly supported on the server side and can lead to inconsistent responses that are hard to identify and track down. Everyone who has had problems with N1QL queries returning successfully, but only partial results are recommended to upgrade. If you are experiencing slowdown of your queries, you need to increase the number of queryEndpoints to a higher setting in order to allow for concurrent requests. In the future we are planning on a more flexible pool implementation, but setting the queryEndpoints to a fixed higher value (i.e. the number of application threads concurrently querying) will help as well.
-
JCBC-999, JVMCBC-383: The BucketManager#info() method and equivalents are now properly redistributing the underlying request to other servers if the first one tried is not available. This increases the reliability of info calls significantly.
-
JCBC-1037: If a FTS query is issued against a nonexistent index, it now properly errors with a IndexDoesNotExistException, bringing it on-par with other APIs in similar situations.
Version 2.3.7 (19 January 2017)
Version 2.3.7 is the eigth release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.3.7
-
com.couchbase.client:core-io:1.3.7
-
io.reactivex:rxjava:1.1.8
Fixed Issues
This release fixes the following issues:
-
JVMCBC-380, JVMCBC-381: Pipelining for all HTTP-based services has been disabled (N1QL, FTS, Views) because it is not properly supported on the server side and can lead to inconsistent responses that are hard to identify and track down. Everyone who has had problems with N1QL queries returning successfully, but only partial results are recommended to upgrade. If you are experiencing slowdown of your queries, you need to increase the number of queryEndpoints to a higher setting in order to allow for concurrent requests. In the future we are planning on a more flexible pool implementation, but setting the queryEndpoints to a fixed higher value (i.e. the number of application threads concurrently querying) will help as well.
-
JCBC-999, JVMCBC-383: The BucketManager#info() method and equivalents are now properly redistributing the underlying request to other servers if the first one tried is not available. This increases the reliability of info calls significantly.
-
Thanks to a community contribution, CouchbaseException subclasses without a message are now properly propagating stack traces.
Version 2.4.0 (5 January 2017)
Version 2.4.0 is the first release of the 2.4 series, bringing small enhancements and bugfixes over the last stable release.
The supported and tested dependencies for this release are:
-
com.couchbase.client:java-client:2.4.0
-
com.couchbase.client:core-io:1.4.0
-
io.reactivex:rxjava:1.2.3
New Features and Behavioral Changes
This release contains the following enhancements:
-
RxJava has been updated to 1.2.3, which is backwards compatible to 1.1. which was used in the java-client 2.3.6.
-
JCBC-1021: Support for BigDecimal and BigInteger has been added to JsonObject and JsonArray, making it easier to work with those types naturally.
-
JCBC-974: For consistency reasons, the BucketManager now throws DesignDocumentDoesNotExist in such cases instead of returning different errors. It is now in-line with similar methods, providing a more coherent API experience.
-
JCBC-1022, JCBC-1032: Both the bucket-level collections API, as well as the Authenticator APIs have been marked as stable and can thus be considered supported API.
-
JVMCBC-378: Optional support for custom IO pools per service has been added. By default still one IO pool will be used, but it is possible to override this now on a per-service basis. This has the nice effect of being able to use different IO event loops for different workloads (high throughput KV vs long running N1QL queries for example).
-
JVMCBC-373: onError calls are now also moved (by default) onto the computation scheduler, similar to onNext calls.
Fixed Issues
This release fixes the following issues:
-
JCBC-1029: A bug with Long-running prepared N1QL query observables which may be released too early and thus cannot be subscribed to has been fixed.
Version 2.3.6 (6 December 2016)
Version 2.3.6 is the seventh release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
New Features and Behavioral Changes
This release contains the following enhancements:
-
JCBC-1024: Add "sort" option to FTS query. Allows custom sort order for search queries.
-
JCBC-1020: Collections interface for data structures
-
JCBC-981: Add toString() on N1qlQuery
-
JCBC-1023: Ignore FTS integration tests if search service not found
-
JVMCBC-376: Add support for legacy memcached node hashing as it is different in 2.x series compared to 1.x. Legacy hashing can be turned on by using LegacyMemcachedHashingStrategy in the environment builder. Important: If you need interoperability between Java and other SDKs when writing and/or reading to memcached buckets, you must pick the LegacyMemcachedHashingStrategy since the Default one is not compatible across languages (and between Java 1.x and 2.x)
-
JVMCBC-375: Extract SSL related settings into SecureEnvironment.
Fixed Issues
This release fixes the following issues:
-
JCBC-1026: Early unsubscription can trigger buffer leaks. If early unsubscribes on the KV API are performed (that is, the async API is used and an operator like timeout() fires before the data could be decoded and the underlying buffers freed) the buffers from the decoding operation are not freed and leak.
-
JCBC-1016: Throw PathNotFound instead of SUBDOC_PATH_NOT_FOUND on index not found in List and key not found in Map
-
JCBC-1017, JCBC-1018: Fix inconsistencies with the data structures RFC
Version 2.3.5 (3 November 2016)
Version 2.3.5 is the sixth release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
New Features and Behavioral Changes
This release contains the following enhancements:
-
JCBC-900: Experimental support for Bucket-Level Datastructures has been added, which advance the concept of subdocument APIs to actual programmable datastructures like sets and maps in a cross-SDK fashion.
-
JCBC-1015: When performing a N1QL Query against Couchbase Server 4.5.1 or later you can now specify the "pretty" param on the N1QL query params to optimize network bandwith.
Fixed Issues
This release fixes the following issues:
-
JVMCBC-371: A safeguard has been put into place that if the underlying network "connect" call never returns for some reason it is now cut short after a given delay and declared faulty to give the built-in retry mechanisms a chance to run. By default this time is defined as 2 seconds over the "socket connect timeout" and can be customized through the "com.couchbase.connectCallbackGracePeriod" system property.
-
JVMCBC-372: The internal sentRequestQueue for each socket has been subject to an edge case where when the socket accepts requests but never returns results (acting like a "black hole" and not closing the socket either) the internal queue which matches the responses to the requests can grow unbounded. This is now fixed and set to a size of 5120 outstanding requests per socket, customizable through the "com.couchbase.sentRequestQueueLimit" system property. If the queue grows too large the overflowing requests get put into the regular retry cycle giving them a chance to complete eventually.
-
JVMCBC-370: The internal DCP implementation has had a couple bugfixes around MDS deployments.
Version 2.3.4 (5 October 2016)
Version 2.3.4 is the fifth release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
New Features and Behavioral Changes
This release contains the following enhancements:
-
JCBC-851: Experimental support for cluster-level N1QL queries has been added to the Cluster interface. Note that at least one bucket needs to be open and the credentials need to be set properly using the authenticate method in order to use this feature.
-
JVMCBC-365: When using SCRAM SASL authentication mechanisms during bootstrap and an error happens, the resulting error message now more clearly indicates what is going on. Most likely the JVM does not support empty keys for passwords, so either the JVM needs to be upgraded to a newer version or a bucket password should be set (which we recommend to do so anyways).
Fixed Issues
This release fixes the following issues:
-
JCBC-1007: N1QL, FTS and View queries are now properly evenly distributed in MDS-scenarios.
-
JVMCBC-368: A classloader leak on redeploy has been discovered and fixed in the PauseDetector part of the metrics collection.
Version 2.3.3 (6 September 2016)
Version 2.3.3 is the fourth release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
New Features and Behavioral Changes
This release contains the following enhancements:
-
JCBC-995: Improved custom transcoding for subdocument: optionalrawContent getter on SubdocOperationResult, includeRaw option in the LookupInBuilders (putting a copy of the raw JSON bytes into the result for GETs), new abstract FragmentTranscoder that deals with byte arrays..
-
JCBC-901: The experimental Authenticator interface has been introduced to store implicit credentials for protected operations. Such operations for now include opening a Bucket and getting aClusterManager instance.
-
JCBC-998, JVMCBC-357: Added an experimental RawQueryExecutorwhich allows to execute N1QL queries and get the raw JSON response from the server.
-
JVMCBC-361: When a Node is DEGRADED, at least part of its Services are CONNECTED. As such, a message can now be dispatched to a Node when it is either in CONNECTED or DEGRADED state. The relevant Service will still have to be CONNECTED for the message to go through, otherwise it will go into the retry loop.
-
JVMCBC-358: There’s a new Endpoint selection strategy (RoundRobinSelectionStrategy), which is used by theQueryEndpoint. When several QueryEndpoints are configured, they will now properly be used in a round-robin fashion.
Fixed Issues
This release fixes the following issues:
-
JVMCBC-364: The query parser can fail when N1QL results are empty (no rows), in a specific HTTP chunk configuration (where there is a split at the "status" entry that follows the rows in the response).
-
JVMCBC-360: When querying a view in reduce mode, the returnedinfo() section is empty but the parser can leak a small amount of bytes. This has now been fixed.
Version 2.3.2 (10 August 2016)
Version 2.3.2 is the third release of the 2.3 series, bringing small enhancements and bugfixes over the last stable release.
New Features and Behavioral Changes
This release contains the following enhancements:
-
JCBC-987: Support for durability constraints (PersistTo and ReplicateTo) has been added to subdocument’s MutateInBuilder.
-
JCBC-982: BucketSettings now exposes the raw bucket configuration when reading from the server, and allows to provide parameters not covered by the API when creating/updating buckets.
-
JCBC-983, JVMCBC-350: Added a simple client for cluster REST API to ClusterManager as a ClusterApiClient. This is to easily send requests to nodes where the REST API is exposed (usually on port 8091).
-
JVMCBC-342: When a CouchbaseEnvironment is shutdown(), the internal counter used to issue warnings in case of multiple environments is decreased. Additionally an event is triggered on the EventBus.
-
JVMCBC-351: Don’t limit SSL to SunX509 algorithm but instead use the platform’s default. This default can always be changed at runtime via the "ssl.KeyManagerFactory.algorithm" security property (set in the Java security properties file or by calling Security.setProperty(…)). Thanks to contributor @arana3!
-
JCBC-985, JCBC-976: Experimental FTS API enhancements: Fix fts errors handling/parsing, StringQuery becomes QueryStringQuery, fix highlight style being optional, renamed ScanConsistency to SearchConsistency.
-
JVMCBC-344, JVMCBC-349: RxJava, Disruptor and Netty internal dependencies have been updated to their latest bugfix releases. Subsequently, usage of deprecated Disruptor APIs have been refactored out.
-
JVMCBC-355: Improves diagnosability of errors related to UnicastAutoReleaseSubject by adding an identifier to these subjects.
Fixed Issues
This release fixes the following issues:
-
JCBC-984: Don’t broadcast query plan to non-query nodes when using prepared statements.
-
JCBC-992: DNS SRV workaround when default nameserver is IPv6: Bootstrap now allows to provide an explicit value for java.naming.provider.url.
-
JVMCBC-345, JVMCBC-346, JVMCBC-347: Various fixes linked to SDK bootstrap: Don’t silently ignore ConnectException, avoid subscribe() without error handler in configuration/bootstrap Observables, maintain internal bootstrap state in config provider. Fixed an issue where a node seen as down during bootstrap would never be reconnected to later on, even when it would come back online.
-
JVMCBC-348: Catch exceptions that event bus consumers may trigger.
-
JVMCBC-352: Fixed an issue with the N1QL streaming parser where some packet splitting layouts would confuse the parser into interpreting results as RAW. This would usually translate into either JSON parse errors (rows emitted would be malformed JSON) or an IllegalStateException with the "…in TRANSITION…" message.
-
JVMCBC-354: The BucketManager#getDesignDocuments and associated GetDesignDocumentsRequest hit an API that is only working on data nodes (unlike the rest of 8091 APIs). Fixed an issue when, in a MDS configuration, such request would incorrectly be sent to non-data nodes.
Version 2.3.1 (22 June 2016)
This release is the second release of the 2.3 series, bringing small enhancements\ and bugfixes over the last stable release.
Fixed Issues
This release fixes the following issues:
-
JCBC-975: Replace occurrences of StringBuffer with StringBuilder
-
JCBC-978: Fix Index DSL "WITH nodes" option
-
JVMCBC-343: WaitStrategy needs to be created for every CouchbaseCore
Version 2.3.0 (10 June 2016)
Version 2.3.0 is the first general availability release of the 2.3 series. It adds new features for N1QL query, performance enhancements and supports the developer preview full text search available in Couchbase Server 4.5.
New features and behavioral changes
This release contains the following enhancements:
-
JVMCBC-271: The long deprecated queryEnabled and queryPort environment params have been removed since they are useless as of now.
-
JCBC-958, JCBC-959, JCBC-957: The Fulltext-Search API has been heavily reworked and streamlined.
-
JCBC-954, JCBC-971: The subdocument APIs have been marked as stable and slightly polished.
-
JCBC-955: The N1QL Index Management API has been marked as stable.
-
JVMCBC-333: A custom KeyStore can now be passed in during CouchbaseEnvironment setup (in addition to passing the keystore filepath).
-
JCBC-964, JVMCBC-338: Support for disabling metrics when performing a N1QL query to save on the response size.
-
JVMCBC-334: Support for N1QL SELECT RAW has been added.
-
JCBC-965: A generic param option has been added to the N1qlParams class.
-
RxJava has been updated to 1.1.5
-
Retry logic during rebalance ("Not My VBucket") has been aligned with the SDK RFC.
-
JVMCBC-335: For advanced use cases, the RingBuffer waiting strategy for the request buffer can now be tuned. Use with care!
Fixed Issues
This release fixes the following issues:
-
JCBC-968, JVMCBC-337: The DocumentFragment does not carry the CAS on multi lookup, this issue has been fixed.
-
JCBC-973: A regression has been fixed where disabled flush on the bucket was not surfaced as an exception inside the SDK when BucketManager#flush() is called.


This is an information how many ECU you collected in the experiment:
'Guess the urn' task 1:
ECU were added to your bonus.
'Guess the urn' task 2:
| Round |
Payment |
| Round 1 |
ECU |
| Round 2 |
ECU |
| Round 3 |
ECU |
| Round 4 |
ECU |
| Round 5 |
ECU |
| Round 6 |
ECU |
The computer chose randomly that Round
and
Round
are added to your final bonus.
ECU are added to your final bonus.
Your guess about the automated players behavior:
Automated players consider red
balls important compared to blue balls.
Your guess was . Automated players consider
red balls important
compared to blue balls.
You win ECU.
The results of the bomb game:
| Number of open boxes |
Box with bomb |
You win |
| |
|
ECU |
Press 'Done' to continue to the final questionnaire.
You are only paid after completing the questionnaire.


Tk::MIMEApp - The great new Tk::MIMEApp!
Version 0.03
ISA Tk::Notebook. Can load MIME Multipart file with application/x-ptk.markdown parts, converting them to Tk (with Tk::MarkdownTk) for document-driven applications.
Method that takes a filehandle and adds a page to the notebook for each application/x-ptk.markdown part. Will also add menu items to the toplevel menu for application/x-yaml.menu parts.
Accepts some yaml (scalar) and a Tk::Menu as arguments, and populates the menu from the yaml. Uses YAML::Perl for parsing.
Takes a Tk::Menu and and arrayref describing items and implements them. Called by yaml2menu.
Used internally
Used internally
jimi, <jimi at webu.co.uk>
Please report any bugs or feature requests to
, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Tk-MIMEApp. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.bug-tk-mimeapp at rt.cpan.org
You can find documentation for this module with the perldoc command.
perldoc Tk::MIMEApp
You can also look for information at:
RT: CPAN's request tracker (report bugs here)
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
Copyright 2013 jimi.
This program is free software; you can redistribute it and/or modify it under the terms of the the Artistic License (2.0). You may obtain a copy of the full license at:
http://www.perlfoundation.org/artistic_license_2_0
Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license.
If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license.
This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder.
This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed.
Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.  UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Class: Sprout::Executable::Base
- Inherits:
-
Object
- Object
- Sprout::Executable::Base
- Includes:
- Sprout::Executable
- Defined in:
- lib/sprout/executable/base.rb
Direct Known Subclasses
Constant Summary
Constant Summary
Constants included from Sprout::Executable
DEFAULT_FILE_EXPRESSION, DEFAULT_PREFIX, DEFAULT_SHORT_PREFIX
Instance Attribute Summary (collapse)
-
- (Object) abort_on_failure
Configure the executable instance to output failure messages to stderr and abort with non-zero response.
-
- (Object) default_prefix
The default command line prefix that should be used in front of parameter names.
-
- (Object) default_short_prefix
The default command line prefix for short name parameters.
-
- (Object) executable
The default Sprout executable that we will use for this executable.
-
- (Object) param_hash
readonly
Returns the value of attribute param_hash.
-
- (Object) params
readonly
Returns the value of attribute params.
-
- (Object) pkg_name
The default RubyGem that we will use when requesting our executable.
-
- (Object) pkg_version
The default RubyGem version that we will use when requesting our executable.
-
- (Object) prerequisites
readonly
Returns the value of attribute prerequisites.
-
- (Object) rake_task_name
If the executable is configured as a Rake::Task, it will extract the Rake::Task[:name] property and apply it to this field.
Class Method Summary (collapse)
-
+ (Object) add_param(name, type, options = nil)
add_param is the workhorse of the Task.
- + (Object) add_param_alias(new_name, old_name)
- + (Object) set(key, value)
- + (Object) static_default_value_collection
- + (Object) static_parameter_collection
Instance Method Summary (collapse)
-
- (File) binary_path
Path to the executable binary that should be executed.
-
- (File) binary_path=(path)
Replace the binary that will be executed with a path to one of your choosing.
-
- (Object) create_outer_task(*args)
protected
Create the outer rake task.
-
- (Object) default_file_expression
Called by Parameters like :path and :paths.
-
- (Object) execute
Execute the feature after calling parse with command line arguments.
-
- (Object) execute_delegate
protected
Call the provided executable delegate.
-
- (Object) from_hash(hash)
This will ignore unknown parameters, because our very first use case, is when generators call other generators and generator A might have different parameters than generator B.
-
- (Base) initialize
constructor
A new instance of Base.
- - (Object) initialize_defaults protected
-
- (Object) library_added(path_or_paths)
protected
This method will generally be overridden by subclasses and they can do whatever customization is necessary for a particular library type.

- - (Object) to_help
- - (Object) to_rake(*args) {|_self| ... }
-
- (Object) to_shell
Create a string that represents this configured executable for shell execution.
-
- (Object) update_rake_task_name_from_args(*args)
protected
This method will add the current task to the Rake CLEAN collection.
Methods included from Concern
#append_features, extended, #included
Constructor Details
- (Base) initialize
A new instance of Base
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/sprout/executable/base.rb', line 220 def initialize super @abort_on_failure = true @appended_args = nil @prepared = false @prepended_args = nil @param_hash = {} @params = [] @prerequisites = [] @option_parser = OptionParser.new @default_prefix = DEFAULT_PREFIX @default_short_prefix = DEFAULT_SHORT_PREFIX initialize_defaults initialize_parameters end |
Instance Attribute Details
- (Object) abort_on_failure
Configure the executable instance to output failure messages to stderr and abort with non-zero response.
206 207 208 |
# File 'lib/sprout/executable/base.rb', line 206 def abort_on_failure @abort_on_failure end |
- (Object) default_prefix
The default command line prefix that should be used in front of parameter names.
The default value for this parameter is ’--’, but some command line applications (like MXMLC) prefer ’-’.
175 176 177 |
# File 'lib/sprout/executable/base.rb', line 175 def default_prefix @default_prefix end |
- (Object) default_short_prefix
The default command line prefix for short name parameters.
This value defaults to ’-’, but can be changed to whatever a particular tool prefers.
183 184 185 |
# File 'lib/sprout/executable/base.rb', line 183 def default_short_prefix @default_short_prefix end |
- (Object) executable
The default Sprout executable that we will use for this executable.
Classes that include the Task can set the default value for this property at the class level with:
set :executable, :mxmlc
But that value can be overriden on each instance like:
executable = SomeToolTask.new
too.executable :compc
This parameter is required - either from the including class or instance configuration.
201 202 203 |
# File 'lib/sprout/executable/base.rb', line 201 def executable @executable end |
- (Object) param_hash (readonly)
Returns the value of attribute param_hash
216 217 218 |
# File 'lib/sprout/executable/base.rb', line 216 def param_hash @param_hash end |
- (Object) params (readonly)
Returns the value of attribute params
217 218 219 |
# File 'lib/sprout/executable/base.rb', line 217 def params @params end |
- (Object) pkg_name
The default RubyGem that we will use when requesting our executable.
Classes that include the Executable can set the default value for this property at the class level with:
set :pkg_name, 'sprout-sometoolname'
But that value can be overridden on each instance like:
executable = SomeToolTask.new
executable.pkg_name = 'sprout-othertoolname'
This parameter is required - either from the including class or instance configuration.
147 148 149 |
# File 'lib/sprout/executable/base.rb', line 147 def pkg_name @pkg_name end |
- (Object) pkg_version
The default RubyGem version that we will use when requesting our executable.
Classes that include the Task can set the default value for this property at the class level with:
set :pkg_version, '>= 1.0.3'
But that value can be overriden on each instance like:
executable = SomeToolTask.new
too.pkg_version = '>= 2.0.0'
This parameter is required - either from the including class or instance configuration.
165 166 167 |
# File 'lib/sprout/executable/base.rb', line 165 def pkg_version @pkg_version end |
- (Object) prerequisites (readonly)
Returns the value of attribute prerequisites
218 219 220 |
# File 'lib/sprout/executable/base.rb', line 218 def prerequisites @prerequisites end |
- (Object) rake_task_name
If the executable is configured as a Rake::Task, it will extract the Rake::Task[:name] property and apply it to this field.
Concrete parameters can pull this value from their belongs_to parameter.
214 215 216 |
# File 'lib/sprout/executable/base.rb', line 214 def rake_task_name @rake_task_name end |
Class Method Details
+ (Object) add_param(name, type, options = nil)
add_param is the workhorse of the Task. This method is used to add new shell parameters to the executable interface.
name is a symbol or string that represents the parameter that you would like to add such as :debug or :source_path.
type is a class reference of the Executable::Param that you’d like to use. At the time of this writing, add_param will accept 2 class references that do not extend Param - String and File. The ParameterFactory will automatically resolve these to the correct data type when they are created.
Boolean true or false
File Path to a file
Number Any number
Path Path to a directory
String Any string value
Url Basic URL
Files Collection of files
Paths Collection of directories
Strings Collection of arbitrary strings
Urls Collection of URLs
Be sure to check out the Sprout::Executable::Param class to learn more about working with executable parameters.
Once parameters have been added using the add_param method, clients can set and get those parameters from any newly created executable instance, or from the command line.
In the case of an executable delegate, parameter values will be sent to the command line executable in the order they are added using add_param.
In the case of a Ruby executable, command line parameters will be interpreted in the order they are defined using add_param.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/sprout/executable/base.rb', line 49 def add_param(name, type, =nil) # :yields: Sprout::Executable::Param raise Sprout::Errors::UsageError.new "[DEPRECATED] add_param no longer uses closures, you can provide the same values as a hash in the optional last argument." if block_given? raise Sprout::Errors::UsageError.new "The first parameter (name:SymbolOrString) is required" if name.nil? raise Sprout::Errors::UsageError.new "The second parameter (type:Class) is required" if type.nil? raise Sprout::Errors::UsageError.new "The type parameter must be a Class by reference" if !type.is_a?(Class) ||= {} [:name] = name [:type] = type # TODO: Integrate the RDOC-parsed parameter description here: #options[:description] ||= Sprout::RDocParser.description_for_caller caller.shift create_param_accessors static_parameter_collection << end |
+ (Object) add_param_alias(new_name, old_name)
66 67 68 |
# File 'lib/sprout/executable/base.rb', line 66 def add_param_alias new_name, old_name create_param_accessors :name => new_name, :real_name => old_name end |
+ (Object) set(key, value)
78 79 80 |
# File 'lib/sprout/executable/base.rb', line 78 def set key, value set_default_value key, value end |
+ (Object) static_default_value_collection
74 75 76 |
# File 'lib/sprout/executable/base.rb', line 74 def static_default_value_collection @static_default_value_collection ||= [] end |
+ (Object) static_parameter_collection
70 71 72 |
# File 'lib/sprout/executable/base.rb', line 70 def static_parameter_collection @static_parameter_collection ||= [] end |
Instance Method Details
- (File) binary_path
Path to the executable binary that should be executed.
386 387 388 |
# File 'lib/sprout/executable/base.rb', line 386 def binary_path @binary_path ||= Sprout::Executable.load(executable, pkg_name, pkg_version).path end |
- (File) binary_path=(path)
Replace the binary that will be executed with a path to one of your choosing. This work is usually performed on the yielded instance from Rake like:
mxmlc 'bin/SomeProject.swf' do |t|
t.input = 'src/SomeProject.as'
t.binary_path = 'vendor/sdks/4.1.0/bin/mxmlc'
end
It’s important to note that Windows systems will check the provided path for binaries of the same name that end with .exe and .bat and will use those in place of the provided name if they exist.
For example, if you set binary_path to:
t.binary_path = 'vendor/sdks/4.0.1/bin/mxmlc'
And there is a similarly-named file in the same directory, but named:
vendor/sdks/4.0.1/bin/mxmlc.bat
Windows systems will execute this .bat file.
380 381 382 |
# File 'lib/sprout/executable/base.rb', line 380 def binary_path=(path) @binary_path = path end |
- (Object) create_outer_task(*args) (protected)
Create the outer rake task. For most executables, this will be a Rake::File task, This is a template method that should be overridden for executables that do not result in the creation of a file.
417 418 419 420 421 |
# File 'lib/sprout/executable/base.rb', line 417 def create_outer_task *args Rake::FileTask.define_task(*args) do execute end end |
- (Object) default_file_expression
Called by Parameters like :path and :paths
345 346 347 |
# File 'lib/sprout/executable/base.rb', line 345 def default_file_expression @default_file_expression ||= Sprout::Executable::DEFAULT_FILE_EXPRESSION end |
- (Object) execute
Execute the feature after calling parse with command line arguments.
Subclasses will generally override this method if they are a Ruby executable, but if you’re just delegating to an external CLI application, calling execute will wind up executing the external process.
271 272 273 274 |
# File 'lib/sprout/executable/base.rb', line 271 def execute prepare execute_delegate end |
- (Object) execute_delegate (protected)
Call the provided executable delegate.
This method is generally called from Rake task wrappers.
397 398 399 |
# File 'lib/sprout/executable/base.rb', line 397 def execute_delegate system_execute binary_path, to_shell end |
- (Object) from_hash(hash)
This will ignore unknown parameters, because our very first use case, is when generators call other generators and generator A might have different parameters than generator B.
315 316 317 318 319 320 321 |
# File 'lib/sprout/executable/base.rb', line 315 def from_hash hash hash.each_pair do |key, value| if(self.respond_to?(key)) self.send "#{key}=", value end end end |
- (Object) initialize_defaults (protected)
472 473 474 475 476 477 |
# File 'lib/sprout/executable/base.rb', line 472 def initialize_defaults assembled_default_parameter_collection.reverse.each do |option| #puts ">> updating default on: #{self} for: #{option[:name]} with: #{option[:value]}" self.send "#{option[:name]}=", option[:value] end end |
- (Object) library_added(path_or_paths) (protected)
This method will generally be overridden by subclasses and they can do whatever customization is necessary for a particular library type.
It’s important to note that this value can be a String path to a file (or folder), or it can be an Array of paths to files (or folders).
465 466 |
# File 'lib/sprout/executable/base.rb', line 465 def library_added path_or_paths end |
- (Object) parse!(commandline_options)
252 253 254 255 256 257 258 259 260 |
# File 'lib/sprout/executable/base.rb', line 252 def parse! begin option_parser.parse! validate unless help_requested? rescue StandardError => e handle_parse_error e end end |
- (Object) parse_extra_options!(options) (protected)
446 447 448 449 450 451 452 453 454 455 |
# File 'lib/sprout/executable/base.rb', line 446 def .each do |value| params.each do |param| if param.hidden_name? self.send "#{param.name}=", value break end end end end |
- (Object) parse_rake_task_arg(arg) (protected)
438 439 440 441 442 443 444 |
# File 'lib/sprout/executable/base.rb', line 438 def parse_rake_task_arg arg return arg if arg.is_a?(Symbol) || arg.is_a?(String) arg.each_pair do |key, value| return key end nil end |
- (Object) prepare (protected)
401 402 403 404 405 406 407 |
# File 'lib/sprout/executable/base.rb', line 401 def prepare return if @prepared @prepared = true params.each do |param| param.prepare end end |
- (Object) stderr
248 249 250 |
# File 'lib/sprout/executable/base.rb', line 248 def stderr @stderr ||= Sprout.stderr end |
- (Object) stderr=(io)
244 245 246 |
# File 'lib/sprout/executable/base.rb', line 244 def stderr=(io) @stderr = io end |
- (Object) stdout
240 241 242 |
# File 'lib/sprout/executable/base.rb', line 240 def stdout @stdout ||= Sprout.stdout end |
- (Object) stdout=(io)
236 237 238 |
# File 'lib/sprout/executable/base.rb', line 236 def stdout=(io) @stdout = io end |
- (Object) system_execute(binary, params) (protected)
468 469 470 |
# File 'lib/sprout/executable/base.rb', line 468 def system_execute binary, params Sprout.current_system.execute binary, params end |
- (Object) to_hash
This will create a hash of ONLY values that are created using add_param, properties that are created with attr_accessor must be handled manually, or patches are welcome!
302 303 304 305 306 307 308 |
# File 'lib/sprout/executable/base.rb', line 302 def to_hash result = {} params.each do |param| result[param.name] = self.send(param.name) end result end |
- (Object) to_help
323 324 325 |
# File 'lib/sprout/executable/base.rb', line 323 def to_help option_parser.to_s end |
- (Object) to_rake(*args) {|_self| ... }
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/sprout/executable/base.rb', line 276 def to_rake *args # Define the file task first - so that # desc blocks hook up to it... outer_task = create_outer_task *args update_rake_task_name_from_args *args yield self if block_given? prepare # TODO: Tried auto-updating with library # prerequisites, but this led to strange # behavior with multiple registrations. handle_library_prerequisites outer_task.prerequisites # Add the library resolution rake task # as a prerequisite outer_task.prerequisites << Rake::Task.define_task(Sprout::Library::TASK_NAME) prerequisites.each do |prereq| outer_task.prerequisites << prereq end outer_task end |
- (Object) to_shell
Create a string that represents this configured executable for shell execution
328 329 330 331 332 333 334 335 336 337 338 339 340 |
# File 'lib/sprout/executable/base.rb', line 328 def to_shell return @to_shell_proc.call(self) unless @to_shell_proc.nil? result = [] result << @prepended_args unless @prepended_args.nil? params.each do |param| if(param.visible?) result << param.to_shell end end result << @appended_args unless @appended_args.nil? return result.join(' ') end |
- (Object) update_rake_task_name_from_args(*args) (protected)
This method will add the current task to the Rake CLEAN collection.
Any Executable that does not create a Rake::File task should also override this method and prevent it from calling CLEAN.add.
432 433 434 435 436 |
# File 'lib/sprout/executable/base.rb', line 432 def update_rake_task_name_from_args *args self.rake_task_name = parse_rake_task_arg args.last CLEAN.add(self.rake_task_name) self.rake_task_name end |


| ||||||||||||||||||||
SSL_clear(3)
NAMESSL_clear - reset SSL object to allow another connection
SYNOPSIS#include <openssl/ssl.h> int SSL_clear(SSL *ssl);
DESCRIPTIONReset ssl to allow another connection. All settings (method, ciphers, BIOs) are kept.
NOTESSSL_clear is used to prepare an SSL object for a new connection. While all settings are kept, a side effect is the handling of the current SSL session. If a session is still open, it is considered bad and will be removed from the session cache, as required by RFC2246. A session is considered open, if SSL_shutdown(3) was not called for the connection or at least SSL_set_shutdown(3) was used to set the SSL_SENT_SHUTDOWN state. If a session was closed cleanly, the session object will be kept and all settings corresponding. This explicitly means, that e.g. the special method used during the session will be kept for the next handshake. So if the session was a TLSv1 session, a SSL client object will use a TLSv1 client method for the next handshake and a SSL server object will use a TLSv1 server method, even if SSLv23_*_methods were chosen on startup. This will might lead to connection failures (see SSL_new(3)) for a description of the method's properties.
WARNINGS
RETURN VALUESThe following return values can occur:
SSL_new(3), SSL_free(3), SSL_shutdown(3), SSL_set_shutdown(3), SSL_CTX_set_options(3), ssl(3), SSL_CTX_set_client_cert_cb(3) | ||||||||||||||||||||


Hello! It's a little snippet which is applied to each
<span>
0
seconds ago
5
seconds ago
I'll change each second!