-
CCBC-1429: Fixed positional parameters for query/analtyics:
-
reverts behaviour
lcb_cmdquery_positional_param
andlcb_cmdanalytics_positional_param
to append single JSON-encoded value to arguments array. -
introduces new functions
lcb_cmdquery_positional_params
andlcb_cmdanalytics_positional_params
that accept all positional arguments at once as JSON-encoded array. -
document, that old functions will emit compiler warning since 3.3.0 release and will be removed later.
-
-
CCBC-1428: Clear callback upon error in
lcb_search
. -
CCBC-1454: Fixed compiler warning in
lcb_getreplica
. -
CCBC-1453: Refactored local name caching in
lcbio_cache_local_name
to simplify the code and eliminate compiler warnings. -
CCBC-1451: Fixed strdup usage, in some cases the compiler might choose
strdup
to returnint
instead ofchar *
which might lead to memory issues. -
CCBC-1448: Fixed cmake macro for examples. The macro
ADD_EXAMPLE
now correctly updates header directories for generated target. -
CCBC-1445: Always invoke callbacks for pending HTTP operations. When destroying
lcb_INSTANCE
make sure that all HTTP requests (views, query, search, analytics) will have their callbacks invoked. -
CCBC-1438: Fixed frame size for mutations with durability. Counter, Store and Subdoc mutations were sending incorrect frame size of durability encoding, which led to rejection of the command by the server.
-
Various improvements and fixes in test and build infrastruture
-
CBCC-1280 Support for OpenTelemetry tracing.
Tracing updated to allow for an external tracer that creates and finishes spans, adds tags, destroys spans. Also, spans now have the notion of being the 'outer' span. That is the span that has all the outer span tags, and is the one whose duration is used to determine whether or not the operation has exceeded the threshold if the ThresholdLoggingTracer is used.
If you pass in a parent that is an outer span, you must call
lcbtrace_span_finish
yourself. When an operation begins, if there is no parent span passed in, or if there is but it isn't an 'outer' span, then the operation creates the outer span itself. See/examples/tracing/otel_tracing.cc
for an example. -
CCBC-1362: Support for metrics.
When enabled, by default will output a histogram of latencies for various kv operations plus query, search, analytics and view queries.
If desired, an external metrics collector can be passed in when the instance is created, which will then be called with latencies for each operation. This can be used to call into an opentelemetry meter for aggregation and export. See
/examples/metrics/otel_metrics.cc
for an example. -
CCBC-1421: Allow empty path for subdocument array methods.
-
CCBC-1417: Depecate CAS usage with counter operation.
-
CCBC-1418: Map query error 13014 to
LCB_ERR_AUTHENTICATION_FAILURE
. -
CCBC-1357: Allow to preserve expiration with Replace, Upsert and MutateIn operations.
-
CCBC-1384: Allow the operations to be deferred until the instance will be connected to cluster.
-
CCBC-1410: Refactor dynamic authenticator. NOTE: this API still volatile and might be changed in future.
In order to improve UX and allow caller to implement credential caching the API for authenticator was revised:
-
instead of separate callbacks for username/password, now it uses single callback
-
in the callback, the caller can figure out the reason of credentials request using
lcbauth_credentials_reason()
-
the caller can signal that it failed to retrieve credentials from external provider, and set result with
lcbauth_credentials_result()
. In this case the SDK will not retry the operation.
-
-
CCBC-1413: Skip
SELECT_BUCKET
packets waiting retry queue. -
CCBC-1169: Request copy from active vbucket for
get_all_replicas
operation. -
CCBC-1406: Fill in prepared statement handle on retry.
-
CCBC-1405: Remove const from command cookie.
-
CCBC-1402: Fix parsing JSON primitives as query rows.
- CCBC-1398: Parse and use
revEpoch
from configuration in order to allow the server to handle special cases of failover scenarious. - CCBC-1399: Implement retry backoff for query requests. Instead of retrying requests immediately, use backoff period returned by retry strategy.
- CCBC-1400: Fill collection name when retrying collection resolution to avoid misrouting requests to default collection.
- CCBC-1397: Reset list of "used" nodes when retrying query to allow reusing endpoints.
- CCBC-1401: Fix special error message detection for Query requests. In addition to reacting on the error codes from query service, the library also scans error messages for particular sub-strings to decide whether retry is necessary.
- CCBC-861: Purge pipelines on
lcb_destroy
. In order to avoid resource leaks, the library purges all pending (or waiting) commands from the pipelines upon destruction. - Fix
cbc-proxy
tool. - Upgrade snappy to 1.1.8
- CCBC-1396: Fix recalculaton of key length for alt packets.
- CCBC-1395: Parse configuration revision as
int64_t
. - MB-45759: Allow building libcouchbase with external Snappy
- CCBC-1386: remove legacy options for
cbc-bucket-create
- CCBC-1394: Do not expose
LCB_ERR_BUCKET_NOT_FOUND
in operation callbacks. Instead retry operation automatically until timeout. - CCBC-1330: cbc. detect unknown collection during "populate" phase
- CCBC-1373: Do not send collection in the key. Sending collection specification in both key and body breaks protocol, and the server will close the socket
-
CCBC-1382: Return
LCB_ERR_CAS_MISMATCH
for operations with with REPLACE semantics instead ofLCB_ERR_DOCUMENT_EXISTS
. -
CCBC-1389: Fixed default collection parsing.
-
CCBC-1383: Fixed protocol magic for durable remove. When durability level provided, the remove command should use "alternative request" as protocol magic byte.
-
CCBC-1381: Protocol changes for
PROTOCOL_BINARY_CMD_COLLECTIONS_GET_CID
(0xbb
). The server now expects collection specification passed as a command value during collection ID resolution. -
CCBC-1385: Restrict cases when Query error code
12009
is converted toLCB_ERR_CAS_MISMATCH
. Now it returned only in cases where concurrency problem detected by query engine. OtherwiseLCB_ERR_DML_FAILURE
will be used. -
CCBC-1373: Return
LCB_ERR_TIMEOUT
if the library is not able to resolve collection identifier. Previously eitherLCB_ERR_COLLECTION_NOT_FOUND
orLCB_ERR_SCOPE_NOT_FOUND
might be returned. -
CCBC-1109: When dynamic authenticator is being used, the library will retry Query on error code
13014
(datastore.couchbase.insufficient_credentials
). -
CCBC-1392: Query commands now invoke retry strategy hook to make decision about retrying.
-
CCBC-1379: Error map could be disabled now using
LCB_CNTL_ENABLE_ERRMAP
or in the connection string withenable_errmap=false
. -
CCBC-1269: Expose setting for N1QL grace period. This is a port of CCBC-1122 (71b77007be9d0304aaf61c7da5768175cc6d91f4). The example below will add extra 100ms to each N1QL query:
lcb_cntl_setu32(instance, LCB_CNTL_N1QL_GRACE_PERIOD, 100000);
- CCBC-1376: propagate scope qualifier to prepare statements
- CCBC-1283: add analytics support for scopes
- CCBC-1374: reintroduce input error classification macro
- CCBC-1375: translate query errors when scope/collection missing
- CCBC-1368: fix project links in README
- CCBC-1366: do not cache bucket-less configurations
- CCBC-1363: allow using parent project's
hdr_histogram_static
target - CCBC-1361: allow
"_default._default"
collection for pre-collections servers - MB-42884: correctly define
FILEVERSION
for libcouchbase.dll - CCBC-1351: option to render cbc-ping output as a table
- CCBC-1323: return
LCB_ERR_DOCUMENT_EXISTS
only for insert operation - CCBC-1346: return
LCB_ERR_DOCUMENT_LOCKED
for locked documents
- CCBC-1350: Implement an option for cbc-n1ql to control prepared/adhoc switch
- CCBC-1345: Ensure all KV sockets select bucket on lcb_open
- CCBC-1348: Include bucket name into diag report
- CCBC-1308: Define FATAL and TRANSIENT classes for errors. Also defines corresponding macros for easy access
LCB_ERROR_IS_TRANSIENT
andLCB_ERROR_IS_FATAL
- CCBC-1342: Check if collections supported by server before using them.
- CCBC-1334: Preserve status of KV protocol response for retry queue
- CCBC-1339: Do not relocate get with replica on failover. The library should not relocate replica reads when new configuration applied.
- CCBC-1344: Consume response after retried command to avoid logging the command as "timed out"
- CCBC-1343: Do not schedule NMV immediately by default and use retry strategy instead.
- CCBC-1335: Fix next timeout computation on requesting config using
operation_timeout
instead ofconfig_node_timeout
- CCBC-1337: Expose setting for to control default search timeout
- CCBC-1331: Fix error at bootstrap callback, now it returns original error code, that caused the bootstrap failure.
- CCBC-1333: Allow setting
lcb_cmdget_locktime
to zero to use server default time. - CCBC-1324: define HTTP type for Eventing management
- Retry operations when the node is not ready
- Report LCB_ERR_BUCKET_NOT_FOUND if Key/Value service is not configured
- Update error codes for Query. Translate code 4300 to
LCB_ERR_PLANNING_FAILURE
and 5000 toLCB_ERR_INTERNAL_SERVER_FAILURE
by default. - Fix collection validation, it should pass empty string as valid collection specification element.
- Remove verbosity and mcversions commands. These parts of API are non-standard and volatile
- Bundle HdrHistogram_c v0.11.2 and allow to fall back to it
- Build and stability improvements
- CCBC-1311: Implement
create_as_deleted
subdoc feature. - CCBC-1263: Update ping to report analytics as analytics service instead of query
- CCBC-1175: Allow to specify timeout for
lcb_ping
- CCBC-1262: Add accessor for
report_id
in ping report - CCBC-1176: Rename "scope" to "namespace" in ping report (also deprecate
lcb_respping_result_scope
in favour tolcb_respping_result_namespace
) - CCBC-1261: Set namespace length of service in ping report to zero if not applicable
- CCBC-1194: Add extra checks for socket state in
lcb_diag
to avoid invalid access issues - CCBC-1314: Extra checks for socket state in
lcb_ping
to avoid invalid access issues - CCBC-1316: Fix two-step bootstrap (
lcb_connect
+lcb_open
) for memcached bucket.
- CCBC-1307: allow to select any mechanisms for SASL regardless network protocol being used.
But by default, try to avoid downgrading to PLAIN on non-TLS connections. Also the change allows to specify list of
preferred mechanisms instead of only one (use comma in the value of
sasl_mech_force
connection string option). - CCBC-1276: allow to hint flex index usage in query options
- CCBC-1312: fix return values for
lcb_cmdquery_scope_*
- CCBC-1313: replace
std::random_shuffle
withstd::shuffle
(fixes build ofcbc-n1qlback
tool)
- CCBC-1281: Implement scope qualifier for queries
- CCBC-1301: expose cmake option to help dissecting TLS traffic
- Detect configuration change when replica indexes changed.
- CCBC-1265: enable out of order execution by default
- CCBC-1189: Validate collection and scope names early. The library will return error if the collection name is not valid without sending command to the server.
- CCBC-1278: Fix stripping payload over TLS connection. The library might propagate zero return code from recv() even when previous calls of recv() successfully transferred bytes to SSL context. In this case we might lose these trailing bytes and just close the socket.
- CCBC-1264: Fix calculating key size when durability level specified
- CCBC-1258: fix port order in vbucket diff info message
- CCBC-1274: Fix pointer casting in HTTP callback of cbc tool.
- CCBC-1167: Fix tests build on MacOS
- CCBC-1248: Always request error map feature and send HELLO message to speedup bootstrap
- Implement tick for IOCP plugin on Windows
- Improved build on Windows (fixed static build, and PDB installation)
- Fix collections issues for future server release
- CCBC-1200: Retry bootstrap on missing bucket until timeout. Bootstrap timeout controlled by "
config_total_timeout
" in connection string orLCB_CNTL_CONFIGURATION_TIMEOUT
- CCBC-1190: Fix automatic retries for temporary failures from the server.
- CCBC-1158: Fix retrying on unknown collection.
- CCBC-1254: Use separate option for default timeout of analytics queries (connection string
"analytics_timeout"
). - CCBC-1178: Do not allow to set CAS for upsert and insert operations
- CCBC-1156: Fix enum value for analytics type of HTTP request
- CCBC-1251: No longer log error when using GCCCP on pre-6.5
- CCBC-1234: Fixed SRV resolution to work with large record sizes.
- CCBC-1222: Tracing thresholds for query and search in connection strings. Now they are correctly spelled as
tracing_threshold_search
andtracing_threshold_query
. - CCBC-1187: Ensure
lcb_respexists_is_found
does not true for deleted documents. - CCBC-1233: Updated RTO to independently specify
operation_name
. - CCBC-1205: Do not include trailing zero for endpoint length for KV context
- CCBC-1215: Fixed segfault in exists calls.
- CCBC-1218: Fixed intermittent segfault in client durable store
- Documentation issues addressed (CCBC-1240, CCBC-1243, CCBC-1241, CCBC-1245)
- CCBC-1188: cbc-pillowfight: fixed
--collection
switch. - CCBC-1173: Fix exporting
lcb_cmdquery_consistency_token_for_keyspace
- CCBC-1168: expose
max_parallelism
for query - CCBC-1171: expose
profile
option for query - CCBC-1170: expose
scan_wait
option for query - CCBC-1159: Fix error codes for Management API
- MB-37768: Don't override
CMAKE_INSTALL_RPATH
. - CCBC-1208: Add a fail-fast retry strategy.
- CCBC-1209: Rename functions of embedded
http_parser
to avoid name clash. - Remove use of deprecated function
std::random_shuffle
.std::random_shuffle
is deprecated in C++14, removed in C++17. Replace withstd::shuffle
. - Fixed several issues reported by coverity
- CCBC-1152: Enable
SCRAM-SHA*
SASL by default. - CCBC-1153: Renamed
lcb_wait3
tolcb_wait
. - CCBC-1147: Return
LCB_SUCCESS
forlcb_exists
when the document is missing.lcb_respexists_is_found
should be used on its response object to check the presense of the document. - CCBC-1152: Do not allow to use SASL PLAIN on non-TLS connections. Compiling libcouchbase with OpenSSL is strongly recommended.
- CCBC-1032: Use operation node to resolve collection and return timeout when collection cannot be resolved
- Added shortcut for query options to request metrics
- Do not fallback to single subdocument API when only one specification passed to
lcb_subdoc
. - CCBC-1137: Allow to retrieve error context for HTTP response (
lcb_http
API) - CCBC-1145: Expose endpoints in error context.
- CCBC-1146: Expose user-cookie in retry handler.
- CCBC-1148: Added NULL checks for enhanced error info.
- CCBC-1075: Renamed "FTS" to "SEARCH" in the APIs.
- CCBC-1073: Renamed "N1QL" to "QUERY" in the APIs.
- Fixed bucketless bootstrap for Server 6.0.
- Fixed various memory leaks. Improved build, testing and packaging systems.
- CCBC-1066: Update retry framework to retry handling RFC
- Reorganize error handing according to RFC. Expose error context object.
- CCBC-1123: migrate exists function to
GET_META(0xa0)
- CCBC-1141: Map
MULTI_PATH_FAILURE
to success code for subdocument - CCBC-1126: Ensure KV connection select bucket when needed
- CCBC-1127: Fix extlen for subdocument
- CCBC-1101: Fix location of plugins for debian systems
- Use per-operation timeout when deriving durability timeout
- Remove durability support from GET operation
- Rename payload setters/getters for queries
- Fix setting empty path to subdoc mutation
- Remove old flush command
- Do not use classic authenticator for cluster instances
- Allow to set CAS value for counter operations
- Views: extend lifetime for content type string object
- CCBC-1112: Send durability timeout in network byte ordering. This was being sent in host byte ordering before, which failed on some platforms.
- Validate getreplica options before collection resolving. It allows to fail faster if the options are not correct for the command.
- CCBC-1136: use
uint64_t
instead of type aliases for CAS - Fix const access specifier for logger API
- Fix warnings reported by compiler and static analyzer
- Fix leaks reported by memory sanitizer tools
- Add cbc commands for search and analytics queries
- Do not insert date in generated lexer (
cbc-gen
)
- Renamed FTS function
lcb_cmdfts_query
tolcb_cmdfts_payload
. This is done because in next beta release, the first function will modify only query part of the payload. - Updated full document commands implicit in subdocument API. Instead of exposing fulldoc GET,REMOVE,UPSERT,INSERT,REPLACE sniff the path argument to GET,REMOVE and REPLACE (with store semantics) and fall back to fulldocument operations if the path is empty.
- Implemented accessors to control subdocument store symantics:
lcb_cmdsubdoc_store_semantics
- Add accessor to access deleted for subdoc:
lcb_cmdsubdoc_access_deleted
- Updated build scripts to require compiler to support at least C++11.
- Renamed KV command accessors from
*_expiration()
to*_expiry()
. - CCBC-939: Performance improvement in tracing subsystem by avoiding copies for network addresses and system tags
- Report reasons of
lcb_open
failures in the logs. - Do not fallback to "default" bucket in the cluster mode.
- Implemented function to test for end of stream of replica responses:
lcb_respreplica_is_final
- Fixed key size calculation for
lcb_getreplica
. - Made ciphers and minimum TLS version tunable. New environment variables could be defined to control openssl
initialization:
LCB_SSL_CIPHER_LIST
to pass toSSL_CTX_set_cipher_list
LCB_SSL_CIPHERSUITES
to pass toSSL_CTX_set_ciphersuites
LCB_SSL_MINIMUM_TLS
with supported values ("tlsv1.1"
,"tlsv1.2"
and"tlsv1.3"
) to configure flags forSSL_CTX_set_options
- Removed multi-ctx from public API. The feature will re-appear in future releases in the shape, that is more consistent with other APIs.
- CCBC-1090: Handle
GET_COUNT
as lookup subdoc operation - CCBC-1088: Renamed
lcb_cmdsubdoc_operations
tolcb_cmdsubdoc_specs
(also renamedlcb_SUBDOCOPS
tolcb_SUBDOCSPECS
) - CCBC-1092: add count/interval options for cbc-ping
- Remove CAS durability polling. New server-side durability means must be used instead, or polling using mutation-token.
- Encapsulate create options into
lcb_CREATEOPTS *
. Seelcb_createopts_create
function. - Refactored logger. See
example/minimal/logger.c
example - CCBC-1086: Renamed
LCB_STORE_ADD
and removeLCB_STORE_SET
- CCBC-1079: Renamed instance option from
fetch_mutation_tokens
toenable_mutation_tokens
. Enable mutation tokens by default. - CCBC-1091: Set
HAVE__FTIME64_S
when not running tests - CCBC-1069: Don't hardcode path prefix for analytics
- Renamed
cbc-bench
tocbc-gen
, and implemented workload type selector and batch support (seetools/bench-script.txt
). - Various API fixes and cleanup
- Do not fallback to static config automatically. Now when we have G3CP mechanism, we can make static config fallback optional. In case of older server, connection string option
allow_static_config=true
orLCB_CNTL_ALLOW_STATIC_CONFIG
to use previous behaviour. - CCBC-983: Even more asynchronous example for libuv
- Don't log if the logger callback is not specified
- 3GCP improvements and examples
- Fix memory leak in collections wrapper
- Implement setter for prettiness of N1QL response payload.
- CCBC-1059: Fixed hostname truncation when using alt-network
- Add bucket to the connection config cache. When
config_cache
orLCB_CNTL_CONFIGCACHE
argument is a directory (ends with/
), the library will use a bucket name as the file name, so that different buckets can use the same connection string options set. - Add missing timeouts for HTTP APIs.
- CCBC-1058: Fix some casting warnings on Mac OS.
- Do not build cbc-bench if compiler does not support C++11
- CCBC-1034: Do not enable collections automatically. When user disabled collections, the library should not enable it automatically
- CCBC-1024: per-operation KV timeouts
- CCBC-1057: Support enhanced prepared statements
- Allow to specify
client_context_id
for N1QL query - GCCCP (G3CP) implementation
- CCBC-1056: Workaround for
H_collections_get_cid
segfault due to NULL ext field in response - CCBC-983: Example for external libuv loop
- Implement better benchmarking tool (cbc-benchmark):
- smooth workload generator (no saw-shaped graph)
- better support of writes with durability
- interactive shell
- CCBC-1052: remove spatial views from API
- CCBC-600: Use bucket not found error if select bucket fails
- CCBC-1055: use
lcb_assert
wrapper instead of assert(3). Do not include assert.h if NDEBUG defined - CCBC-866: track invalidated
active_provider_list
using unique ID
- Removed debug output.
- CCBC-1030: Derive value of durability timeout from KV operation timeout.
- CCBC-1037: Implement
lcb_exists
as lightweight way to check if document exists. - CCBC-1040: Use aspend counter for ingest queries only (solves inifinite wait for regular analytics queries)
- CCBC-1036: Add support for durableWrite for
cbc-pillowfight
(see--durability-level
switch) - Fix network IO when running openssl 1.1.1b (solves infinite loop on reading data from sockets).
-
CCBC-1017: Removed v1,v2,v3 APIs.
Migration path: New API have to used. Instead open structures, setter-functions available.
-
CCBC-655: Removed
retry_backoff
setting. This is a redundant property, as the wait period is alwaysretry_interval * retry_backoff * num_attempts
. In this case,retry_interval
itself can be specified asretry_interval * retry_backoff
as a single setting.Migration path:
- if the application used
"retry_backoff"
setting via connection string orlcb_cntl_string()
, it should remove that call, and set only"retry_interval"
with new value equalretry_interval * retry_backoff
(the value is time in seconds represented as floating point number). - if the application used
LCB_CNTL_RETRY_BACKOFF
setting vialcb_cntl
, it should remove that call, and set onlyLCB_CNTL_RETRY_INTERVAL
with new value equalretry_interval * retry_backoff
(the value is time in microseconds represented as unsigned 32-bit integer).
- if the application used
-
CCBC-465: Removed
lcb_error_callback
and related function to get and set it for the instance.Migration path: the application should use
lcb_bootstrap_callback
instead. -
CCBC-466: Removed
lcb_get_last_error
. This function is deprecated and its use can result in false positives, true negatives. Most internals do not setlast_error
, and because there may be multiple things going on within the library, getting the last error does not make sense.Migration path: only arguments/fields in operation and bootstrap callbacks should be used.
-
CCBC-463: Removed syncmode. This simplifies internals of the library, Synchronous mode was never implemented for REST server APIs, or for new subdocument features, and was deprecated.
Migration path: use
lcb_wait()
andlcb_wait3()
to implement synchronous interaction. -
CCBC-863: Removed
lcb_configuration_callback
and related functions. This API has been superseded by bootstrap callback, which can not just signal about configuration update, but also provide errors code.Migration path: the application should use
lcb_bootstrap_callback
instead. -
CCBC-467: Removed
lcb_verify_struct_size
and related definitions. These functions have not been widely used or maintained. Their purpose was to assist applications in verifying the structure sizes used by the library conformed to that of what their application was expecting. However in reality the structure sizes rarely changed, and when they did change, they only changed in compatible ways so that applications compiled against older versions would never break anyway.Migration path: If the application directly call this API, all the calls could be safely removed.
-
CCBC-468: Removed
lcb_timer_t
API. The timer API was never really used and should have always been private (its use came in before we started having 'interface attributes' within the library).Migration path: Remove all usages of timer API function and structures. If they are necessary, consider using external IO loop, and use its timers API (see
lcb_create_io_ops()
). -
CCBC-864: Removed
lcb_flush_buffers
. This function does nothing.Migration path: Remove all usages of this function.
-
CCBC-865: Removed old-style setting accessors. They were implemented before
lcb_cntl
, and should not be used.Migration path: the following list represents mapping between old accessors and their
lcb_cntl
equivalents:old new lcb_behavior_set_ipv6
lcb_cntl(LCB_CNTL_SET, LCB_CNTL_IP6POLICY)
lcb_behavior_get_ipv6
lcb_cntl(LCB_CNTL_GET, LCB_CNTL_IP6POLICY)
lcb_behavior_set_config_errors_threshold
lcb_cntl(LCB_CNTL_SET, LCB_CNTL_CONFERRTHRESH)
lcb_behavior_get_config_errors_threshold
lcb_cntl(LCB_CNTL_GET, LCB_CNTL_CONFERRTHRESH)
lcb_behavior_set_timeout
lcb_cntl(LCB_CNTL_SET, LCB_CNTL_OP_TIMEOUT)
lcb_behavior_get_timeout
lcb_cntl(LCB_CNTL_GET, LCB_CNTL_OP_TIMEOUT)
lcb_behavior_set_view_timeout
lcb_cntl(LCB_CNTL_SET, LCB_CNTL_VIEW_TIMEOUT)
lcb_behavior_get_view_timeout
lcb_cntl(LCB_CNTL_GET, LCB_CNTL_VIEW_TIMEOUT)
-
CCBC-1008: jsoncpp: use
unique_ptr
instead ofauto_ptr
. -
CCBC-1011: Port vbucketkeygen tool to cbc-keygen. The tool generates list of keys, that distributed over all vBuckets in the bucket.
-
CCBC-1006: Cleanup pending queue of pipeline on retry
-
CCBC-1007: allow using trusted store path without key file
-
MB-31875: cliopts: grow list only if needed
- Fixed incorrect header-guard for analytics.h, which might affect API
visibility (when included before
libcouchbase/n1ql.h
)
-
CCBC-997: Extract analytics queries into separate file, and expose new API as set of
lcb_analytics_*
functions. -
CCBC-992: KV ingest mode for analytics. Ingestion mode a way to funnel analytics results back into the KV layer through mutation.
-
CCBC-991: Analytics Deferred Queries. Deferred queries allow to decouple the execution of an analytics query from actually fetching the results. This is very important for queries that take a long time to complete.
-
CCBC-1004: Fix request counting for CAS-observe. Incorrect mapping server indexes during scheduling observe requests might lead to crashes on multi-node clusters.
-
CCBC-1005:
select(2)
-based IO plugin: always use expiration when usinglcb_tick_nowait
function to avoid waiting for IO events. -
Updates in testing infrastructure
-
CCBC-982: Support analytics for N1QL service in
lcb_ping3
. -
CCBC-989: Write bucket capabilities into config cache, so that the client which was bootstrapped from the cache will be able to reason about features availability (e.g. views).
-
CCBC-987: Document tracing options for cbc tools.
-
CCBC-988: Update cbc-pillowfight to work with by-id collections. It still does not use any changes in protocol yet. The collection API will be exposed in 3.0 release.
-
CCBC-980: Make idle timeout for HTTP pool tunable
-
CCBC-977: Update documentation analytics. Add example demonstrating analytics queries
-
CCBC-968: Improve log message for
SELECT_BUCKET
onEACCESS
. Add note saying that this error code might be because of missing bucket. -
CCBC-976: Keep HTTP connections pooled after
lcb_ping3
-
CCBC-975: Make sure kv service is only enabled if in nodes list.
-
CCBC-972: Fix memory issues reported by valgrind
-
CCBC-973: Correctly convert non-null terminated tag buffers to
Json::Value
-
CCBC-970: Update list of retriable errors for analytics
-
CCBC-965: Update log level in config cache provider
-
CCBC-967: optimize Threshold Tracer queues/sorting
-
CCBC-963: remove global state from random generator, and make it thread-safe.
-
CCBC-966: return current network for LCB_CNTL_NETWORK
-
CCBC-969: Allow to skip version from git tags
-
CCBC-961: Add examples for FTS queries
-
CCBC-971: disable dead socket detection for older libuv (fixes build on platforms, where old libuv-dev package installed).
-
Report HELO features to logger in the single line.
-
Allow to select compression mode in connection string. This might be useful for debugging purposes. For example, to bypass inflation step when receiving data.
$ CONNSTRING=couchbase://localhost/default?compression=deflate_only $ cbc cat -U $CONNSTRING 00000000.json > bindoc.dat 00000000.json CAS=0x15431f831dc60000, Flags=0x0, Size=739, Datatype=0x03(JSON,SNAPPY)
-
CCBC-955: Parse uint32 as unsigned ints instead of timeouts. Some settings were interpreted as time values, while they should not (e.g. console_log_level, compression_min_size etc). This issue forced the library to misinterpret user input (converter was multiplying all values to 1000000, e.g. log level was always TRACE).
-
CCBC-957: Automatically disable SSL support, when OpenSSL is unavailable.
-
CCBC-954: Define EFTYPE error code if it does not exist. Fixes support of libuv 1.21 and higher.
-
CCBC-951: Remove experimental warning from subdoc API.
-
CCBC-948: Consider retry queue with only 0xb5 as empty. This allows a breakout from lcb_wait earlier (when application operates in synchronous style). The old behavior, where lcb_wait does not breakout until the library gets the first successful configuration, still can be restored with
lcb_cntl(..., LCB_CNTL_WAIT_FOR_CONFIG, ...)
. -
CCBC-939: Optimize the performance of built-in tracer. It now uses sllist for tags container instead of Json::Value.
-
CCBC-958: Check tracing span tags argument more pedantically and return error if arguments are not valid.
-
CCBC-956: Combine operation id and name into single field in the threshold tracer.
-
CCBC-949: Do not hardcode libevent dependencies in DEB packages. Instead let
dh_shlibdeps
script to detect dependencies for each platform. This fixes a usless dependency on libevent-1 for ubuntu 18.04. -
CCBC-947: Fix build scripts for examples (when built with
-DLCB_BUILD_EXAMPLES=ON
).
And other small fixes and improvements.
- CCBC-946: Restore broken ABI in 360ea68ef7738d543bbd3feac3f2c3c6c8ff976b
-
CCBC-942: Expose new error codes for subdocument operations.
-
CCBC-866: Check cached provider isn't NULL.
-
CCBC-890: Always check if SSL used when getting ports.
-
CCBC-945: Allow to specify logger in lcb_create().
-
CCBC-935: Display orphan tracer report on WARN log level.
-
CCBC-936: Update default tracing interval to 10 seconds.
-
CCBC-937: Implement support for alternate addresses.
-
CCBC-943: Implement option to dump TCP packets.
This change introduces new cmake option, which will force library to report all incoming/outgoing TCP packets on TRACE log level. It renders the bytes in Base64 encoding.
Also there is simple extraction tool, which beautifies packet traces, and could be used like this:
cbc cat -vvv foo bar 2>&1 | tools/extract-packets.rb
This release is mostly about API visibility bump from uncommited to committed, but also includes several bug fixes.
-
CCBC-930: Dump threshold logging tracer queues before destroying the tracer.
-
Updates in crypto API as per RFC. This basically change of the API (ABI has preserved compatible, but
v0
crypto API will return runtime error with 2.9.0 library. From this release, all encryption key management encapsulated into crypto provider, so it does not need to expose key loader interface. In addition, that user API is changed to conform RFC, and use nounfields
instead ofdocument
(e.g.lcbcrypt_encrypt_fields
). -
CCBC-925: Fix existence checks for registered crypto providers.
-
CCBC-924: Initialize flag for JSON server feature. Otherwise it might be left uninitialized and the library will send JSON datatype to servers, which do not support it.
-
CCBC-917: Add tracing for observe. So now the library will group all CAS-observe operations, and in general will nest observe operations under common parent when
lcb_storedur3
API used. -
CCBC-918: Don't ping KV on nodes without DATA service.
-
CCBC-685: Implementation of SCRAM-SHA{1,256,512} authentication mechanisms for KV service. Support for SCRAM-SHA* SASL auth is disabled by default, because it is not portable, and not every Couchbase service supports it. But if it is necessary, it could be enabled using
lcb_cntl(..., LCB_CNTL_FORCE_SASL_MECH, ...)
operation, or"force_sasl_mech=SCRAM-SHA512"
option in connection string. -
CCBC-919: More granular settings for compression. Now it is possible to specify minimum size of the value to be considered for compression, and also the minimal ratio
(compressed / original)
. SeeLCB_CNTL_COMPRESSION_MIN_SIZE
(or"compression_min_size=100"
in bytes), andLCB_CNTL_COMPRESSION_MIN_RATIO
(or"compression=0.9"
). -
CCBC-916: Do not set JSON datatype if server didn't ack it. Fixes behavior where old server rejecting commands as invalid when compression is enabled.
-
CCBC-923: Allow to disable fast-forward map for NMV handler. See
LCB_CNTL_VB_NOREMAP
("vb_noremap=true"
). This option is disabled by default.
Build improvements:
-
CCBC-915: Fix builds where DEBUG macro is defined
-
CBD-2405: Change target names in conflict with Server targets
-
CCBC-888: Add threshold logging tracer, which tracks and reports above threshold and orphaned operations. This is beta functionality, which is disabled by default. To enable it, use
enable_tracing=on
in the connection string. -
CCBC-910: Field encryption API. The
lcbcrypto_*
functions abstracts encrypted field layout from actual crypto implementations (OpenSSL, libsodium, etc.). The wrapper or application using libcouchbase is expected to connect their own crypto and key providers, while libcouchbase provides transformation of the encrypted data. See sample crypto provider in example/crypto. -
CCBC-904: Remove trailing comma in
lcb_KVBUFTYPE
enum. Fixes build on some older compilers. -
CCBC-907: cbc-n1qlback: Do not require trailing empty line for input.
-
CCBC-908: cbc-n1qlback: Report number of loaded queries.
-
Add ability to write OPS/SEC from cbc-pillowfight to a file
cbc-pillowfight 2> /tmp/stats.txt
or, when writing to terminal required
cbc-pillowfight 2>&1 | tee /tmp/stats.txt
-
Build improvements for easier integration into with server manifest (and TLM project).
-
CCBC-883: Always use built-in compression. It is not possible to unbundle the Snappy library, as libcouchbase uses the C++ API which is not exported in the headers. Also, compression can now work on all types of buffers, including
LCB_KV_IOV
andLCB_KV_IOVCOPY
. This fixes compression incbc-pillowfight
tool. -
CCBC-895: Fix typo in rendering IPv6 addresses in
lcb_diag
. -
CCBC-879: Implement log redaction. When
log_redaction=on
is specified in the connection string, the library will wrap sensitive data in the logs in special tags, which can be processed by thecblogredaction
tool from the server distribution. -
CCBC-893: Updated list of subdoc error codes.
-
CCBC-892: Enable the SSL trust store to be in a separate file. Trust store has to be specified with option
truststorepath=…
, otherwise the library will expect it to be stored with the certificate incertpath=
. -
CCBC-888: Per operation tracing. When compiled with tracing support (
cmake -DLCB_TRACING=ON
), the library will expose the tracing API, which allows to measure time of every data operation, and include some extra information. The API is modeled after OpenTracing and allows one to write custom tracers to consume this information. For more information, see an example in example/tracing/tracing.c. This is uncommitted API at this time.Also this feature includes support for new type of the server responses, which include time spent to execute the KV command on the server. This feature controlled by
enable_tracing
option in connection string orlcb_cntl(..., LCB_CNTL_ENABLE_TRACING, ...)
. -
Added basic support of JSON datatype. The library will negotiate a mode, in which the application will see
LCB_VALUE_F_JSON
flag on datatype field of the response in the operation callback, if the cluster detected the content of the document to be valid JSON. Also the application can send this flag on the outgoing documents to notify the server about payload format. -
Refresh dtrace/systemtap integration. Also adds tapset for SystemTap to simplify access to trace points.
-
cbc-pillowfight improvements and changes:
- dump diagnostics on
SIGQUIT
(CTRL-\ in terminal). - with
-J
/--json
, the JSON datatype will be sent on the documents. - enable randomized document bodies with
-R
/--random-body
switch. - durability checks for pillowfight with
--persist-to
/--replicate-to
. - pessimistic locking of keys before updating with
--lock
. - when requesting timings with
-T
/--timings
, the application will no longer dump them periodically.Instead it will await for the user to signalSIGQUIT
and also dump them on exit. The old mode of reporting regularly is enabled by repeating the switch more than once (e.g.-TT
).
- dump diagnostics on
-
Added the cbc-watch command to monitor server stats. By default it tracks
cmd_total_ops
,cmd_total_gets
andcmd_total_sets
updating stats once a second, and displaying diff with the previous value.
-
CCBC-880: Implement x.509 client certificate authentication. Connection string must use TLS-enabled scheme (
couchbases://
orhttps://
) and set optionscertpath
andkeypath
. For example,couchbases://127.0.0.1?certpath=/path/to/chain.pem&keypath=/path/to/client.key
Read more at server docs: https://developer.couchbase.com/documentation/server/5.0/security/security-x509certsintro.html
-
CCBC-883: Revisit builtin compression implementation (snappy). Add compression to cbc tools (see
--compress
,-y
options). Future versions of Couchbase Server will have end-to-end compression. -
CCBC-885: Do not skip HTTP Basic authentication when password is empty.
-
CCBC-876: Make sure that server authority is always specified. In some cases, when libcouchbase generates vbucket configuration or data service is not available, the authority of the server might be NULL. This could cause issues, as we compare servers from configs using their authority fields.
-
CCBC-878: Support collections in cbc-pillowfight.
Note that this change does not expose anything related to Collections API for libcouchbase. It defines hidden switches for pillowfight tool to allow benchmark of collections. The switches are not documented and might be removed in the future. Use with care.
Generate only
beer:<seqno>
keys:cbc pillowfight --separator : --collection beer
Using many --collection will alternate in generating
beer:<seqno>
,brewery:<seqno>
keys (default separator is ":"):cbc pillowfight --collection beer --collection brewery
-
CCBC-801: Expose information about network IO for monitoring. The diagnostics exposed as string with encoded JSON object.
void diag_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *rb) { const lcb_RESPDIAG *resp = (const lcb_RESPDIAG *)rb; if (resp->rc != LCB_SUCCESS) { fprintf(stderr, "failed: %s ", lcb_strerror(NULL, resp->rc)); } else { if (resp->njson) { fprintf(stderr, "%.*s", (int)resp->njson, resp->json); } } } lcb_install_callback3(instance, LCB_CALLBACK_DIAG, diag_callback); lcb_CMDDIAG cmd = { 0 }; lcb_diag(instance, NULL, &cmd); lcb_wait(instance);
-
CCBC-874: Dynamic authenticator. Note that this feature should not be considered at public interface. To use it, application have to define two callbacks, which will return username and password dependending on bucket name and hostname/port of the endpoint.
std::map< std::string, std::string > credentials = { {"protected", "secret"} }; extern "C" { static const char *get_username(void *cookie, const char *host, const char *port, const char *bucket) { return bucket; } static const char *get_password(void *cookie, const char *host, const char *port, const char *bucket) { std::map< std::string, std::string > *credentials = static_cast<std::map< std::string, std::string > *>(cookie); return (*credentials)[bucket].c_str(); } }
and later pass these callbacks to authenticator like this:
lcb_AUTHENTICATOR *auth = lcbauth_new(); lcbauth_set_callbacks(auth, &credentials, get_username, get_password); lcbauth_set_mode(auth, LCBAUTH_MODE_DYNAMIC); lcb_set_auth(instance, auth);
-
Include platform/compiler into client id, which included into HELLO and HTTP requests.
-
Fix parallel build on Linux when dtrace enabled
-
cbc-proxy: proxy N1QL, FTS and Analytics queries using STAT command.
-
CCBC-415: Fixes in IPv6 support. To use IPv6 addresses, the application should connect to IPv6-enabled Couchbase Server, and explicitly switch on option via connection string
ipv6=allow
oripv6=only
, where first variant permits the library to use both IPv6 and IPv4, and the second -- disables IPv4. Alternatively this setting controlled withLCB_CNTL_IP6POLICY
andlcb_cntl
. -
CCBC-872: Metrics management These metrics are intended at providing information on libcouchbase operations performed over the lifetime of the current
lcb_t
instance (processed request packets, processed response packets, request packets pending emission, server errors, server timeouts, misrouted operations, retried operations).Metrics collection is currently disabled by default. To enable metrics collection, the user should call:
int activate = 1; lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_METRICS, &activate);
Access to the collected metrics is done using:
lcb_METRICS* my_metrics; lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_METRICS, &my_metrics);
-
CCBC-870: Fix updating URL on retry. When retrying HTTP request, instead of replacing just
host:port
part of the old URL, the library inserted full URL. -
CCBC-547: Detect dead sockets under libuv.
-
Ensure macros safe by surrounding values with parentheses
-
CCBC-833, CCBC-834: Update real cluster integration in the test suite.
-
CCBC-860: cbc-connstr: Do not zero out C++ instances.
-
CCBC-859: Fix libm shared object detection on Debian 9.
-
Bugs reported by clang analyzer:
- CCBC-858: Fix memory leak for compressed packet.
- CCBC-857: Fix possible NULL pointer dereference in
mcreq_reserve_key
. - CCBC-856: Initialize response struct in
H_config
. - CCBC-855: Fix dead assignments in
contrib/genhash
. - CCBC-854: Init vbguess array before entry lookup.
- CCBC-853: cbc-proxy: do not use client object after free.
- CCBC-852: Do not free memory twice in N1QL index manager.
-
Check nodes number for durability checks. The store with durability requirements will report more specific error when the library cannot fulfill the condition during failover.
- Issues: CCBC-817
-
Handle enhanced error messages for subdoc operations. The subdoc responses will now expose context and reference ID if present.
- Issues: CCBC-846
-
Discover and bootstrap analytics service from cluster configuration.
- Issues: CCBC-840
-
Improve documentation of configuration parameters.
- Issues: CCBC-835
-
Enable Error Map feature by default.
- Issues: CCBC-838
-
Cleanup and extend
minimal
,libeventdirect
,instancepool
examples -
Tools:
- improve error reporting
- experimental subcommand
cbc-proxy
- fix memory leaks
- retry store operations during population phase in
cbc-pillowfight
-
Add support for OpenSSL-1.1.
- Issues: CCBC-814
-
Mask
LOCKED
status code for backward compatibility. This code (as well as others possible codes with 'item-locked' attribute) replaced withLCB_KEY_EEXISTS
forSET
,REPLACE
andDELETE
operations, and withLCB_ETMPFAIL
for the rest.- Issues: CCBC-832
-
Stop enumerating bootstrap nodes and mechanisms when the server returns authentication error.
- Issues: CCBC-825
-
Fixed double free error with
lcb_ping3
.- Issues: CCBC-826
-
Exposed additional N1QL query parameters:
lcb_n1p_readonly
,lcb_n1p_scancap
,lcb_n1p_pipelinecap
.- Issues: CCBC-823
-
Fixed
cbc-subdoc/upsert
without XATTR.- Issues: CCBC-823
-
XERROR attributes synchronized with recent list on server.
- Issues: CCBC-828
-
Add missing documentation, and update stability of the API.
-
Do not throttle background configuration polling by throttle interval of configuration error handler.
- Issues: CCBC-829
-
Turn on background polling by default. The library will try to schedule configuration update every 2.5 seconds. To disable it use
config_poll_interval=0
.- Issues: CCBC-836
-
Implement new function
lcb_ping3
, which sends NOOP-like message to each service in the cluster and allows to measure latency along with health status of the connection. Might be useful for application-side keep-alive mechanisms.- Issues: CCBC-801
-
Detect and expose bucket type through
LCB_CNTL_BUCKETTYPE
:lcb_BTYPE type; lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_BUCKETTYPE, &type);
- Issues: CCBC-790
-
Fixed setting expiration in subdoc mutations.
- Issues: CCBC-799
-
Fixed DNS SRV support of Fedora 26 and FreeBSD.
- Issues: CCBC-816
-
Fixed DNS SRV with SSL connections.
- Issues: CCBC-794
-
Define EREMOTEIO in libuv
- Issues: CCBC-812
-
New subdocument command to remove whole document
- Issues: CCBC-811
-
New cbc command:
cbc-subdoc
. It provides interactive shell, where all subdocument commands accessible to inspect and modify documents in the cluster. -
New cbc command:
cbc-ping
. It sends NOOP-like messages to all accessible services in the cluster, and displays the status along with latency.- Issues: CCBC-801
-
Fix
cbc-cat --replica
, which now allows reading documents from replicas.- Issues: CCBC-820
-
Implement NOOP command and
cbc-pillowfight --noop
, which sends NOOP instead of data manipulation commands.- Issues: CCBC-801
-
Clarify errors found in
.cbcrc
. Now it will display configuration path along with error message.- Issues: [CCBC-759](https://issues.couchbase.com/browse/CCBC-759]
-
Update examples:
- Support username/password in subdoc and libeventdirect examples
- Added example for subdoc XATTRs
-
Integrate fix for parallel build with dtrace on FreeBSD https://github.com/freebsd/freebsd-ports/commit/a71e1a86b851d42cd08319d9b28a4424e508e216
-
Make enhanced errors API public
- Issues: CCBC-803
-
Fixed various compiler and cppcheck warnings and documentation update.
-
Expose enhanced errors for data commands. Couchbase Server 5 might return additional information about errors in the response body. According to SDK-RFC-28, the library allow user code to inspect this information using following functions:
lcb_resp_get_error_context(int, const lcb_RESPBASE *)
lcb_resp_get_error_ref(int, const lcb_RESPBASE *)
They both return non-NULL strings if any of error information accessible. The lifetime of these fields limited by lifetime of the response object.
- Issues: CCBC-781
-
Report contextualized error messages during negotiation. The event reference could be used to find more details about authentication errors in the server logs.
- Issues: CCBC-780
-
Specify correct protocol level for
SO_KEEPALIVE
. This fixes settingtcp_keepalive
option on connections.- Issues: CCBC-798
-
Implement Error Map Retries. This implements the mechanics needed to retry commands on various errors based on dynamic settings supplied via the error map.
- Issues: CCBC-783
-
Add cluster admin provider. This provider doesn't do anything except serve as a source of management hostnames. And the library will fall back to it when bucket is not specified for cluster management connections.
- Issues: CCBC-797
-
Implement RBAC user management in cbc tools. In addition to
examples/users
, this can be a demonstration of new security APIs which appear in Couchbase Server 5.- Issues: CCBC-757
-
Allow to inspect query errors in
cbc-n1qlback
. The command will write details for failed queries to file, specified with option--error-log
. -
Fix memory leak in io::Pool
- Issues: CCBC-791
-
Fix
LCB_SDCMD_GET_FULLDOC
. This would not actually work beforehand because the opcode it's mapped to is 0, and we used 0 as a sentinel value for an invalid opcode within the subdoc implementation.- Issues: CCBC-792
-
Add LCB_NOT_AUTHORIZED error code. This error code maps to Memcached's EACCESS
-
Don't send empty Authorization header for HTTP requests, If there's no username and/or password
- Issues: CCBC-789
-
Internal refactoring:
io::Pool
- remove empty dtor- Fix
BadPluginEnvironment
test on Fedora where libm.so is ld script - Add missing commands for
cbc-help
-
Documentation update:
- Add additional documentation for
lcb_n1ql_cancel()
- Typos
- Add additional documentation for
-
Allow to disable sending the
HELLO
command when connecting to a server. SendingHELLO
will cause a bootstrap failure with Couchbase Server 2.0 and older.- Issues: CCBC-786
-
Fix error return value on reprepared query. Previously an error was returned if a N1QL query was reprepared, because the prior internal failure status was not updated.
- Issues: CCBC-782
-
Check for more N1QL error strings indicating the need to reprepare a statement.
-
Fix uninitialized memory issue when initializing
lcb::Server
andmc_PIPELINE
-
Couchbase 5.0 additions for Subdocument. This adds new protocol extensions for Couchbase 5.0. This consists of:
- New
LCB_SDCMD_SET_FULLDOC
andLCB_SDCMD_GET_FULLDOC
for full-doucument gets and sets via the subdoc API. This allows to access xattrs atomically with the document body. - New 'document flags'. These are in the form of
LCB_CMDSUBDOC_F_
. - Issues: CCBC-774
- New
-
Fix bug where CCCP subsystem would be suspended indefinitely. CCCP subsystem would hang if an error was received for the config request itself.
- Issues: CCBC-779
-
Fix bootstrap with
LCB_TYPE_CLUSTER
. Previously bootstrap would fail because the client would not send proper credentials. Note that at this point, thedefault
bucket must still exist.- Issues: CCBC-778
-
Ignore empty DNS SRV replies. Some buggy DNS configurations return positive replies to SRV queries, but without actually containing any kind of A record as a response.
- Issues: CCBC-776
-
Enable background polling for configuration changes. This allows the client to periodically poll for configuration changes. This feature is disabled by default. You can use the
config_poll_interval
setting to enable it in the connection string.- Issues: CCBC-627
-
Enable TCP Keepalive for newly created sockets. Newly created sockets have TCP keepalive enabled in order to avoid firewalls breaking connections due to inactivity. TCP Keepalive does not yet work for the libuv plugin (e.g. nodejs). You can use the
tcp_keepalive=false
directive in the connection string to disable it.- Issues: CCBC-690
-
Send
SELECT_BUCKET
command by default if server supports it. This enables new-style 'RBAC' authentication by default. In 2.7.3 users were required to useselect_bucket=true
in the connection string to enable this feature. In this version, the option is still available but is now mainly useful to disable it. -
Improve
lcb_AUTHENTICATOR
API. This provides better documentation and some API/design/implementation fixes to the authenticator interface. The authenticator may be useful for integrators/wrappers who wish to correlate multiple credentials with their buckets. Note that the use oflcb_AUTHENTICATOR
is not required for RBAC support. In order to use RBAC, simply make use of theusername
field in thelcb_create_st
struct, or theusername
parameter in the connection string.- Issues: CCBC-751
-
Fix bug where
lcb_get_server_list()
would return NULL.- Issues: CCBC-764
-
Fix bug where client would not recover from failover. Clients from version 2.7.1 through 2.7.3 would not obtain a new cluster map after a node had been failed over (e.g. by hitting the "fail over" button in the UI).
- Issues: CCBC-761
-
Provide the ability to send the
SELECT_BUCKET
when establishing a to a server. This is a building block allowing us to use 'RBAC'/username auth in the future. Note that this requires theselect_bucket=true
option in the connection string or equivalent, and that this feature as a whole is considered experimental.- Priority: Major
- Issues: CCBC-758
-
Provide an option to disable DNS-SRV lookups. Because DNS SRV lookups often result in no result (i.e.
NXDOMAIN
) - which takes longer, allowing to disable such lookups may speed up startup time. This option is available via the connection string, usingdnssrv=off
- Priority: Minor
- Issues: CCBC-756
-
Send client/user-specific identifier in
User-Agent
HTTP header. The library already does this for data nodes (Memcached). Using it in HTTP services allows better supportability when diagnosing issues by reading the HTTP logs.- Priority: Major
- Issues: CCBC-755
-
Fix bug where DNS SRV hostnames would not be used. While DNS SRV lookup was working, the library would not actually attempt bootstrap off those received hostnames.
- Priority: Major
- Issues: CCBC-753
-
Provide experimental Analytics support. This allows access to the Couchbase Analytics Service, available in some pre-release builds. API and syntax wise, Analytics is very similar to N1QL. To use the analytics service, set the
LCB_CMDN1QL_F_CBASQUERY
bit inlcb_CMDN1QL::cmdflags
, and provide the appropriate host:port combination in thelcb_CMDN1QL::host
field. - Currently, analytics support is not used in the cluster map/configuration.- Priority: Major
- Issues: CCBC-734
This release consists of additional internal refactoring and some improved logging messages. There is enhanced experimental XATTR support. This release also contains some bug fixes:
-
Fix build issues on FreeBSD. This allows normal BSD
make
to be used, rather than forcinggmake
-
Fixed broken JIRA link in README
-
Fix hanging SSL connections in IOCP/Completion mode. This would sometimes stall the connection by not requesting a write if a read was in progress. This would result in the command not being sent and the client hanging. Note that this only affects completion-style I/O plugins such as IOCP and libuv.
- Issues: CCBC-744
-
Rename
LCB_SDSPEC_F_VIRTPATH
toLCB_SDSPEC_F_MACROVALUES
.VIRTPATH
is intended for possible future materialized XATTRs. -
Add
LCB_SDSPEC_F_XATTR_DELETED_OK
, which maps to the protocol flag of roughly the same name.
This release consists of additional internal refactoring. More internals have been converted to C++.
-
Provide XATTR (Extended Attribute) prototype support. This provides a prototype implementation of xattrs, allowing the client to access extended (hidden) attributes of a document. This feature can be used on the client side by simply setting the
LCB_SDSPEC_F_XATTRPATH
bit in thelcb_SDSPEC::options
field.- Issues: CCBC-728
-
Add automatic DNS SRV record lookup when simple hostname supplied. The library will now automatically attempt to look up SRV records for various couchbase services if only one host is present in the connection string. Automatic lookup will not be performed if more than a single host is provded. See the Java Documentation on the matter (go to the bottom of the page).
- Issues: CCBC-566
This release consists mainly of internal refactoring. Many of the internals have been 'upgraded' to C++
-
Fix bug in pillowfight where large value sizes would cause a segfault.
- Issues: CCBC-727
-
Allow 64 bit values with
cbc-incr
andcbc-decr
.- Issues: CCBC-716
-
Fix encoding in
lcb_n1p_setconsistent_token
. This function would encode it asscan_vector
but it should bescan_vectors
. -
Refactor negotiation internals to use C++. This is part of an internal refactoring to move our internals over to C++. This will make the code more manageable and extendable in the future.
-
Fix memory corruption for some JSON APIs when no rows are returned. This fixes a bug where the JSON parser would read from garbage memory when parsing a response that had no rows, but due to a slow network, would be received in multiple chunks. This affects N1QL, CBFT, and View APIs.
- Priority: Major
- Issues: CCBC-721
-
Allow to adjust bytes to read per event loop iteration. This allows applications with high network throughput but low CPU capacity to prevent the library from oversaturating a specific event callback invocation or starve other sockets. It may be controlled through the
read_chunk_size
connection string option or vialcb_cntl_string
.- Priority: Major
- Issues: CCBC-568
-
Use
htonll
for CAS values. This allows a consistent representation of CAS values regardless of underlying platform. This allows interoperability between other SDKs with respect to exchanging CAS values. This however may break interoperability with older versions of the same SDK, if the CAS value is being passed around (which it shouldn't be). -
New subdocument additions. This adds the
LCB_SUBDOC_F_MKDOCUMENT
flag which allows document creation if the document does not exist, and can be used for mutation operations which may create new paths or values. TheLCB_SUBDOC_CMD_GET_COUNT
is also added, which is a new command which retrieves the number of elements (for an array) or key-value items (within an object/dictionary) of a given path. Both these features require Couchbase Server 4.6 (or its prereleases).- Priority: Major
- Issues: CCBC-718
-
Don't crash on high number of FDs with select plugin. Because
select(2)
can only accomodate up to a certain number of file descriptors in the application, if opening a socket results in a too-high-numbered FD, the plugin will return an error rather than silently failing during polling.- Priority: Major
- Issues: CCBC-567
-
Pillowfight can now set ttl (expiry). This is done via the
-e
or--expiry
option.- Priority: Major
- Issues: CCBC-637
-
Log URLs of HTTP requests. This may make it easier to debug some HTTP-based APIs. The URLs are printed as part of the
TRACE
logging level.- Priority: Major
- Issues: CCBC-641
-
Fix crash on shutdown with completion-based I/O. The crash was a result of dereferencing the
lcb_t
after it had been destroyed. This bug affected completion-based I/O subsystems such as libuv and IOCP.- Priority: Major
- Issues: CCBC-707
-
Do not require
operation
field to be set onlcb_CMDSTORE
. Starting from this version, a newlcb_storage_t
constant,LCB_UPSERT
has been added with a value of 0. This means that upsert operations no longer need to explicitly useLCB_SET
, it being the default.- Priority: Major
- Issues: CCBC-545
-
Index management API now properly handles 'fields' field. Previously this was treated as a csv string, when it is in fact a JSON array.
-
pillowfight
now has a--populate-only
option, which is useful when simply trying to populate buckets with large amounts of data. -
Allow to bypass OpenSSL initialization. This allows applications which already have OpenSSL intialization code in place to suppress libcouchbase's own OpenSSL initialization code. You can disable SSL initialization by using
ssl=no_global_init
in the connection string. -
Allow to toggle sending of multiple credentials in N1QL queries. You can use the
LCB_CMD_F_MULTIAUTH
in thelcb_CMDN1QL::cmdflags
field to indicate that multiple credentials should be added. Otherwise only the current bucket's credentials will be sent. -
Fix infinite loop on completion (UV,nodejs,IOCP) type IO plugins. This bug would be triggered when only a single server remained in the cluster and that single server failed. This would result in the client never being able to perform operations due to a delayed reference count decrement.
- Priority: Major
- Issues: CCBC-704
-
Improve index management API and implementation. The
rawjson
field was being ignored and thecondition
field was missing as well. -
Add pillowfight support for subdoc. At the simplest level you can simply invoke pillowfight as
cbc-pillowfight --subdoc --json <other args>
. Refer to the pillowfight documentation for more details.
-
Fix SSL connectivity errors with views and HTTP bootstrapping. This would cause network connectivity issues when attempting to bootstrap via
https://
or using views (lcb_view_query()
). The fix is a workaround to not advertise older SSL encryption methods.- Priority: Major
- Issues: CCBC-688
-
Do not abort when receiving a memcached EINVAL response. While the client should never end up in a situation where it receives an
EINVAL
from the server, it should nevertheless not terminate the execution of the current process. This bug was introduced in 2.5.6- Issues: CCBC-689
-
Fix memory leak when using N1QL prepared statements. Prepared statements would never be freed, even when the client handle was destroyed (
lcb_destroy()
) causing a slight memory leak. -
Append CRLF header after host header. This would sometimes result in odd HTTP headers being sent out.
- Issues: CCBC-694
-
Experimental CBFT (Full-Text search API) This version adds a new fulltext api. The API is a row-based API similar to N1QL and MapReduce. See the
<libcouchbase/cbft.h>
header for more details. The API is experimental and subject to change.- Issues: CCBC-638
-
Allow additional client identifier for HELLO command. The SDK sends a version string to the server when doing initial negotiation. The server then uses this string in the context of any logging messages pertaining to that connection. In this version, a new setting has been added to allow 'user-defined' version strings to be appended to the logs. Note that this feature is intended only for use with wrapping SDKs such as Python, node.js and PHP so that their versions can be present in the log messages as well. This setting is exposed as a string control (in the connection string, or
lcb_cntl_string()
with the name ofclient_string
.- Issues: CCBC-693
-
vBucket retry logic changes. The client will now retry at constant 100ms rate when receiving not-my-vbucket error replies from the server (adjustable using
retry_nmv_interval
). It will also only use fast-forward map to determine the new location for the vbucket, and will not use extended hueristics.The most noteworthy user-visible change is the 100ms retry interval which will significantly decrease the network traffic used by the SDK during a rebalance.
To restore the pre-2.5.8 behavior (i.e. use extended heuristics and and exponential retry rate), specify
vb_noguess=false
.- Priority: Major
- Issues: CCBC-660
-
Add interface for multi-bucket authentication. A new API has been added to modify and add additional bucket/password pairs in the library. This is done using
lcb_cntl
and theLCB_CNTL_BUCKET_CRED
setting.Note that this functionality is not yet used in N1QL queries due to MB-16964
- Priority: Minor
- Issues: CCBC-661
-
High-level index management operations. A volatile API for high level index management operations has been added to assist in common N1QL index operations such as creating the primary index and removing indexes.
- Priority: Major
- Issues: CCBC-662
-
Fix N1QL mutation token queries. This fixes some bugs in the previous implementation of the way mutation tokens were handled with
lcb_N1QLPARAMS
. The bugs and fixes only affect consumers of that API. Couchbase SDKs do not consume this API- Priority: Minor
- Issues: CCBC-658
-
Throttle config request retries on empty NMVB responses. This changes the previous behavior where a new configuration would be retrieved immediately upon a not-my-vbucket reply if a configuration was not included within the error reply itself. The new behavior is to request a delayed retry (i.e. subject to the default throttle settings) if the current configuration originated from the CCCP (Memcached) provider.
- Priority: Major
- Issues: CCBC-681
-
Rename
LCB_CLIENT_ETMPFAIL
toLCB_CLIENT_ENOCONF
. This error code is returned only when there is no current client configuration. This error condition is not temporary and is actually fatal; a result of an initial bootstrapping failure. Note that the older name is still valid in older code for compatibility purposes.- Priority: Minor
- Issues: CCBC-679
-
Include PID in log messages on OS X. This makes the library logs (via
LCB_LOGLEVEL
etc.) easier to read on a mac. Previously this used to display only the thread ID, which was identical for multiple processes. Now the display reads as pid/tid, making it easier to read the logs in a multi-process environment.- Priority: Minor
- Issues: CCBC-677
-
Sub-Document API (experimental) The client-side sub-document API has been implemented. Sub-document is a feature which vastly reduces network usage when operating on parts of documents. The API as it appears in this version is highly experimental and may (and likely will) change. Examples of use can be found in the
examples/subdoc
directory.- Priority: Major
-
Make
lcb_sched_enter
andlcb_sched_leave
optional. When scheduling an operation (e.g.lcb_get3()
), the scheduling function will implicitly create a scheduling context and submit the operation if none exists already. A scheduling context is explicitly created by callinglcb_sched_enter()
and finished by callinglcb_sched_leave()
orlcb_sched_fail()
.- Issues: CCBC-664
- Priority: Major
-
API3 is now stable. The scheduling based API, introduced in version 2.4.0 and known as 'api3', is now stable and considered the API for use with the library. The previous API (i.e. 'api2') is considered deprecated.
While API3 has been promoted to stable in this version, it has been available in its current form (and in a mostly compatible manner, except the implicit scheduling feature - CCBC-664) since 2.4.0.
Storing an item in API2:
lcb_get_store_t cmd = { 0 }, *cmd_p = &cmd; cmd.v.v0.key = "key"; cmd.v.v0.nkey = 3; cmd.v.v0.bytes = "value"; cmd.v.v0.nbytes = 5; cmd.v.v0.operation = LCB_SET; lcb_store(instance, NULL, 1, &cmd_p);
Storing an item in API3:
lcb_CMDSTORE cmd = { 0 }; LCB_CMD_SET_KEY(&cmd, "key", 3); LCB_CMD_SET_VALUE(&cmd, "value", 5); cmd.operation - LCB_SET; lcb_store3(instance, NULL, &cmd);
-
Add
libcouchbase/
string to version identification to Memcached Connections to memcached will now be identified aslibcouchbase/version
rather thanversion
. This increases readability for server logs- Issues: CCBC-656
- Priority: Minor
-
Hide
mutation_token
field from API3 mutation respones. Themutation_token
field has never been part of the API itself (it was previously present when api3 was marked as "experimental"). The mutation token for any operation must now be retrieved using thelcb_resp_get_mutation_token()
to retrieve the actual mutation token.- Issues: CCBC-671
- Priority: Minor
-
Server's
PROTOCOL_BINARY_RESPONSE_EINTERNAL
is no longer mapped toLCB_EINTERNAL
.LCB_UNKNOWN_MEMCACHED_ERROR
will be returned instead -
Allow get-and-touch with an expiry of 0. Clearing a document's expiry with
get
is now possible, using the newLCB_CMDGET_F_CLEAREXP
inlcb_CMDGET::cmdflags
.- Issues: CCBC-667
- Priority: Major
-
Allow multiple buckets when using sequence number consistency with N1QL This uses the new internal
scan_vector
protocol supporting multiple buckets, each providing their ownlcb_MUTATION_TOKEN
objects.- Issues: CCBC-658
- Priority: Major
-
Add
retry_interval
string option to adjust retry interval. This allows the setting to be modified vialcb_cntl_string()
and specified in the connection string.- Priority: Major
- Issues: CCBC-654
-
Handle backslashes in view row ID fields. This would previously not be handled correctly as the backslashes would not be removed, for example an ID of
has_a_"quote
would appear in the API ashas_a_\"quote
. This has been fixed and document IDs are now properly processed as JSON- Priority: Major
- Issues: CCBC-649
-
Allow 'file-only' configuration mode. This allows applications to make the library instance exclusively configured from a file on the local filesystem rather than through network bootstrap. This feature is undocumented and unsupported. It may be enabled using the
bootstrap_on=file_only
connection string directive.- Priority: Major
- Issues: CCBC-652
-
Log when squashing network errors. This will make the library log the original error whenever a network error is translated from a more detailed description into
LCB_NETWORK_ERROR
(in casedetailed_errcodes
is not enabled), or if an OS-level error is found which cannot be translated into a more specific library error.- Priority: Major
-
Fix memcached/ketama hashing This fixes a bug in the ketama hasing code which caused a key to be mapped to an effectively arbitrary server for the library instance. In practice the node a key was mapped to depended on the order in which the hosts were specified in the connection string. This has been fixed to always use hashing based on the lexical sort order of each server node. It is highly recommended that applications upgrade to this version (2.5.5) for proper memcached (cache) bucket functionality.
- Priority: Critical
- Issues: CCBC-653
-
Add
cbc-touch
subcommand. This now allows the simple "touching", or modifying expiration time via thecbc
command line client.- Priority: Major
- Issues: CCBC-651
-
Validate vBucket master nodes for bounds when receiving new configuration. This ensures that invalid configurations (addressing nodes which do not exist) do not make their way to KV routing operations.
- Priority: Major
- Issues: CCBC-643
-
Add
lcb_strcbtype
to print the name of the callback type This small convenience function is added to pretty-print the type of callback being invoked. The second argument to the callback can be passed to this function.- Priority: Minor
-
Disallow using
certpath
connection string option without explicit SSL (couchbases://
) scheme. Since the SSL and non-SSL schemes are similar, a typo can let a user mistakenly think that SSL is being used. This is fixed by disallowing the other SSL option (certpath
) when SSL is not enabled.- Priority: Minor
- Issues: CCBC-644
-
Add convenience function to retrieve hostname for key. This is an alternative to retrieving the vBucket configuration (via
lcb_cntl()
) and mapping the key to an index, and mapping the index to a node. Note that hostnames are sufficient for most but not all configurations. Those running multiple server instances on the same host (for example,cluster_run
) will still need to use the full set of steps as this function does not return a port. This function is provided both as a vBucket API (lcbvb_get_hostname()
) which retrieves the hostname for an index as well as a top-level instance (lcb_t
) function (lcb_get_keynode()
) which accepts a key buffer and length.- Priority: Minor
-
Ensure embedded jsoncpp does not throw exceptions. This caused some build issues with other build systems. This has been fixed by replacing any exception throwing code with
abort()
andassert()
statements.- Priority: Minor
- Issues: CCBC-634
-
Log vBucket configuration parsing failures. This logs vBucket configuration parsing failures when a given config received could not be parsed. Parsing failures include both JSON syntax errors as well as improper fields or values within the config itself.
- Priority: Major
- Issues: CCBC-647
-
Allow per-request N1QL timeouts to exceed global timeouts. This scans the
"timeout"
property of the N1QL request and if set, will make the value of this property the timeout value for the request. A small parser was implemented which converted the N1QL timeout values (s
,h
, etc.) into microseconds.- Priority: Major
- Issues: CCBC-660
-
Request configuration refresh when HTTP API redirects are received. Redirects in Couchbase Server are sent when a node is about to exit the cluster. We should take this as a sign to refresh the config since it indicates a node is about to be removed.
- Priority: Major
- Issues: CCBC-646
-
Add N1QL timeout feature. This allows an independent timeout setting for N1QL. Previously this would use the views timeout.
- Priority: Major
- Issues: CCBC-631
-
Add N1QL prepared statements. This allows prepared statements to be used with N1QL. The library will maintain an internal "prepared statement cache" which contains cached responses for internal PREPARE requests. To use a prepared statement, an application can simply set the
LCB_CMDN1QL_F_PREPCACHE
bit in thecmdflags
field within thelcb_CMDN1QL
structure. All the rest is handled internally within the library.- Priority: Major
- Issues: CCBC-633
-
Fix off-by-one error when populating documents with pillowfight. Previously pillowfight would only populate N-1 documents where N is the (
-I
,--num-items
) option. This has been fixed.- Priority: Minor
-
Don't generate negative keys for pillowfight. For certain option configurations, pillowfight would generate negative keys (some keys were in the format of -nnnnnn).
- Priority: Minor
-
Allow in-progress N1QL requests to be cancelled. This allows in-progress N1QL requests to be cancelled by adding a new API,
lcb_n1ql_cancel()
. Invoking this function on anlcb_N1QLHANDLE
handle (obtained via an out parameter in the command structure) will effectively stop the request and stop delivering callbacks to the user.- Priority: Major
- Issues: CCBC-619
-
Rename
lcb_SYNCTOKEN
tolcb_MUTATION_TOKEN
. This experimental (volatile) API has been renamed to "Mutation Token" to better reflect naming conventions found in other client libraries.- Priority: Minor
-
Implement histogram/timings information for N1QL queries via
cbc-n1qlback
. This adds support for the (-T
,--timings
) option in thecbc-n1qlback
benchmark/stress-test utility. These timings reflect the latency between issuing the query and the receipt of the first row of the resultset.- Priority: Major
- Issues: CCBC-624
-
Add (
-M
,--mode
) option tocbc-create
to allow for upsert, insert, etc. This allowscbc-create
to use the full gamut of storage options available via the SDK by allowing an insert/upsert/replace mode as an argument to the new--mode
option.append
andprepend
are now also provided as options, though not documented.- Priority: Major
- Issues: CCBC-625
-
Support
CBC_CONFIG
environment variable for command line tools. This variable specifies a path to an alternatecbcrc
file which may be used to provide cluster/bucket settings. This new option allows multiple configurations to coexist, without forcing any one of them to be inside the user's home directory.- Priority: Minor
- Issues: CCBC-626
Bug fixes and improvements in 2.5.1
-
Fix hanging in durability operations if node is not present and constraints include failed node. This condition may be triggered when only a single node remains in the broadcast probe and a command sent to it could not be scheduled. A symptom of this bug was durability operations 'hanging'
- Priority: Major
- Issues: CCBC-607
-
Improved handling of topology changes when non-data (N1QL, Index) nodes are part of the cluster. This fixes some issues (mainly crashes) when non-data nodes are found inside the cluster during a topology change. While the library since version 2.4.8 was able to handle initial bootstrapping with non-data nodes, it would still crash when such nodes were encountered during configuration changes.
-
Improved random host selection algorithm for REST services This new algorithm ensures that the distribution is even among all eligible nodes for a given service. The old algorithm would only distribute evenly when the assumption that all nodes contained the same services were true. However this assumption is no longer necessarily true with Couchbase 4.0. In this case the algorithm ensures that the random selection inspects only the pool of nodes which are known to have a given service enabled.
- Priority: Major
- Issues: CCBC-611
-
Ensure ketama/Memcached-bucket hashing works correctly when non-data nodes are part of the cluster. In previous versions, ketama hashing would incorrectly consider all nodes as candidates for keys, which would result in some items being routed to non-data nodes, resulting in odd errors and inaccessible data. This is only an issue for the still-unreleased Couchbase 4.0.
- Priority: Major
- Issues: CCBC-613
-
Set
TCP_NODELAY
as a server side option, if it's enabled on the client. This uses theHELLO
protocol functionality to enable this feature, if this feature is also enabled on the client (enabled by default).
New features in 2.5.1
-
Add
cmake/configure
option for enabling the embedding of the libevent plugin. This option, named--enable-embedded-libevent-plugin
, will cause the plugin to be linked in with the core library (libcouchbase) rather than built as its own object- Priority: Minor
-
Add new combined "Store-with-durability" operation. This new API, called
lcb_storedur3()
allows specifying the storage input options as well as the associated durability options in a single command. Likewise, the status of the operation (including durability) is returned in the operation's callback.- Priority: Major
- Issues: CCBC-616
This change in the major version number signals the addition of new features for Couchbase Server 4.0; most of the actual new functionality for Couchbase 4.0 has already been included (incrementally) in prior 2.4.x versions. The new 2.5 version is built on the 2.4.x codebase.
-
Add
cbc-n1qlback
- a simple benchmark for N1QL queries. This functions by executing a line-delimited file containing query bodies using multiple threads if possible.- Priority: Major
- Issues: CCBC-604
-
TCP_NODELAY
functionality has now been placed into effect. This functionality was nominally present in prior versions, but would not work because of a typo.- Priority: Minor
-
Add 'tick' or 'pump' mode for I/O As an alternative to
lcb_wait()
, applications may calllcb_tick_nowait()
to incrementally perform (non-blocking) I/O. This may provide a performance boost when batching/scheduling many operations.lcb_wait()
itself must be called to guarantee completion of all operations, and thelcb_tick_nowait()
functionality is only available on some I/O plugins. See the API docs for more information.- Priority: Major
- Issues: CCBC-598
-
Allow "console logger" to log to a file As a convenience, it is now possible to direct the library to write to a log file rather than standard error. This is possible using the
LCB_CNTL_CONLOGGER_FP
(to programmatically set aFILE*
value vialcb_cntl()
) orconsole_log_file
to set the path of the file (which will be overwritten) vialcb_cntl_string()
or the connection string. -
Make
lcb_N1QLPARAMS
repeatable/debuggable This allows thelcb_n1p_mkcmd()
call to be invoked multiple times without actually modifying internal state. Previously calling this function twice would result in corruption of the internal parameter state. In this version, a new function,lcb_n1p_encode()
has been added (whichlcb_n1p_mkcmd()
wraps) which may be used to inspect the encoded form of the query.
-
Disable HTTP provider when any CCCP config is received. This makes the assumption that CCCP will always be available if even a single node provides an HTTP configuration. This change may break some corner-case upgrade scenarios from version 2.2 to 2.5 where a newly added 2.5 node is subsequently removed.
-
Fix additional missing defines for UV's
EAI_*
symbols This was not entirely fixed in 2.4.8, since some undefined macros still remained.- Priority: Major
- Issues: CCBC-596
-
Make connection string timeout parameters (e.g.
operation_timeout
) always specify seconds; this will no longer require the decimal point to be used, but will break any prior usages of this value for microseconds.- Priority: Minor
- Issues: CCBC-597
-
Add
cbc n1ql
subcommand, which executes N1QL queries. This subcommand is still a bit rough around the edges, mainly because of server-side support for "pretty=false" (which makes the rows display rather weirdly).- Priority: Major
- Issues: CCBC-595
-
Allow usage of
-D
option incbc
andcbc-pillowfight
tools. This flag allows specifying connection string options in a more concise form on the commandline. The-D
option may be specified multiple times in the form of-Doption=value
.- Priority: Minor
-
Interpret
couchbase://host:8091
connection string ascouchbase://host
Previously the library would treat8091
as a memcached port. While technically correct according to the connection string semantics, would often be a source of confusion for users migrating from older versions of the library (or other SDKs) when using the formhttp://host:8091
. A special provision is thus made for such a cas.- Priority: Major
- Issues: CCBC-599
-
Implement enhanced durability using sequence numbers. This feature is available in Couchbase 4.0, and uses sequence numbers (optionally specified in the response packet of each mutation). sequence-based durability constraints help resolve some ambiguity in the case of checking the durability of items which have since been mutated, or in the case of a cluster failover. Using this functionality requires the
LCB_CNTL_FETCH_SYNCTOKENS
(orfetch_synctokens
) and theLCB_CNTL_DURABILITY_SYNCTOKENS
(ordur_synctokens
) settings to be enabled (usinglcb_cntl()
orlcb_cntl_string()
, or in the connection string). EnablingLCB_CNTL_FETCH_SYNCTOKENS
will cause mutation response packets from the server to return an additional 16 bytes of sequence data, and enablingLCB_CNTL_DURABILITY_SYNCTOKENS
will causelcb_durability_poll()
to transparently use this information (rather than the CAS) to check for persistence/replication. Only available in Couchbase 4.0. As a result of this feature, much of the durability subsystem itself has been rewritten, making durability overall more performant, even for CAS-based durability.- Priority: Major
- Issues: CCBC-569
-
Add
lcb_version_g
extern symbol as alternative tolcb_get_version()
. This symbol is an extern global which allows simple runtime checking of the library version. This is more convenient thanlcb_get_version()
as it avoids the requirement to create a temporary variable on the stack (lcb_get_version()
returns a string, and requires anlcb_U32
pointer as its first argument to get the actual numeric version).- Priority: Minor
-
Retry next nodes on initial bootstrap, even if first node says bucket does not exist (or auth error), as this might be a recently removed node
- Priority: Major
- Issues: CCBC-577
-
The
cbc
andcbc-pillowfight
binaries on Windows are now distributed in both release and debug variants. Previously they would be clobbered by one or the other depending on the build host. This fixes some issues in performance and dependency resolution when using these libraries.- Priority: Minor
- Issues: CCBC-581
-
Provide Read-Only config cache mode. In this mode the configuration cache file is read but never updated. Additionally, a missing file in this mode results in a hard error.
- Priority: Major
- Issues: CCBC-584
-
Keep vBucket heuristic guesses for limited periods of time. This will allow previously-learned vBucket master locations to persist over a configuration change, providing these changes were discovered recently. This allows the reduction of not-my-vbucket responses while allowing new configs to overwrite our heuristic info, if the heuristic is too old.
- Priority: Major
-
Fix potential crashes in get-with-replica (
lcb_rget3
,lcb_get_replica
) when there are no replicas available, or if there is an error in retrieving from one of the replicas.- Priority: Major
- Issues: CCBC-586
-
Do not wait between not-my-vbucket retries This behavior restores the pre 2.4.0 behavior of retrying not-my-vbucket responses, with a more intelligent retry/rotation algorithm (see the release note about "vbucket map heuristics"). Previously a wait-time was introduced because of potential busy loops in retrying to the same node. The
LCB_CNTL_RETRY_NMV_IMM
setting can be used to disable this functionality (by disabling it, i.e. setting it to 0). This may also be disabled in the connection string viaretry_nmv_imm=0
.- Priority: Major
- Issues: CCBC-588
-
Fix compilation error with UV when
EAI_BADHINTS
is not defined in the system. This is primarily an issue with newer UV versions and some versions of Linux- Priority: Major
- Issues: CCBC-590
-
Allow means to disable C++ behavior on public library structures, allowing them to be initialized via C-style static initializers. This allows the zeroing of structures such as
lcb_get_cmd_t cmd = { 0 }
, which would ordinarily fail under C++ compilation because of that structure having a defined C++ constructor. Applications can take advantage of this feature by defining theLCB_NO_DEPR_CXX_CTORS
preprocessor macro when compiling.- Priority: Major
- Issues: CCBC-591
-
Fix some bugs in timing behavior (
lcb_enable_timings
). Timings between 1000-2000ms are now reported accurately. Additionally for more common handling, second timing ranges (between 1-9s) are reported in ms range (i.e. timings of 4 seconds are reported as 3000-4000ms ).- Priority: Minor
- Issues: CCBC-582
-
Fix SSL connection failures with
SSL_UNDEFINED_CONST_FUNCTION
. This would sometimes cause failures during early connection/negotiation stages.- Priority: Major
- Issues: CCBC-571
-
Add experimental support for N1QL queries. This adds support for contacting N1QL endpoints and retrieving their result sets. The support at both the client and server components is still a work in progress. The API is similar to the view api (see
lcb_view_query()
) added in version 2.4.6. See details in<libcouchbase/n1ql.h>
- Priority: Major
- Issues: CCBC-572
-
Add experimental support for geospatial view queries. GeoSpatial views are available as an experimental feature in the current releases of the server. This will soon be offered as a stable feature in future releases. Applications may now use the
lcb_RESPVIEWQUERY::geometry
field and theLCB_CMDVIEWQUERY_F_SPATIAL
to utilize geospatial views.- Priority: Major
- Issues: CCBC-573
-
Fix memory leak for retried commands. In cases where a given command needs to be retried more than once, a memory leak was fixed in which the previous instance of the pacekt was not properly freed.
- Priority: Major
- Issues: CCBC-574
-
Fix floating point exception on OS X. A floating point exception would sometimes be thrown on OS X sytems due to bad time structure initialization. The installation provided with homebrew for 2.4.5 fixed this issue. This is completely fixed in 2.4.6 Priority: Major
-
Improve warning messages when using deprecated options in
cbc
. This provides less ambiguous help messages when using deprecated options, showing a full and complete example for proper usage (when possible).- Priority: Minor
- Issues: CCBC-562
-
Add patch/micro version to DLL information on Windows. This lets the user see the exact version of the library on windows (via right clicking on the DLL and inspecting the details). Previously this information contained only the major and minor versions.
- Priority: Minor
- Issues: CCBC-563
-
Provide pkgconfig (
.pc
) file with installation. This may help third party applications and libraries link against libcouchbase in some environments. -
Provide one-off
unsafe_optimize
option for connection string/lcb_cntl
. This provides a shorter way to enable some potentially unsafe optimizations which may make the client perform better in some scenarios.- Priority: Minor
-
Allow prompting for password in
cbc
. Thecbc
andcbc-pillowfight
utilities will now securely prompt for the password if the password specified on the commandline is a hyphen (-
).- Priority: Minor
- Issues: CCBC-565
-
Fix timeouts in some durability when not all replicas are online. The library will now fail the operation with
LCB_DURABILITY_ETOOMANY
rather than allowing the operation to timeout.- Priority: Major
- Issues: CCBC-560
-
Add high level row-based view functionality. This adds a new API (currently considered volatile) which allows intelligently querying views. This builds atop the basic HTTP interface, and exposes a row-based callback API based upon streaming JSON parsing. The new API is defined in
<libcouchbase/views.h>
. This API will become more stable over time.- Priority: Major
- Issues: CCBC-100
-
Parse configuration service locations for experimental services This exposes the N1QL and indexing services via the lcbvb API. See
libcouchbase/vbucket.h
for more information.
-
Fix
pillowfight
ignoringset-ratio
values above 50 The program would ignore these values and act as if 100 was specified, thus never issuing any GET operations- Priority: Minor
- Issues: CCBC-550
-
Building with autotools is no longer supported. If building the library from source, you must use CMake version 2.8.9 or greater. If unfamiliar with CMake, the README describes the process. Included also is a top-level script called
configure.pl
which functions with an autoconf-like interface.- Priority: Major
-
Fix customized IOPS crashes in some usage cases This fixes scenarios where applications assume that the built-in IOPS version is 0, and attempt to "Subclass" the IOPS structure. The internal version of the library structure is now 3, with some extra heuristics in place to ensure that the older code will still function. This issue was most visible in the Python SDK when using the gevent or Twisted plugins. This issue was first introduced with version 2.4.4
- Priority: Critical
- Issues: CCBC-557
-
Allow raw
certpath
to be passed without need for percent-encoding (in most cases) This allows for a common pattern fo passingcertpath
in the connection string as a raw, unencoded path. This allows a user to docouchbases://host/bucket?certpath=/foo/bar/baz
. -
Fix missing installation UV plugin headers and source In 2.4.4 this was accidentally left out, and would only be installed if the plugin itself was built and installed. This affected building the Node.JS SDK using an existing libcouchbase install.
- Priority: Major
- Issues: CCBC-558
-
Detect disconnected pooled sockets This allows the connection pool to detect dead sockets which were closed by a server when they were idle. Sometimes servers will close connections to open idle sockets to save resources, or because of bugs in their implementations. This will fix some issues experienced with views where queries would randomly fail with
LCB_NETWORK_ERROR
orLCB_ESOCKSHUTDOWN
, by first checking if the socket is alive before returning it back to the library's core. Note that thelibuv
plugin does not implement this functionality yet.- Priority: Critical
- Issues: CCBC-546
-
Fix pillowfight
--min-size
bug This fixes a bug where pillowfight would sometimes compare themin-size
option to an uninitializedmax-size
option and round it down to that value; then would set themax-size
option.- Priority: Major
- Issues: CCBC-542
-
Don't ignore
LCB_CNTL_DURABILITY_INTERVAL
Fix a bug where this interval would be ignored, if modified by the user; always reverting to 100ms.- Priority: Major
- Issues: CCBC-543
-
Fix memory leak with HTTP requests using a request body Requests (such as
PUT
,POST
, etc) which contained a request body would cause a memory leak as the library forgot to free them when the request object was destroyed.- Priority: Major
- Issues: CCBC-538
-
Fix errneous
LCB_SUCCESS
return when passed duplicate keys tolcb_durability_poll()
. This would cause applications to mistakenly wait for a callback to arrive, when in fact the command had failed.- Priority: Major
- Issues: CCBC-536
-
Add option to preserve vbucket ownership heuristics across config updates This allows the learned configuration settings to persist between configuration updates. The default behavior (up to, and including this change) is to discard any "learned" configuration in favor of the explicitly new config passed to the server. This new option allows this information to be persisted when a new configuration update is received. This behavior is considered experimental, and is primarily intended to reduce the time it takes for the client to relearn the current node (which is typically under 1-2 seconds).
- Priority: Minor
- Issues: CCBC-530
-
Relocate memcached packets on topology changes for memcached buckets This enhances the behavior of the client when operating with a memcached bucket during a topology change. Previously the library would not relocate packets to new servers, resulting in errors for items which were now mapped to wrong nodes. The new behavior remaps the key to the new server using the updated ketama hashing. Note that as a current restriction, the remapping will be performed based on the key of the item, not any
hashkey
parameter being employed.- Priority: Major
- Issues: CCBC-331
-
Return error if ignored/conflicting options are found This changes the behavior of the library to throw an error if a specific option field was filled in which did not make sense for a given command, for example, specifying a
cas
value using aLCB_ADD
operation withlcb_store
.- Priority: Major
- Issues: CCBC-529
-
Fix issue when sending out large OBSERVE command. This would cause a partial command to be sent out if the size of the output packet was greater than 512 bytes. This has been fixed by dynamically growing the output buffer for OBSERVE
- Priority: Minor
- Issues: CCBC-528
-
Fix spurious timeouts when using
lcb_durability_poll
This fixes an issue where sometimes the durability poll operation would prematurely time out.- Priority: Major
- Issues: CCBC-527
-
Disable support for SSLv3 This works around the POODLE SSLv3 vulnerability by disabling support for anything below TLSv1.
- Priority: Critical
- Issues: CCBC-523
-
Pillowfight enhancements Several behavior changes were made to pillowfight in this version. These are:
-
The
-l
or-c -1
option is in effect by default. This means that by defaultpillowfight
will run an infinite number of cycles. The previous behavior was to default to a single cycle, requiring an explicit--loop
to ensure the workload ran for a considerable amount of time. -
When multiple threads are used, the workload is divided among the threads, thus making it that each thread only operates on a subset of the data.
-
A
--sequential
option has been added to allow the workload to operate in sequence on the total number of items. This is useful when wishing to load a bucket with many items. -
A
--start-at
option has been added to allow the workload to specify an alternate range of keys; effectively allowing resumption of a previous run. The--start-at
flag allows to specify the lower bound number which will be used to generate keys. Thus a--num-items=20000
and a--start-at=10000
will generate keys from 10000 through 30000. -
The population phase has now been merged with the general workload implementation. This means that all worker threads will participate in the population phase. The previous behavior limited the populate phase to a single thread.
-
If
stdout
is detected to be a terminal, a simple "OPS/SEC" meter will periodically write the estimated throughput to the screen.
-
-
Fix memory leak when using large read buffers In the case where large read buffers are used (and the
iovec
elements becomes sizable, the library may end up incorrectly caching some memory blocks for future use. This fix makes the blocks be cached at the allocator level, so that they are properly (re) utilized.- Priority: Major
- Issues: CCBC-519
-
Use forward map (and other heuristics) to get a next node for an item after a not-my-vbucket reply. Since the server (see bug attached) does not always guarantee that a given config is the most correct, the client must do some guesswork in order to properly map a node when it gets a not-my-vbucket; especially if the config says that the node is the correct one.
- Priority: Major
- Issues: MB-12268
-
Mark the
hashkey
fields as being volatile. Usage of this field is not supported in many cluster systems and is thus not supported functionality. It exists primarily as a legacy from an older API- Priority: Major
- Issues: CCBC-508
-
Add "key stats" mode to
lcb_CMDDSTATS
. This adds an additional key stats mode to thelcb_stats3()
API which interprets thekey
field as being a document ID for which information (such as expiry, status) should be retrieved, rather than a system statistics key. Similar functionality already exists in the Java client library asgetKeyStats()
. In addition to this feature, acbc stats --keystats
option is also provided to employ this functionality from the command line.- Priority: Major
- Issues: CCBC-318
-
Add more details about replica nodes in the
cbc hash
command.- Priority: Minor
- Issues: CCBC-504
-
Add
lcb_cntl()
setting to retrieve bucket name. Previously the library did not have a means by which the bucket name could be retrieved. Using theLCB_CNTL_BUCKETNAME
setting, the bucket name will now be returned.- Priority: Major
- Issues: CCBC-502
-
Implement
mcflush
subcommand forcbc
. This was removed in the cbc rewrite as the previousflush
command.- Priority: Minor
- Issues: CCBC-486
-
Requests issued to an invalid replica via
lcb_get_replica()
should fail with theLCB_NO_MATCHING_SERVER_CODE
. Previously this sometimes went through due to an incorrect bounds checking in thelcbvb_vbreplica()
function.- Priority: Major
- Issues: CCBC-488
-
Fixed a memory leak in
lcb_get_replica()
when the operation would fail. -
Fix memory leak in
lcb_sched_fail()
when extended commands are in the pipeline- Priority: Major
- Issues: CCBC-474
-
Provide
lcb_dump()
function call to dump state information about a client handle. The function call itself is currently marked as volatile and the output format is very much likely to change.- Priority: Minor
- Issues: CCBC-491
-
Fix
ratio
argument incbc-pillowfight
. This ensures that theratio
argument will truly determine the ratio of gets to sets.- Priority: Minor
-
Fix crash when HTTP request is retried. This may take place during topology changes
- Priority: Major
- Issues: CCBC-497
-
Allow simple host-port string in connection string, giving it an implicit
http://
scheme. This allows easier backwards compatibility with some application- Priority: Minor
- Issues: CCBC-500
-
Update some SSL options to better reflect server 3.0 functionality The old
capath
option has been renamed tocertpath
to indicate that the path is not to the signing authority, but to the self-signed server certificate generated by the server itself. Additionally theno_verify
option has been hidden.- Priority: Major
- Issues: CCBC-501
-
[major] Attempt to retry items that are mapped to a non-existent node in a degraded cluster. Rather than returning
LCB_NO_MATCHING_SERVER
the behavior should be to wait for the item to succeed and attempt to fetch a new cluster configuration.In order to control how such 'orphaned' commands are handled, a new value has been added to the
lcb_RETRYMODEOPTS
calledLCB_RETRY_ON_MISSINGNODE
which dictates how commands should be rescheduled if the associated vbucket has no master. The default is to retry the command until it times out, but by setting this value to0
(SeeLCB_CNTL_RETRYMODE
) it may only be attempted once, causing 'fail fast' behavior in such a case. -
[major] Don't throttle config requests based on initial file-based config. This allows the client to quickly recover from a stale config cache without waiting for the
LCB_CNTL_CONFDELAY_THRESH
interval to elapse. Prior to this fix, a client would appear to "not recover" if bootstrapping from a stale cache. In reality the client would eventually recover but was waiting for the delay threshold to elapse. -
[major] Ignore
NOT_MY_VBUCKET
config payloads if CCCP provider is disabled. This allows the client to circumvent any possible bugs in the CCCP response payload and rely entirely on the HTTP config. It also allows 'rewriting' proxies like confsed to function.
-
[major] Better error reporting for SSL failures. This adds new error codes (
LCB_SSL_ERROR
,LCB_SSL_CANTVERIFY
) which are returned on initialization and verification failures respectively. -
[minor] Communication via legacy memcached servers is possible by using the
memcached://
scheme in the connection string. -
[minor] Environment variables understood by the library are now documented in their own section.
-
[major] Add
lcb_get_node()
function to retrieve addresses for various nodes in the cluster. This deprecates thelcb_get_host()
,lcb_get_port()
andlcb_get_server_list()
functions as they are constrained to only return information about the administrative API. The new function is configurable to return information about various ports. -
[major] The
dsn
field in thelcb_create_st
structure has been renamed toconnstr
. -
[major] An HTTP request which has followed redirects will cause the
lcb_wait()
function to never return. This bug was introduced in 2.4.0-DP1 and has now been fixed. -
[minor]
lcb_get_server_list()
function now returns updated information from the current cluster configuration. Previously this would only return a node from the list specified during initial creation. -
[minor] Provide additional error classifiers. Two error classifiers have been added, they are:
LCB_ERRTYPE_SRVLOAD
which indicates that the server is likely under high load.LCB_ERRTYPE_SRVGEN
which indicates that the error is a direct reply from the server. This code can help distinguish between client and server generated return codes.
-
[major] Provide HTTP keepalive and connection pooling for HTTP requests. This allows the client to reuse an HTTP connection for multiple requests rather than creating a new connection and closing it for each operation.
The functionality may be controlled via the
LCB_CNTL_HTTP_POOLSIZE
setting which limits how many open connections (per server) to maintain inside the client. Setting this value to0
will disable pooling and restore old behavior. -
[major] Properly schedule next invocations for retry queue. A bug was introduced in 2.4.0-dp1 which would cause the next tick callback to be invoked in what is effectively a busy loop. This would be reflected in higher CPU load and less throughput during topology changes.
-
[major] Return error if empty key is passed to an operation. Empty keys will cause the server to drop the connection. The error code returned is the newly added
LCB_EMPTY_KEY
-
[minor] Provide setting to disable refreshing the configuration when an HTTP API error is encountered (from one of the HTTP callback functions). This adds the
LCB_CNTL_HTTP_REFRESH_CONFIG_ON_ERROR
setting. -
[major] Fix bug where the CCCP provider may prematurely fail, activating the HTTP provider
Changes affecting older APIs
-
[minor] Make
run_event_loop
andstop_event_loop
private. These functions may no longer be used from within an application to start/stop the event loop.lcb_wait()
andlcb_wait3()
should be used instead. -
[major] Deprecate the
lcb_set_XXX
functions.lcb_set_timeout
and some other calls have been deprecated in favor of thelcb_cntl()
interface. These functions will still work but will cause the compiler to print a deprecation warning. -
[minor]
lcb_socket_t
is typedefed to aDWORD
on windows. In previous versions this was anint
. -
[minor] Connecting to a standalone memcached instance is currently no longer supported.
-
[major]
lcb_set_error_callback()
has been deprecated. Applications should use the newlcb_set_bootstrap_callback()
and/or operation callbacks to determine success/failure status. -
[major]
lcb_get_last_error()
has been deprecated. Error information is always returned in the operation callback -
[major] Disable the sending of
GETQ
packets. The format of this command is cumbersome to deal with and in most uses cases is actually slightly less efficient on the network. Note that this does not change the API of the actuallcb_get()
call, but simply changes the format of the packets sent over the wire. -
[major] The IOPS API has been changed. This is considered volatile interface and may subsequently change in the future as well.
New APIs added in 2.4.0 extending existing functionality
These changes extend existing features with enhanced APIs
-
[major] Additional APIs for
lcb_cntl()
. These consist of helper functions to make it easier to use simple types or strings rather than pointers, if possible. These functions arelcb_cntl_string()
,lcb_cntl_setu32()
andlcb_cntl_getu32()
-
[minor] Provide extended version of
lcb_wait()
. A new function calledlcb_wait3()
has been added which offers additional options with respect to running the event loop. Specifically it offers to bypass the check for pending operations whichlcb_wait()
executes. This is both more performant and allows us to wait for operations which are not explicitly scheduled. -
[major] Provide API to request a configuration refresh. Sometimes it is necessary to force the client to request a new configuration, for example in certain failover conditions. A new API called
lcb_config_refresh()
has been added, and should be used in conjunction withlcb_wait3()
. -
[major] Provide bootstrapping notification callback This provides an explicit
lcb_set_bootstrap_callback()
to definitively determine whether the client has received its initial configuration (and thus may now start performing operations) or whether it failed (and thus must be reinitialized). This deprecates the common use case oflcb_set_error_callback()
. -
[major] New vBucket interface/API. This API is used internally and exposed as volatile inside the public header files. It provides extended features, a more concise API, and is compatible with the upcoming Couchbase 3.0 config format. Note that file-based configuration caches written by this version of the library are incompatible with previous versions, however this version may read caches generated by previous versions. This is because this version generates a stripped-down version of the "terse" configuration style.
-
[major] Extended detailed error codes. These error codes expose more detail about the
NETWORK_ERROR
andCONNECT_ERROR
codes returned by previous versions of the library. The extended codes are not returned by default and must be explicitly enabled in order to retain backwards compatibility with applications which rely on the older error codes.
New Features in 2.4.0
-
[major] Connection Strings (aka "dsn") feature for instance creation. This adds a new version of the
lcb_create_st
structure which is passed a URI-like string rather than a semicolon-delimited list of hosts. This string is used to provide options and the list of hosts that the library should connect to. For example,couchbase://default/localhost&compression=off
-
[major] SSL transport support for Couchbase 3.0 Enterprise. Couchbase 3.0 enterprise features the ability to encrypt communications between the client and the server using the SSL protocol. SSL protocol support in libcouchbase.
-
[major] Retry queue for failed operations. The retry queue is used as a place to place operations which have failed internally and which should be retried within a certain amount of time. This also provides options on which commands should be retried.
-
[minor] Compression/JSON flag (aka Datatype) support This adds support for a future feature of Couchbase server which will feature transparent compression. This feature also allows the server to signal to the library if a document is JSON or not. The compression feature may be disabled at compile-time, and may also be modified at runtime by setting
compression=off
in either the connection string or vialcb_cntl_setstring(instance, "compression", "off")
-
[major] Experimental scheduling API. This API replaces most of the older operation APIs with a scheduling API. These APIs are called with one command at a time and insert the resultant packet into a pipeline. The user may "schedule" the commands or "fail" the pipeline if a certain request has failed to be scheduled.
This API also provides a common ABI header for commands so that they may easily be used via type-punning, or wrapped as a class hierarchy in C++.
This API is currently considered volatile but will be the basis of the upcoming libcouchbase 3.0 API. The header file is
<libcouchbase/api3.h>
-
[major] Raw memcached packets may be sent to the library and have a callback invoked when their responses have been received. This adds an
lcb_pktfwd3()
API. This requires the new scheduling API.
Bug Fixes in 2.4.0
-
[major] select plugin may endlessly loop in some cases The plugin may loop if there was a long timeout from the future .
-
[major] Do not break TCP connections on topology changes unless ejected from cluster. This ensures that nodes which are still part of the cluster have their TCP connections remain in tact despite being shifted in their server index values. Packets which have been sent to the wrong vBucket are silently ignored and rescheduled to their appropriate destination. This decreases load significantly on the client, network, and cluster during topology changes.
-
[major] Use new-style "Terse" URI format when requesting a configuration over HTTP. This uses the HTTP configuration format over the new
/pools/default/bs/default
rather than the older/pools/default/bucketsStreaming/default
form. The former form is much more efficient on the cluster side. If the new URI form is not supported (i.e. the server responds with an HTTP 404) the older form will be used instead. You may modify this behavior by setting theLCB_CNTL_HTCONFIG_URLTYPE
setting vialcb_cntl()
. -
[minor] The
cmake/configure
script now accepts theLDFLAGS
,CPPFLAGS
,CFLAGS
,CXXFLAGS
,CC
, andCXX
settings both within the environment and the commandline, so the forms ofCC=clang ./cmake/configure
and./cmake/configure CC=clang
are equivalent. -
[minor] The
pillowfight
tool will now print latencies between 1-10ms in resolutions of 100us.
Metadata and Packaging Changes in 2.4.0
-
[major] Use Doxygen for API documentation. This replaces the manpages for API documentation with Doxygen. Doxygen is a free and portable documentation system which may be obtained from your distribution or at . To generate the documentation from the source tree, simply run
doxygen
from the source root directory. To generate internal documentation, run./docs/gen_internal_apidoc.sh
. -
[major] Add interface attributes to all API calls This properly documents all API calls with a certain API stability level such as committed (for stable APIs), uncommitted for APIs which may, but are not likely to change, and volatile for APIs which are likely to be changed or removed.
-
[major] Public header files have been reorganized This changes the layout of the header files from previous versions. This should not affect applications as applications should only ever include the main
<libcouchbase/couchbase.h>
file.the following files have been removed from the
<libcouchbase/*>
header directory:types.h
- Merged into other header filesarguments.h
- now a part ofcouchbase.h
callbacks.h
- now a part ofcouchbase.h
debug.h
- unused and obsoletedurability.h
- now a part ofcouchbase.h
behavior.h
- Merged intodeprecated.h
sanitycheck.h
- Merged intodeprecated.h
timings.h
- Part ofcouchbase.h
compat.h
- Part ofdeprecated.h
The following files have been added into the
<libcouchbase/*>
directory. Unless otherwise noted, these files are included by<libcouchbase/couchbase.h>
:api3.h
- Volatile proposed 3.0 API. Not included by defaultcxxwrap.h
- Contains the implementation for the deprecated C++ wrappersdeprecated.h
- Contains deprecated APIsiops.h
- Contains the IO integration APIspktfwd.h
- Contains the packet forwarding API. Not included by defaultvbucket.h
- Contains the vBucket mapping API. Not included by default
-
OpenSSL is now a base dependency for the library. This may be disabled at configure time via
--enable-ssl=no
. See./configure --help
. -
Snappy compression library is bundled and optionally compiled. This is left out by default as the configure script will search for a system installed
libsnappy
. Snappy provides the compression feature needed for compressing and inflating data between client and server. It may be disabled at compile-time via--enable-snappy=no
-
[minor] libvbucket has been fully integrated into libcouchbase from the forked libvbucket package and, lives fully as part of the library. The public vBucket API may be found in
<libcouchbase/vbucket.h>
. -
[minor] As an alternative to the cross-platform
lcb_uintNN_t
typedefs, a shorter (and more standards compliant) alternativelcb_UNN
typedefs are provided, thus instead oflcb_uint32_t
you may uselcb_U32
. The full listing of cross platform typdefs may be found inside<libcouchbase/sysdefs.h>
-
[major] CCBC-404: Segfault in
connmgr_invoke_request
Occasionally a segmentation fault would happen when a connection was being released as a result of a connection failure. This was because of invalid list tracking. -
[major] CCBC-395: Add
lcb_cntl()
interface for configuration cache Configuration cache options may be set after instantiation usinglcb_cntl()
with the newLCB_CNTL_CONFIGCACHE
operation. The old-stylelcb_create_compat
creation path is deprecated. -
[major] CCBC-394: Get-with-replica occasionally crashes on Windows and UV during topology changes. This was due to not allocating a buffer if one did not exist.
-
[major] CCBC-392: ABI compatibility broken between 2.x and 2.3 for
lcb_create_compat
. This has been fixed by symbol aliasing between versions. Developers are recommended to use thelcb_cntl()
API to set the configuration cache, as specified in CCBC-395 -
[major] CCBC-385: Failed assertion on get-with-replica when connection fails. If a connection fails with a
CMD_GET_REPLICA
command still in the queue an assertion failure will crash the library. This has been fixed by handling the opcode in thefailout_single_request
function. -
[major] CCBC-384: Unknown Winsock error codes crash application. This was fixed by providing proper handlers for Winsock codes which were not explicitly converted into their POSIX equivalents.
-
[major] CCBC-376: Fix memory leak in configuration parsing. A leak was introduced in version 2.3.0 by not freeing the JSON pool structure. This has been fixed in 2.3.1
-
[minor] CCBC-370:
lcb_get_host
andlcb_get_port
may return host-port combinations from different servers. If multiple servers are listening on different ports this may result in yielding an invalid endpoint by combining the output from those two functions. This has been fixed in 2.3.1 by returning the host and port from the first host, in lieu of a currently-connected REST endpoint. -
[minor] CCBC-368: Initial bootstrapping failure may mask
LCB_BUCKET_ENOENT
calls withLCB_ETIMEDOUT
. This has been fixed by not retrying configuration retrieval if an explicit HTTP 404 code is received. Note that when using bootstrap over memcached, a missing bucket may still be manifest asLCB_AUTH_ERROR
. -
[minor] CCBC-367: Ensure
lcb_get_host
does not returnNULL
when the associatedlcb_t
is ofLCB_TYPE_CLUSTER
. This would cause crashes in some applications which relied on this function to not returnNULL
. -
[major] CCBC-389: Fixed Spurious timeouts being delivered in asynchronous use cases. In applications which do not use
lcb_wait()
the library will potentially time out commands internally triggering an erroneous configuration refresh. While this issue would not end up failing operations it will cause unnecessary network traffic for retrieving configurations. Applications usinglcb_wait()
are not affected as that function resets the timeout handler. -
[major] CCBC-332, CCBC-364: Compare configuration revision information for memcached cluster bootstrap. Previously we would refresh the configuration upon receipt of any new configuration update from memcached. This is fixed in 2.3.1 where the configuration will only be applied if it is deemed to be newer than the current configuration. With memcached bootstrap this is only true if the configuration's
rev
field is higher than the current one.
-
[major] CCBC-152: Provide a master-only observe option. This adds a new struct version to the
lcb_observe_cmd_t
which allows to select only the master node. One can use this to efficiently check if the key exists (without retrieving it). It also allows one to get the CAS of the item without fetching it. -
[major] CCBC-281: Fix partial scheduling during multi operations. Previously the library would deliver spurious callbacks if multiple operations were scheduled with a single command and one of the operations could not be mapped to a server. This fixes this behavior and ensures that callbacks are only invoked for items if the entire API call succeeded.
-
[major] CCBC-150: Multi-packet commands will no longer deliver spurious callbacks on failure. Previously these commands would be relocated to the same server during a configuration change, resulting in multiple callbacks for the same command. In this case the client would think all the commands had been completed, and when the next response arrived it would incorrectly map it to a different request.
-
[minor] CCBC-327: Fix assumption of
vbucket_compare()
only returning if a diff exists. This function actually returns a non-NULL pointer always unless it cannot allocate more memory. This bug was introduced with the DP1 release. -
[minor] CCBC-326: Memcached buckets should use streaming config. This was left unchecked in the DP1 release and has now been fixed.
-
[major] CCBC-351: Enhance performance for configuration parsing. In previous versions receiving multiple configurations at once would cause CPU spikes on slower systems. The configuration parser code has been optimized to alleviate this issue.
-
[minor] CCBC-350: Provide
lcb_cntl()
API to retrieve the SCM changeset used by the currently loaded binary. This is a more effective way to get the revision as it does not depend on the specific headers the library was compiled with. -
[major] CCBC-340: Correctly parse
""
,"0"
and"1"
for environment variables. In previous versions having the entry set to an empty string or0
would still be treated by the library as a true value for various environment variables. This has been fixed so that clear "False" values such as the empty string or 0 are treated as such.
-
[major] CCBC-234: Implementation of [Cluster Configuration Carrier Publication][cccp-wiki]. This is the new and more efficient way to bootstrap from a cluster using the native memcached protocol and is quicker than the previous HTTP bootstrap mechanism, dramatically improving startup times and reducing load on the server. This feature is available in server verions 2.5 and greater. The existing HTTP configuration is still supported and will be employed as a fallback in the event that
CCCP
is not supported.In conjunction with this, a new struct version has been added to the
lcb_create_st
parameters structure for use withlcb_create
. This allows you to get more control over how the client is initialized:lcb_t instance; struct lcb_create_st options; lcb_config_transport_t enabled_transports = { LCB_CONFIG_TRANSPORT_CCCP, LCB_CONFIG_TRANSPORT_LIST_END };
memset(&options, 0, sizeof(options)); options.version = 2; options.v.v2.mchosts = "example.com:11210"; options.v.v2.transports = enabled_transports;
lcb_error_t rc = lcb_create(&instance, &options); if (rc != LCB_SUCCESS) { fprintf(stderr, "Failed to create instance: %s ", lcb_strerror(instance, rc)); }
The above snippet will configure a client to always use the
CCCP
protocol and never attempt to fall back on HTTPThe CCCP implementation required a significant rewrite in how sockets were created and re-used. Particularly, a connection pooling feature was implemented.
Additionally, the
cbc
command now has an additional-C
option which accepts the preferred configuration mechanism to use. -
[major] CCBC-305: Implement logging hooks.
This improvements adds various levels of diagnostic logging with the library itself. It may be utilized via the environment (by setting the
LCB_LOGLEVEL
environment variable to a positive integer -- the higher the number the more verbose the logging).Integrators may also use the logging API specified in
<libcouchbase/types.h>
to proxy the library's logging messages into your own application.Current events logged include connection initialization, destruction, connection pool management, configuration changes, and timeouts.
By default the library is silent.
-
[major] CCBC-316: Allow per-node bootstrap/config timeouts. This change allows more finer grained control over how long to wait per-node to receive updated configuration info. This setting helps adjust the initial and subsequent bootstrap processes to help ensure each node gets a slice of time.
-
[major] CCBC-297: Handle spurious EWOULDBLOCK on UV/Win32 This issue caused odd errors on Windows when large amounts of data would be received on the socket.
-
[major] CCBC-169 Handle 302 redirects in HTTP (views, administrative requests). By default the library will follow up to three redirects. Once the limit reached the request will be terminated with code
LCB_TOO_MANY_REDIRECTS
. Limit is configurable throughLCB_CNTL_MAX_REDIRECTS
. If set to -1, it will disable redirect limit.int new_value = 5; lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_MAX_REDIRECTS, &new_value);
-
[major] CCBC-243 Replace isasl with cbsasl, the latter has implemented both PLAIN and CRAM-MD5 authentication mechanisms.
-
LCB_CNTL_MEMDNODE_INFO
command updated to include effective SASL mechanism:cb_cntl_server_t node; node.version = 1; node.v.v1.index = 0; /* first node */ lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_MEMDNODE_INFO, &node); if (node.v.v1.sasl_mech) { printf("authenticated via SASL '%s'
-
", node.v.v1.sasl_mech); }
-
It is also possible to force specific authentication mechanism for the connection handle using
LCB_CNTL_FORCE_SASL_MECH
command:lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_FORCE_SASL_MECH, "PLAIN");
-
[major] CCBC-286 libuv plugin: use same CRT for free/malloc
-
[major] CCBC-288 Fail
NOT_MY_VBUCKET
responses on timeout -
[major] CCBC-275 Do a full purge when negotiation times out. In this case we must purge the server from all commands and not simply pop individual items.
-
[major] CCBC-275 Reset the server's buffers upon reconnection. This fixes a crash experienced when requesting a new read with the previous buffer still in tact. This was exposed by calling
lcb_failout_server
on a timeout error while maintaining the same server struct. -
[major] CCBC-282 Make server buffers reentrant-safe. When purging implicit commands, we invoke callbacks which may in turn cause other LCB entry points to be invoked which can shift the contents and/or positions of the ringbuffers we're reading from.
-
[major] CCBC-204, CCBC-205 Stricter/More inspectable behavior for config cache. This provides a test and an additional
lcb_cntl
operation to check the status of the configuration cache. Also it switches off config cache with memcached buckets.int is_loaded; lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_CONFIG_CACHE_LOADED, &is_loaded); if (is_loaded) { printf("Configuration cache saved us a trip to the config server
"); } else { printf("We had to contact the configuration server for some reason "); }
-
[major] CCBC-278 Use common config retry mechanism for bad configcache. This uses the same error handling mechanism as when a bad configuration has been received from the network. New
LCB_CONFIG_CACHE_INVALID
error code to notify the user of such a situation -
[major] CCBC-274 Handle getl/unl when purging the server (thanks Robert Groenenberg)
-
[major] Don't failout all commands on a timeout. Only fail those commands which are old enough to have timed out already.
-
[major] CCBC-269 Don't record and use TTP/TTR from observe. Just poll at a fixed interval, as the responses from the server side can be unreliable.
-
[minor] Allow hooks for mapping server codes to errors. This also helps handle sane behavior if a new error code is introduced, or allow user-defined logging when a specific error code is received.
lcb_errmap_callback default_callback; lcb_error_t user_map_error(lcb_t instance, lcb_uint16_t in) { if (in == PROTOCOL_BINARY_RESPONSE_ETMPFAIL) { fprintf(stderr, "temporary failure on server
"); } return default_callback(instance, in); }
...
default_callback = lcb_set_errmap_callback(conn, user_map_error);
-
[minor] Add an example of a connection pool. See
example/instancepool
directory -
[minor] CCBC-279 Force
lcb_wait
return result of wait operation instead oflcb_get_last_error
. It returnslast_error
if and only if the handle is not yet configured -
[minor] CCBC-284
cbc-pillowfight
: compute item size correctly during set IfminSize
andmaxSize
are set to the same value it can sometimes crash since it may try to read out of memory bounds from the allocated data buffer. -
[minor] CCBC-283 Apply key prefix CLI option in cbc-pillowfight
-
[minor] Add
--enable-maintainer-mode
. Maintainer mode enables--enable-werror --enable-warnings --enable-debug
, forces all plugins to be installed and forces all tests, tools, and examples to be built -
[minor] CCBC-255 Expose
LCB_MAX_ERROR
to allow user-defined codes
-
[minor] Updated gtest to version 1.7.0. Fixes issue with building test suite with new XCode 5.0 version being released later this month.
-
[major] CCBC-265 Do not try to parse config for
LCB_TYPE_CLUSTER
handles. It fixes timouts for management operations (like 'cbc bucket-create', 'cbc bucket-flush', 'cbc bucket-delete' and 'cbc admin') -
[major] CCBC-263 Skip unfinished SASL commands on rebalance. During rebalance, it is possible that the newly added server doesn't have chance to finish SASL auth before the cluster will push config update, in this case packet relocator messing cookies. Also the patch makes sure that SASL command/cookie isn't mixing with other commands
-
[major] Use cluster type connection for cbc-bucket-flush. Although flush command is accessible for bucket type connections, cbc-bucket-flush doesn't use provided bucket name to connect to, therefore it will fail if the bucket name isn't "default".
-
[major] Allow to make connect order deterministic. It allows the user to toggle between deterministic and random connect order for the supplied nodes list. By default it will randomize the list.
-
[major] Do not allow to use Administrator account for
LCB_TYPE_BUCKET
-
[major] CCBC-258 Fig segmentation faults during tests load of node.js. Sets
inside_handler
onsocket_connected
. Previously we were always using SASL auth, and as such, we wouldn't flush packets from thecmd_log
usingserver_send_packets
(which callsapply_want
).apply_want
shouldn't be called more than once per event loop entry -- so this sets and unsets theinside_handler
flag. -
[major] Added support of libuv 0.8
-
[major] Close config connection before trying next node. It will fix asserts in case of the config node becomes unresponsive, and the threshold controlled by
LCB_CNTL_CONFERRTHRESH
andlcb_cntl(3)
-
[major] CCBC-253, CCBC-254 Use bucket name in SASL if username omitted. Without this fix, you can may encounter a segmentation faults for buckets, which are not protected by a password.
-
[major] Preserve IO cookie in
options_from_info
when using v0 plugins with user-provided IO loop instance. This issue was introduced in 2.1.0. -
[minor] Display the effective IO backend in 'cbc-version'. This is helpful to quickly detect what is the effective IO plugin on a given system.
-
[minor] Use provided credentials for authenticating to the data nodes. With this fix, it is no longer possible to use Administrator credentials with a bucket. If your configuration does so, you must change the credentials you use before applying this update. No documentation guides use of Administrator credentials, so this change is not expected to affect few, if any deployments.
-
[major] CCBC-239 Do not use socket after failout. Fixes segmentation faults during rebalance.
-
[minor] CCBC-245 Distribute debug information with release binaries on Windows
-
[minor] CCBC-248 Do not disable config.h on UNIX-like platforms. It fixes build issue, when application is trying to include plugins from the tarball.
-
[major] CCBC-192 Skip misconfigured nodes in the list. New lcb_cntl(3couchbase) added to control whether the library will skip nodes in initial node list, which listen on configuration port (8091 usually) but doesn't meet required parameters (invalid authentication or missing bucket). By default report this issue and stop trying nodes from the list, like all previous release. Read more at man page lcb_cntl(3couchbase) in section LCB_CNTL_SKIP_CONFIGURATION_ERRORS_ON_CONNECT
-
[major] CCBC-246 Fallback to 'select' IO plugin if default plugin cannot be loaded. On UNIX-like systems, default IO backend is 'libevent', which uses third-party library might be not available at the run-time. Read in lcb_cntl(3couchbase) man page in section LCB_CNTL_IOPS_DEFAULT_TYPES about how to determine effective IO plugin, when your code chose to use LCB_IO_OPS_DEFAULT during connection instantiation. The fallback mode doesn't affect application which specify IO backend explicitly.
-
[major] New backend
select
. This backend is based on the select(2) system call and its Windows version. It could be considered the most portable solution and is available with the libcouchbase core. -
[major] CCBC-236 New backend
libuv
. This backend previously was part of thecouchnode
project and is now available as a plugin. Because libuv doesn't ship binary packages there is no binary packagelibcouchbase2-libuv
. You can build plugin from the source distribution, or through thelibcouchbase-dev
orlibcouchbase-devel
package on UNIX like systems. -
[major] New backend
iocp
. This is a Windows specific backend, which uses "I/O Completion Ports". As a part of the change, a new version of plugin API was introduced which is more optimized to this model of asynchronous IO. -
[major] CCBC-229 Fixed bug when REPLICA_FIRST fails if first try does not return key
-
[major] CCBC-228 Fixed bug when REPLICA_SELECT didn't invoke callbacks for negative error codes
-
[major] CCBC-145 API for durability operations. This new API is based on
lcb_observe(3)
and allows you to monitor keys more easily. See the man pageslcb_durability_poll(3)
andlcb_set_durability_callback(3)
for more info. -
[major] New configuration interface lcb_cntl(3) along with new tunable options of the library and connection instances. In this release the following settings are available. See the man page for more information and examples.:
-
LCB_CNTL_OP_TIMEOUT operation timeout (default 2.5 seconds)
-
LCB_CNTL_CONFIGURATION_TIMEOUT time to fetch cluster configuration. This is similar to a connection timeout (default 5 seconds)
-
LCB_CNTL_VIEW_TIMEOUT timeout for couchbase views (default 75 seconds)
-
LCB_CNTL_HTTP_TIMEOUT timeout for other HTTP operations like RESTful flush, bucket creating etc. (default 75 seconds)
-
LCB_CNTL_RBUFSIZE size of the internal read buffer (default 32768 bytes)
-
LCB_CNTL_WBUFSIZE size of the internal write buffer (default 32768 bytes)
-
LCB_CNTL_HANDLETYPE type of the
lcb\_t
handler (readonly) -
LCB_CNTL_VBCONFIG returns pointer to VBUCKET_CONFIG_HANDLE (readonly)
-
LCB_CNTL_IOPS get the implementation of IO (lcb_io_opt_t)
-
LCB_CNTL_VBMAP get vBucket ID for a given key
-
LCB_CNTL_MEMDNODE_INFO get memcached node info
-
LCB_CNTL_CONFIGNODE_INFO get config node info
-
LCB_CNTL_SYNCMODE control synchronous behaviour (default LCB_ASYNCHRONOUS)
-
LCB_CNTL_IP6POLICY specify IPv4/IPv6 policy (default LCB_IPV6_DISABLED)
-
LCB_CNTL_CONFERRTHRESH control configuration error threshold (default 100)
-
LCB_CNTL_DURABILITY_TIMEOUT durability timeout (default 5 seconds)
-
LCB_CNTL_DURABILITY_INTERVAL durability polling interval (default 100 milliseconds)
-
LCB_CNTL_IOPS_DEFAULT_TYPES get the default IO types
-
LCB_CNTL_IOPS_DLOPEN_DEBUG control verbose printing of dynamic loading of IO plugins.
-
-
[major] CCBC-183 Improve
lcb_get_replica()
. Now it is possible to choose between three strategies:-
LCB_REPLICA_FIRST
: Previously accessible and now the default, the caller will get a reply from the first replica to successfully reply within the timeout for the operation or will receive an error. -
LCB_REPLICA_ALL
: Ask all replicas to send documents/items back. -
LCB_REPLICA_SELECT
: Select one replica by the index in the configuration starting from zero. This approach can more quickly receive all possible replies for a given topology, but it can also generate false negatives.
Note that applications should not assume the order of the replicas indicates more recent data is at a lower index number. It is up to the application to determine which version of a document/item it may wish to use in the case of retrieving data from a replica.
-
-
[major] CCBC-188 Fix segfault when rebalancing When a (!connected) server is reconnected, the tasks in its "pending" buffer will be moved into "output" buffer. If its connection is broken again immediately,
relocate_packets()
will go to wrong path. -
[major] CCBC-202 Don't try to switch to backup nodes when timeout is reached
-
[major] CCBC-188 Check if SASL struct is valid before disposing
-
[major] Fix compile error with sun studio "src/event.c", line 172: error: statement not reached (
E_STATEMENT_NOT_REACHED
) -
[major] Don't invoke HTTP callbacks after cancellation, because user code might assume a previously-freed resource is still valid
-
[minor] CCBC-179 Added an example to properly use the bucket credentials for authentication instead of administrator credentials
-
[minor] example/yajl/couchview.c: pass cookie to the command Fixes coredump when executing ./examples/yajl/couchview
-
[minor] CCBC-201 Add Host header in http request http://cbugg.hq.couchbase.com/bug/bug-555 points out that Host is a required field in HTTP 1.1
-
[minor] Try to search the --libdir for modules if dlopen fails to find the module in the default library path
-
[minor] CCBC-190 New compat mode (experimental) for configuration caching. See man
lcb_create_compat()
-
[minor] Manpage fixes
-
[minor] Fix build on FreeBSD (http://review.couchbase.org/25289)
-
[minor] Fix reconnecting issues on windows (http://review.couchbase.org/25170 and http://review.couchbase.org/25155)
-
[minor] pillowfight example updated to optionally use threads
-
[minor] CCBC-185 The bootstrap URI is not parsed correctly
-
[minor] CCBC-175 Work properly on systems where EWOULDBLOCK != EAGAIN
-
[critical] CCBC-180 Segmentation fault when the hostname resolved into several addresses and first of them reject couchbase connections.
-
[major] CCBC-182 The library stops iterating backup nodes list if the next one isn't accessible.
-
[major] CCBC-147 Fixed illegal memory access in win32 plugin
-
[minor] CCBC-178 Build error on solaris/sparc: -Werror=cast-align
-
[minor] bypass SASL LIST MECH
-
[minor] Shrink internal lookup tables (and reduce the size of
lcb_t
) -
[minor] Add a new library:
libcouchbase_debug.so
(see include/libcouchbase/debug.h) which is a new library that contains new debug functionality. -
[minor] Added manual pages for the library
-
[major] CCBC-153 Reset internal state on
lcb_connect()
. Allow caller to uselcb_connect()
multiple times to implement reconnecting using the samelcb_t
instance. Also it sets up the initial-connection timer for users who don't uselcb_wait()
and drive IO loop manually. -
[major] CCBC-171 Invalid read in libevent plugin, when the plugin compiled in 1.x mode
-
[critical] CCBC-155 Observe malfunctions in the case of multiple keys and server failure
-
[major] CCBC-156 The ep-engine renders meaningful body for observe responses only if status code is 0 (
PROTOCOL_BINARY_RESPONSE_SUCCESS
). We shouldn't interpret response body in other cases, just decode & failout request instead. Also we shouldn't retry observe commands onPROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET
, because it can cause the client to loop infinitely -
[major] CCBC-145 KV Durability operation API. Async APIs added to allow the checking of the durability (replication and persistence) status of a key, and to notify the user when a specific criteria has been satisfied.
-
[major] CCBC-150 commands sent to multiple servers fail to detect the respose if mixed with other commands.
-
[minor] CCBC-143 'cbc version' reports that uses 2.0.0, but really installed with 2.0.1. Minor but confusing issue.
-
[major] CCBC-151 Cancellation of the HTTP request might lead to memory leaks or to segfaults (2e3875c2).
-
[minor] Document
LCB_SERVER_BUG
andLCB_PLUGIN_VERSION_MISMATCH
. Enhance the thelcb_strerror()
test to detect undocumented error codes. -
[critical] CCBC-153 Under high load the library could generate
LCB_ETIMEDOUT
errors without reason owing to internal limitations.
50 files changed, 1009 insertions(+), 274 deletions(-)
-
libev-plugin: delay all timers while the loop isn't active. It will fix
LCB_ETIMEOUT
in the following scenario:- connect the instance
- sleep for time greater than default timeout (e.g. 3 seconds)
- schedule and execute a command (it will be timed out immediately)
-
libev-plugin: reset IO event on delete. We need to reset it, because it might be re-used later
-
CCBC-136: do not abort when purging SASL commands
-
Make library C89 friendly again
-
CCBC-132, CCBC-133: Ensure HTTP works even when the network may be unreliable. This changeset encompasses several issues which had been found with HTTP requests during network errors and configuration changes. Specifically some duplicate code paths were removed, and the process for delivering an HTTP response back to the user is more streamlined.
-
CCBC-130: Fix a memory leak on the use of http headers
-
CCBC-131: Compensate for cluster nodes lacking couchApiBase
-
Fix possible SEGFAULT. Not-periodic timers are destroyed after calling user's callback, after that library performed read from freed pointer.
-
SystemTap and DTrace integration
12 files changed, 50 insertions(+), 12 deletions(-)
-
Install unlock callback in synchronous mode
-
Add the CAS to the delete callback
-
Minor update of the packaging layout:
- libcouchbase-all package comes without version
- extract debug symbols from libcouchbase-{bin,core} to libcouchbase-dbg package
64 files changed, 3641 insertions(+), 735 deletions(-)
-
CCBC-104 Fix illegal memory access. Reconnect config listener if the config connection was gone without proper shutdown.
-
Check for EWOULDBLOCK/EINTR on failed send
-
Allow to use gethrtime() from C++
-
Fix using freed memory (was introduced in 4397181)
-
Use dynamic versioning for plugins
-
Remove libtool version from the plugins
-
Allow to use 'cbc-hash' with files
-
CCBC-120 Purge stale OBSERVE packets
-
CCBC-120 Reformat and refactor
lcb_server_purge_implicit_responses
:- move packet allocation out of GET handler
- dropping NOOP command shouldn't return error code
-
CCBC-122 Try to switch another server from backup list on timeout
-
CCBC-119: Allow the user to specify a different hash key. All of the data operations contains a hashkey and nhashkey field. This allows you to "group" items together in your cluster. A typical use case for this is if you're storing lets say data for a single user in multiple objects. If you want to ensure that either all or none of the objects are available if a server goes down, it could be a good idea to locate them on the same server. Do bear in mind that if you do try to decide where objects is located, you may end up with an uneven distribution of the number of items on each node. This will again result in some nodes being more busy than others etc. This is why some clients doesn't allow you to do this, so bear in mind that by doing so you might not be able to get your objects from other clients.
-
Create man pages for cbc and cbcrc
-
CCBC-118
lcb_error_t
member in the http callbacks shouldn't reflect the HTTP response code. So the error code will be alwaysLCB_SUCCESS
if the library managed to receive the data successfully. -
CCBC-115 Return zero from
do_read_data()
ifoperations_per_call
reached. The `operations_per_call' limit was introduced to prevent from freezing event loop. But in the function variable rv could store two different results and in case of reaching this limit it is returning number of the processed records, which is wrong. The function should return either zero (success) or non-zero (failure). -
Do not allow admin operations without authentication
-
Fix cbc-bucket-create. `sasl-password' is misspelled, and it fails to parse the command line option.
-
CCBC-114 Lookup the plugin symbol also in the current executable image.
-
CCBC-113 Remove unauthorized asserion (d344037). The
lcb_server_send_packets()
function later check if the server object connected and establish connection if not (with raising possible errors) -
Try all known plugins for
LCB_IO_OPS_DEFAULT
in run time -
Don't use the
time_t
for win32. When compiling from php it turns out that it gets another size of thetime_t
type, causing the struct offsets to differ. -
Add
lcb_verify_compiler_setup()
. This function allows the "user" of the library to verify that the compiler use a compatible struct packing scheme. -
CCBC-87: Add documentation about the error codes
81 files changed, 2822 insertions(+), 1353 deletions(-)
-
Search ev.h also in ${includedir}/libev
-
Fix SEGFAULT if IO struct is allocated not by the
lcb_create()
-
Allow libcouchbase to connect to an instance without specifying bucket. It is useful when the bucket not needed, e.g. when performing administration tasks.
-
Fix memory leak after an unsuccessful connection
-
Fix invalid memory access in cbc tool. Affected command is cbc-bucket-create
-
lcb_create
: replaceassert()
with error code -
CCBC-105 breakout event loop in default
error_callback
. This provides better default behaviour for users who haven't defined global error callback. -
Allow users to build the library without dependencies. For example, without plugins at all. This may be useful if the plugin is implemented by or built into the host application.
-
Allow users to install both libraries (2.x and 1.x) on the same system.
-
Make the content type optional for
lcb_make_http_request()
-
Fix password memory leak in http.c (7e71493)
-
Add support for raw http requests. libcouchase already contains all the bits to execute a raw http request, except for the possibility to specify a host:port, username and password.
-
Cleanup HTTP callbacks. Use the same callbacks both for Management and View commands, and rename them to
lcb_http_complete_callback
andlcb_http_data_callback
. -
Allow users to use environment variables to pick the event plugin
-
Add a new interface version for creating IO objects via plugins
-
Implement a new libev plugin. It is compatible with both libev3 and libev4.
-
CCBC-103: Fix linked event/timer lists for win32
-
Allow to disable CXX targets
-
lcb_connect()
should honor the syncmode setting. Automatically calllcb_wait()
when in synchronous mode
123 files changed, 13753 insertions(+), 8264 deletions(-)
-
Refactor the API. This is a full redesign of the current libcouchbase API that'll allow us to extend parts of the API without breaking binary compatibility. Also it renames all functions to have
lcb_
prefix instead oflibcouchbase_
andLCB
/LIBCOUCHBASE
in macros. -
Added --enable-fat-binary. Helps to solve issues when linking with fat binaries on MacOS.
-
Implement getter for number of nodes in the cluster:
lcb_get_num_nodes()
-
Implement RESTful flush in the cbc toolset
-
Bundle Windows packages as zip archives
-
CCBC-98 Differentiate between TMPFAILs. This allows a developer to know if the temporary condition where the request cannot be handled is due to a constraint on the client or the server.
-
Don't try to put the current node last in the backup list. This may cause "duplicates" in the list if the REST server returns another name for the server than you used. Ex: you specify "localhost" and the REST response contains 127.0.0.1
-
Fix locking keys in multi-get mode
-
Fix bug where HTTP method is not set
-
CCBC-96 Correct buffer length for POST/PUT headers
-
Add
lcb_get_server_list
-
Merge
lcb_get_locked
intolcb_get
function -
Fix Windows build
-
Include sys/uio.h. Needed by OpenBSD
-
Fix mingw build (c394a1c)
-
CCBC-80: Default to IPv4 only
-
Sync
memcached/protocol_binary.h
. Pull extraprotocol_binary_datatypes
declarations. -
Deliver HTTP headers via callbacks
-
Unify HTTP interface. This means massive rename of the symbols
-
CCBC-92 release ringbuffer in
lcb_purge_single_server
-
CCBC-91 Fix switching to backup node in case of server outage
-
CCBC-91 Reset timer for commands with
NOT_MY_VBUCKET
response -
Fix alignment for sparc platforms
-
Fix win32 build (Add strings.h)
-
Fix build with libyajl available
-
Bundle libvbucket
-
Fix a problem with allocating too few slots in the
backup_nodes
. Fixes illegal memory access. -
CCBC-90 Fix initialization of backup nodes array. The code switching nodes relies on NULL terminator rather than
nbackup_nodes
variable. Fixes illegal memory access. -
CCBC-89: Release the memory allocated by the http parser
5 files changed, 18 insertions(+), 5 deletions(-)
- CCBC-92 release ringbuffer in
libcouchbase_purge_single_server
6 files changed, 23 insertions(+), 15 deletions(-)
-
CCBC-91 Fix switching to backup node in case of server outage
-
CCBC-91 Reset timer for commands with
NOT_MY_VBUCKET
response
5 files changed, 18 insertions(+), 11 deletions(-)
- Render auth credentials for View requests.
libcouchbase_make_http_request()
won't accept credentials anymore. It will pick them bucket configuration.
36 files changed, 2093 insertions(+), 704 deletions(-)
-
Allow the client to specify the verbosity level on the servers using
lcb_set_verbosity()
function. -
Bind timeouts to server sockets instead of commands. This means that from this point timeout interval will be started from the latest IO activity on the socket. This is a behavior change from the 1.0 series.
-
Allow the user to get the number of replicas using
libcouchbase_get_num_replicas()
-
Allow a user to breakout from the event loop in callbacks using
libcouchbase_breakout()
-
Make
libcouchbase_wait()
re-entrable -
Let users detect if the event loop running already using
libcouchbase_is_waiting()
function. -
CCBC-77 Use separate error code for ENOMEM on the client
-
CCBC-82 Implement read replica
-
CCBC-85 Implement general purpose timers. It is possible for users to define their own timers using
libcouchbase_timer_create()
function. (See headers for more info) -
Implement multiple timers for windows
-
CCBC-15 Add OBSERVE command
-
Allow users to specify content type for HTTP request
-
Fix to handle the case when View base doesn't have URI schema
-
Separate HTTP callbacks for couch and management requests
-
Claim that server has data in buffers if there are HTTP requests pending. Without this patch the event loop can be stopped prematurely.
-
Add new cbc commands and options:
- cbc-view (remove couchview example)
- cbc-verbosity
- cbc-admin
- cbc-bucket-delete
- cbc-bucket-create
- Add -p and -r options to cbc-cp to control persistence (uses OBSERVE internally)
18 files changed, 266 insertions(+), 115 deletions(-)
-
Add support for notification callbacks for configuration changes. Now it is possible to install a hook using function
libcouchbase_set_configuration_callback()
, and be notified about all configuration changes. -
Implement function to execution management requests. Using
libcouchbase_make_management_request()
function you can configure the cluster, add/remove buckets, rebalance etc. It behaves likelibcouchbase_make_couch_request()
but works with another endpoint. -
Extract HTTP client. Backward incompatible change in Couchbase View subsystem
20 files changed, 201 insertions(+), 127 deletions(-)
-
CCBC-70 Close dynamic libraries. Fixes small memory leak
-
CCBC-72 Fix compilation on macosx with gtest from homebrew
-
CCBC-71 Implement 'help' command for cbc tool
-
Undefine NDEBUG to avoid asserts to be optimized out
-
Fix win32 builds:
- Add suffix to cbc command implementations
- Fix guards for socket errno macros
- Define
size_t
types to fix MSVC 9 build - MSVC 9 isn't C99, but has stddef.h, so just include it
-
CCBC-63 Include types definitions for POSIX systems. Fixes C++ builds on some systems.
7 files changed, 65 insertions(+), 9 deletions(-)
-
The library doesn't depend on pthreads (eliminates package lint warnings)
-
Implement 'cbc-hash' to match server/vbucket for given key
8 files changed, 54 insertions(+), 7 deletions(-)
-
cbc: strtoull doesn't exist on win32, therefore use C++ equivalent.
-
integration with Travis-CI
54 files changed, 1874 insertions(+), 824 deletions(-)
-
CCBC-68 Implement
UNLOCK_KEY
(UNL
) command -
CCBC-68 Implement
GET_LOCKED
(GETL
) command -
hashset.c: iterate over whole set on rehashing. Fixes memory leaks related to hash collisions (905ef95)
-
Destroy view requests items when server get destroyed
-
Do not call View callbacks for cancelled requests
-
Fix
ringbuffer_memcpy()
(36afdb2) -
CCBC-62 A hang could occur in
libcouchbase_wait()
after the timeout period. Check for breakout condition after purging servers -
CCBC-65 A small memory leak can occur with frequent calls to
libcouchbase_create()
andlibcouchbase_destroy()
-
CCBC-64. Timeouts can occur during topology changes, rather than be correctly retried. Send the retry-packet to new server
-
vbucket_found_incorrect_master()
returns server index -
Fix
ringbuffer_is_continous()
-
Pick up cookies from pending buffer unless node connected
-
RCBC-33 A fix for a buffer overflow with the supplied password as has been integrated. While it is a buffer overflow issue, this is not considered to be a possible security issue because the password to the bucket is not commonly supplied by an untrusted source
15 files changed, 330 insertions(+), 76 deletions(-)
-
CCBC-65 A small memory leak can occur with frequent calls to
libcouchbase_create()
andlibcouchbase_destroy()
-
CCBC-62 A hang could occur in
libcouchbase_wait()
after the timeout period. Check for breakout condition after purging servers -
CCBC-64. Timeouts can occur during topology changes, rather than be correctly retried. Send the retry-packet to new server
-
[backport]
vbucket_found_incorrect_master()
returns server index. (orig: c32fdae)
6 files changed, 44 insertions(+), 7 deletions(-)
-
[backport] Fix
ringbuffer_is_continous()
(orig: 9cfda9d) -
[backport] Pick up cookies from pending buffer unless node connected (orig: 463958d)
-
RCBC-33 A fix for a buffer overflow with the supplied password as has been integrated. While it is a buffer overflow issue, this is not considered to be a possible security issue because the password to the bucket is not commonly supplied by an untrusted source
10 files changed, 54 insertions(+), 20 deletions(-)
-
CCBC-59 Don't wait for empty buffers. If called with no operations queued,
libcouchbase_wait()
will block forever. This means that a single threaded application that callslibcouchbase_wait()
at different times to make sure operations are sent to the server runs the risk of stalling indefinitely. This is a very likely scenario. -
Don't define
size_t
andssize_t
for VS2008 -
Fix segfault while authorizing on protected buckets (211bb04)
59 files changed, 4374 insertions(+), 1205 deletions(-)
-
This release adds new functionality to directly access Couchbase Server views using the
libcouchbase_make_couch_request()
function. See the associated documentation and header files for more details -
Check for newer libvbucket
-
MB-4834: Request the tap bytes in a known byte order (adf2b30)
83 files changed, 4095 insertions(+), 654 deletions(-)
-
Implement VERSION command from binary protocol
-
Allow use of libcouchbase to pure memcached clusters by using
libcouchbase_create_compat()
function -
Always sign deb packages and allow to pass PGP key
-
Bundle the protocol definitions for memcached (
memcached/protocol_binary.h
andmemcached/vbucket.h
) to make it easier to build -
Bundle sasl client implementation
-
Fix windows build for MS Visual Studio 9
- define
E*
if missing - stdint header
- define
-
Add support for multiple hosts for the bootstrap URL. A list of hosts:port separated by ';' to the administration port of the couchbase cluster. (ex: "host1;host2:9000;host3" would try to connect to host1 on port 8091, if that fails it'll connect to host2 on port 9000 etc)
-
Raise error if <stdint.h> missing
-
Add JSON support for cbc-cp command
-
Add option to set timeout for cbc
-
Added support for '-' to cp
-
Added cbc-verify: verify content in cache with files
-
Now cbc supports better usage messages
65 files changed, 3275 insertions(+), 1329 deletions(-)
-
CCBC-38 Use alternate nodes when current is dead. A fix to allow the client library to failover automatically to other nodes when the initial bootstrap node becomes unavailable has been added. All users are recommended to upgrade for this fix.
-
Fix connect timeouts. Timeouts are per-operation and only set if there is any I/O. The special exception to this is initial connections, which do not necessarily have a data stream or write buffer associated wiht them yet.
-
Update to new MT-safe libvbucket API
-
Add option for embedding libevent IO plugin
-
Fix multi-{get,touch} requests handling when nkeys > 1
-
Allow to build without tools which require C++ compiler
-
Destroy event base if we created it
-
CCBC-51 Check server index before using
-
Handle
PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET
and retry it until success or another error, which can be handled by caller -
Do not attempt SASL when SASL already in progress
-
Finer grained error reporting for basic REST errors:
- return
LIBCOUCHBASE_AUTH_ERROR
on HTTP 401 - return
LIBCOUCHBASE_BUCKET_ENOENT
on HTTP 404 - event loop is stopped (via
maybe_breakout
) on REST error
- return
-
Fixed segfaults and memory access errors on libevent1.4
-
Allow for notification on initial vbucket config. This makes libcouchbase
stop_event_loop
and libcouchbase maybe breakout work properly in cooperative asynchronous event loops. the wait flag is set bylibcouchbase_wait()
and unset bymaybe_breakout
. Additionally,breakout_vbucket_state_listener
will callmaybe_breakout
as well, instead of having synchronous behavior assumed bylibcouchbase_wait()
-
Fix
sasl_list_mech_response_handler()
.sasl_client_start()
expects null-terminated string -
Refactor: use
libcouchbase_xxxx
for the datatypes -
Do not notify user about the same error twice. Use command callback when it's possible. (e.g. where the
libcouchbase_server_t
is accessible and we canlibcouchbase_failout_server()
) -
Install configuration.h for win32
-
CCBC-20 Implement operation timeouts. Timeouts applies for all operations, and the timer starts running from the moment you call the libcouchbase operation you want. The timer includes times for connect/send/ receive, and all of the time our application spend before letting the event loop call callbacks into libcouchbase.
-
Fix double free() error when reading key from packet in handler.c (b5d485a)
170 files changed, 6048 insertions(+), 7553 deletions(-)
-
Allow the user to specify sync mode on an instance
-
Empty string as bucket name should be treated as NULL
-
Bail out if you can't find memcached/vbucket.h and libvbucket/vbucket.h
-
New command cbc. This command intended as the analog of
mem*
tools from libmemcached distribution. Supported commands:- cbc-cat
- cbc-cp
- cbc-create
- cbc-flush
- cbc-rm
- cbc-stats
- cbc-send
- cbc-receive
-
CCBC-37 allow config for cbc tool to be read from .cbcrc
-
Convert flags to network byte order
-
Remove <memcached/vbucket.h> dependency
-
Use the error handler instead of printing to stderr
-
Disable Views code
-
Don't accept NULL as a valid "callback"
-
Add make targets to build RPM and DEB packages
-
Allow download memcached headers from remote host
-
Added docbook-based manual pages
-
Gracefully update vbucket configuration. This means that the connection listener, could reconfigure data sockets on the fly
-
Allow libcouchbase build with libevent 1.x (verified for 1.4.14)
-
Aggregate flush responses
-
Add stats command
102 files changed, 6188 insertions(+), 1531 deletions(-)
-
Add flush command from binary protocol
-
Remove packet filter
-
Use ringbuffers instead
buffer_t
-
Win32 build fixes
-
Allow to specify IO framework but using IO plugins
-
CCBC-11 The interface to access views
-
Initial man pages
-
Extend the test suite
85 files changed, 12144 insertions(+)
-
Simple bootstapping which builds HTTP packet and listens /pools/default/buckets/BUCKETNAME directly. Allowed usage of defaults (bucket name, password)
-
Support basic set of binary protocol commands:
- get (get and touch)
- set
- increment/decrement
- remove
- touch
-
MB-3294 Added
_by_key
functions -
CCBC-5 Fixed abort in
do_read_data
(c=0x7b09bf0) at src/event.c:105 -
Added timings API. It might be possible to turn on timing collection using
libcouchbase_enable_timings()
/libcouchbase_disable_timings()
, and receive the data in timings callback. -
Basic TAP protocol implementation
-
Initial win32 support