libcouchbase 0.3.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/libcouchbase/CMakeLists.txt +6 -8
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
- data/ext/libcouchbase/cmake/defs.mk.in +0 -2
- data/ext/libcouchbase/cmake/source_files.cmake +21 -5
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
- data/ext/libcouchbase/example/users/README +48 -0
- data/ext/libcouchbase/example/users/users.c +147 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
- data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
- data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
- data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
- data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
- data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
- data/ext/libcouchbase/src/README.md +0 -2
- data/ext/libcouchbase/src/auth-priv.h +23 -4
- data/ext/libcouchbase/src/auth.cc +51 -43
- data/ext/libcouchbase/src/bootstrap.cc +244 -0
- data/ext/libcouchbase/src/bootstrap.h +58 -38
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
- data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
- data/ext/libcouchbase/src/cbft.cc +22 -27
- data/ext/libcouchbase/src/cntl.cc +56 -22
- data/ext/libcouchbase/src/connspec.cc +47 -6
- data/ext/libcouchbase/src/connspec.h +27 -0
- data/ext/libcouchbase/src/dns-srv.cc +147 -0
- data/ext/libcouchbase/src/dump.cc +3 -3
- data/ext/libcouchbase/src/errmap.cc +173 -0
- data/ext/libcouchbase/src/errmap.h +198 -0
- data/ext/libcouchbase/src/getconfig.cc +7 -33
- data/ext/libcouchbase/src/handler.cc +118 -7
- data/ext/libcouchbase/src/hostlist.cc +0 -36
- data/ext/libcouchbase/src/hostlist.h +44 -62
- data/ext/libcouchbase/src/http/http-priv.h +125 -112
- data/ext/libcouchbase/src/http/http.cc +27 -35
- data/ext/libcouchbase/src/http/http.h +1 -34
- data/ext/libcouchbase/src/http/http_io.cc +28 -36
- data/ext/libcouchbase/src/instance.cc +131 -34
- data/ext/libcouchbase/src/internal.h +58 -26
- data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
- data/ext/libcouchbase/src/jsparse/parser.h +84 -98
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
- data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
- data/ext/libcouchbase/src/lcbio/connect.h +16 -7
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
- data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
- data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
- data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
- data/ext/libcouchbase/src/lcbio/manager.h +133 -96
- data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/mc/mcreq.c +11 -2
- data/ext/libcouchbase/src/mc/mcreq.h +9 -2
- data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
- data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
- data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
- data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
- data/ext/libcouchbase/src/mctx-helper.h +51 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
- data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
- data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
- data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +6 -26
- data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
- data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
- data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
- data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
- data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +3 -8
- data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
- data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
- data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
- data/ext/libcouchbase/src/packetutils.h +30 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/rdb/rope.c +1 -1
- data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
- data/ext/libcouchbase/src/retryq.cc +52 -14
- data/ext/libcouchbase/src/retryq.h +3 -3
- data/ext/libcouchbase/src/settings.c +5 -0
- data/ext/libcouchbase/src/settings.h +11 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
- data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
- data/ext/libcouchbase/src/views/docreq.h +24 -30
- data/ext/libcouchbase/src/views/viewreq.cc +318 -0
- data/ext/libcouchbase/src/views/viewreq.h +43 -13
- data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
- data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
- data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
- data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
- data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
- data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
- data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
- data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
- data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
- data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
- data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
- data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
- data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
- data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
- data/ext/libcouchbase/tools/cbc.cc +143 -10
- data/ext/libcouchbase/tools/docgen/loc.h +1 -1
- data/lib/libcouchbase/connection.rb +4 -3
- data/lib/libcouchbase/version.rb +1 -1
- metadata +37 -28
- data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
- data/ext/libcouchbase/src/bootstrap.c +0 -269
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
- data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
- data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
- data/ext/libcouchbase/src/lcbio/connect.c +0 -557
- data/ext/libcouchbase/src/lcbio/manager.c +0 -584
- data/ext/libcouchbase/src/packetutils.c +0 -37
- data/ext/libcouchbase/src/simplestring.c +0 -211
- data/ext/libcouchbase/src/simplestring.h +0 -228
- data/ext/libcouchbase/src/ssobuf.h +0 -82
- data/ext/libcouchbase/src/views/viewreq.c +0 -358
- data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
-
/*
|
|
3
|
-
* Copyright 2014 Couchbase, Inc.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#include <lcbio/lcbio.h>
|
|
19
|
-
#include <lcbio/timer-ng.h>
|
|
20
|
-
#include <libcouchbase/vbucket.h>
|
|
21
|
-
#include "clconfig.h"
|
|
22
|
-
|
|
23
|
-
#define LOGARGS(mcr, lvlbase) mcr->base.parent->settings, "mcraw", LCB_LOG_##lvlbase, __FILE__, __LINE__
|
|
24
|
-
#define LOGFMT "(MCRAW=%p)> "
|
|
25
|
-
#define LOGID(mcr) (void *)mcr
|
|
26
|
-
|
|
27
|
-
/* Raw memcached provider */
|
|
28
|
-
|
|
29
|
-
typedef struct {
|
|
30
|
-
/* Base provider */
|
|
31
|
-
clconfig_provider base;
|
|
32
|
-
/* Current (user defined) configuration */
|
|
33
|
-
clconfig_info *config;
|
|
34
|
-
lcbio_pTIMER async;
|
|
35
|
-
} bc_MCRAW;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
static void
|
|
39
|
-
async_update(void *arg)
|
|
40
|
-
{
|
|
41
|
-
bc_MCRAW *mcr = arg;
|
|
42
|
-
if (!mcr->config) {
|
|
43
|
-
lcb_log(LOGARGS(mcr, WARN), "No current config set. Not setting configuration");
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
lcb_confmon_provider_success(&mcr->base, mcr->config);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
static clconfig_info* get_cached(clconfig_provider *pb) {
|
|
50
|
-
return ((bc_MCRAW *)pb)->config;
|
|
51
|
-
}
|
|
52
|
-
static lcb_error_t get_refresh(clconfig_provider *pb) {
|
|
53
|
-
lcbio_async_signal( ((bc_MCRAW*)pb)->async );
|
|
54
|
-
return LCB_SUCCESS;
|
|
55
|
-
}
|
|
56
|
-
static lcb_error_t pause_mcr(clconfig_provider *pb) {
|
|
57
|
-
(void)pb;
|
|
58
|
-
return LCB_SUCCESS;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
static void configure_nodes(clconfig_provider *pb, const hostlist_t hl)
|
|
62
|
-
{
|
|
63
|
-
bc_MCRAW *mcr = (bc_MCRAW *)pb;
|
|
64
|
-
lcbvb_SERVER *servers;
|
|
65
|
-
lcbvb_CONFIG *newconfig;
|
|
66
|
-
unsigned ii, nsrv;
|
|
67
|
-
|
|
68
|
-
nsrv = hostlist_size(hl);
|
|
69
|
-
|
|
70
|
-
if (!nsrv) {
|
|
71
|
-
lcb_log(LOGARGS(mcr, FATAL), "No nodes provided");
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
servers = calloc(nsrv, sizeof(*servers));
|
|
76
|
-
for (ii = 0; ii < nsrv; ii++) {
|
|
77
|
-
int itmp;
|
|
78
|
-
const lcb_host_t *curhost = hostlist_get(hl, ii);
|
|
79
|
-
lcbvb_SERVER *srv = servers + ii;
|
|
80
|
-
|
|
81
|
-
/* just set the memcached port and hostname */
|
|
82
|
-
srv->hostname = (char *)curhost->host;
|
|
83
|
-
sscanf(curhost->port, "%d", &itmp);
|
|
84
|
-
srv->svc.data = itmp;
|
|
85
|
-
if (pb->parent->settings->sslopts) {
|
|
86
|
-
srv->svc_ssl.data = itmp;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
newconfig = lcbvb_create();
|
|
91
|
-
lcbvb_genconfig_ex(newconfig, "NOBUCKET", "deadbeef", servers, nsrv, 0, 2);
|
|
92
|
-
lcbvb_make_ketama(newconfig);
|
|
93
|
-
newconfig->revid = -1;
|
|
94
|
-
|
|
95
|
-
if (mcr->config) {
|
|
96
|
-
lcb_clconfig_decref(mcr->config);
|
|
97
|
-
mcr->config = NULL;
|
|
98
|
-
}
|
|
99
|
-
mcr->config = lcb_clconfig_create(newconfig, LCB_CLCONFIG_MCRAW);
|
|
100
|
-
mcr->config->cmpclock = gethrtime();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
lcb_error_t
|
|
104
|
-
lcb_clconfig_mcraw_update(clconfig_provider *pb, const char *nodes)
|
|
105
|
-
{
|
|
106
|
-
lcb_error_t err;
|
|
107
|
-
bc_MCRAW *mcr = (bc_MCRAW *)pb;
|
|
108
|
-
hostlist_t hl = hostlist_create();
|
|
109
|
-
err = hostlist_add_stringz(hl, nodes, LCB_CONFIG_MCCOMPAT_PORT);
|
|
110
|
-
if (err != LCB_SUCCESS) {
|
|
111
|
-
hostlist_destroy(hl);
|
|
112
|
-
return err;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
configure_nodes(pb, hl);
|
|
116
|
-
hostlist_destroy(hl);
|
|
117
|
-
lcbio_async_signal(mcr->async);
|
|
118
|
-
return LCB_SUCCESS;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
static void
|
|
122
|
-
mcraw_shutdown(clconfig_provider *pb)
|
|
123
|
-
{
|
|
124
|
-
bc_MCRAW *mcr = (bc_MCRAW *)pb;
|
|
125
|
-
if (mcr->config) {
|
|
126
|
-
lcb_clconfig_decref(mcr->config);
|
|
127
|
-
}
|
|
128
|
-
if (mcr->async) {
|
|
129
|
-
lcbio_timer_destroy(mcr->async);
|
|
130
|
-
}
|
|
131
|
-
free(mcr);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
clconfig_provider *
|
|
135
|
-
lcb_clconfig_create_mcraw(lcb_confmon *parent)
|
|
136
|
-
{
|
|
137
|
-
bc_MCRAW *mcr = calloc(1, sizeof(*mcr));
|
|
138
|
-
if (!mcr) {
|
|
139
|
-
return NULL;
|
|
140
|
-
}
|
|
141
|
-
mcr->async = lcbio_timer_new(parent->iot, mcr, async_update);
|
|
142
|
-
mcr->base.parent = parent;
|
|
143
|
-
mcr->base.type = LCB_CLCONFIG_MCRAW;
|
|
144
|
-
mcr->base.get_cached = get_cached;
|
|
145
|
-
mcr->base.refresh = get_refresh;
|
|
146
|
-
mcr->base.pause = pause_mcr;
|
|
147
|
-
mcr->base.configure_nodes = configure_nodes;
|
|
148
|
-
mcr->base.shutdown = mcraw_shutdown;
|
|
149
|
-
return &mcr->base;
|
|
150
|
-
}
|
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
-
/*
|
|
3
|
-
* Copyright 2013 Couchbase, Inc.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
#include "internal.h"
|
|
19
|
-
#include "clconfig.h"
|
|
20
|
-
#define LOGARGS(mon, lvlbase) mon->settings, "confmon", LCB_LOG_##lvlbase, __FILE__, __LINE__
|
|
21
|
-
#define LOG(mon, lvlbase, msg) lcb_log(mon->settings, "confmon", LCB_LOG_##lvlbase, __FILE__, __LINE__, msg)
|
|
22
|
-
|
|
23
|
-
static void async_stop(void *);
|
|
24
|
-
static void async_start(void *);
|
|
25
|
-
static int do_next_provider(lcb_confmon *mon);
|
|
26
|
-
static void invoke_listeners(lcb_confmon *mon,
|
|
27
|
-
clconfig_event_t event,
|
|
28
|
-
clconfig_info *info);
|
|
29
|
-
|
|
30
|
-
#define IS_REFRESHING(mon) ((mon)->state & CONFMON_S_ACTIVE)
|
|
31
|
-
|
|
32
|
-
static clconfig_provider *next_active(lcb_confmon *mon, clconfig_provider *cur)
|
|
33
|
-
{
|
|
34
|
-
if (!LCB_LIST_HAS_NEXT((lcb_list_t *)&mon->active_providers, &cur->ll)) {
|
|
35
|
-
return NULL;
|
|
36
|
-
}
|
|
37
|
-
return LCB_LIST_ITEM(cur->ll.next, clconfig_provider, ll);
|
|
38
|
-
}
|
|
39
|
-
static clconfig_provider *first_active(lcb_confmon *mon)
|
|
40
|
-
{
|
|
41
|
-
if (LCB_LIST_IS_EMPTY((lcb_list_t *)&mon->active_providers)) {
|
|
42
|
-
return NULL;
|
|
43
|
-
}
|
|
44
|
-
return LCB_LIST_ITEM(mon->active_providers.next, clconfig_provider, ll);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
static const char *
|
|
48
|
-
provider_string(clconfig_method_t type) {
|
|
49
|
-
if (type == LCB_CLCONFIG_HTTP) { return "HTTP"; }
|
|
50
|
-
if (type == LCB_CLCONFIG_CCCP) { return "CCCP"; }
|
|
51
|
-
if (type == LCB_CLCONFIG_FILE) { return "FILE"; }
|
|
52
|
-
if (type == LCB_CLCONFIG_MCRAW) { return "MCRAW"; }
|
|
53
|
-
if (type == LCB_CLCONFIG_USER) { return "USER"; }
|
|
54
|
-
return "";
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
lcb_confmon* lcb_confmon_create(lcb_settings *settings, lcbio_pTABLE iot)
|
|
58
|
-
{
|
|
59
|
-
int ii;
|
|
60
|
-
lcb_confmon * mon = calloc(1, sizeof(*mon));
|
|
61
|
-
mon->settings = settings;
|
|
62
|
-
mon->iot = iot;
|
|
63
|
-
lcb_list_init(&mon->listeners);
|
|
64
|
-
lcb_clist_init(&mon->active_providers);
|
|
65
|
-
lcbio_table_ref(mon->iot);
|
|
66
|
-
lcb_settings_ref(mon->settings);
|
|
67
|
-
|
|
68
|
-
mon->all_providers[LCB_CLCONFIG_FILE] = lcb_clconfig_create_file(mon);
|
|
69
|
-
mon->all_providers[LCB_CLCONFIG_CCCP] = lcb_clconfig_create_cccp(mon);
|
|
70
|
-
mon->all_providers[LCB_CLCONFIG_HTTP] = lcb_clconfig_create_http(mon);
|
|
71
|
-
mon->all_providers[LCB_CLCONFIG_USER] = lcb_clconfig_create_user(mon);
|
|
72
|
-
mon->all_providers[LCB_CLCONFIG_MCRAW] = lcb_clconfig_create_mcraw(mon);
|
|
73
|
-
|
|
74
|
-
for (ii = 0; ii < LCB_CLCONFIG_MAX; ii++) {
|
|
75
|
-
mon->all_providers[ii]->parent = mon;
|
|
76
|
-
}
|
|
77
|
-
mon->as_stop = lcbio_timer_new(iot, mon, async_stop);
|
|
78
|
-
mon->as_start = lcbio_timer_new(iot, mon, async_start);
|
|
79
|
-
return mon;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
void lcb_confmon_prepare(lcb_confmon *mon)
|
|
83
|
-
{
|
|
84
|
-
int ii;
|
|
85
|
-
|
|
86
|
-
memset(&mon->active_providers, 0, sizeof(mon->active_providers));
|
|
87
|
-
lcb_clist_init(&mon->active_providers);
|
|
88
|
-
|
|
89
|
-
lcb_log(LOGARGS(mon, DEBUG), "Preparing providers (this may be called multiple times)");
|
|
90
|
-
|
|
91
|
-
for (ii = 0; ii < LCB_CLCONFIG_MAX; ii++) {
|
|
92
|
-
clconfig_provider *cur = mon->all_providers[ii];
|
|
93
|
-
if (cur) {
|
|
94
|
-
if (cur->enabled) {
|
|
95
|
-
lcb_clist_append(&mon->active_providers, &cur->ll);
|
|
96
|
-
lcb_log(LOGARGS(mon, DEBUG), "Provider %s is ENABLED", provider_string(cur->type));
|
|
97
|
-
} else if (cur->pause){
|
|
98
|
-
cur->pause(cur);
|
|
99
|
-
lcb_log(LOGARGS(mon, DEBUG), "Provider %s is DISABLED", provider_string(cur->type));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
lcb_assert(LCB_CLIST_SIZE(&mon->active_providers));
|
|
105
|
-
mon->cur_provider = first_active(mon);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
void lcb_confmon_destroy(lcb_confmon *mon)
|
|
109
|
-
{
|
|
110
|
-
unsigned int ii;
|
|
111
|
-
|
|
112
|
-
if (mon->as_start) {
|
|
113
|
-
lcbio_timer_destroy(mon->as_start);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (mon->as_stop) {
|
|
117
|
-
lcbio_timer_destroy(mon->as_stop);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
mon->as_start = NULL;
|
|
121
|
-
mon->as_stop = NULL;
|
|
122
|
-
|
|
123
|
-
if (mon->config) {
|
|
124
|
-
lcb_clconfig_decref(mon->config);
|
|
125
|
-
mon->config = NULL;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
for (ii = 0; ii < LCB_CLCONFIG_MAX; ii++) {
|
|
129
|
-
clconfig_provider *provider = mon->all_providers[ii];
|
|
130
|
-
if (provider == NULL) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
provider->shutdown(provider);
|
|
135
|
-
mon->all_providers[ii] = NULL;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
lcbio_table_unref(mon->iot);
|
|
139
|
-
lcb_settings_unref(mon->settings);
|
|
140
|
-
|
|
141
|
-
free(mon);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
static int do_set_next(lcb_confmon *mon, clconfig_info *info, int notify_miss)
|
|
145
|
-
{
|
|
146
|
-
unsigned ii;
|
|
147
|
-
|
|
148
|
-
if (mon->config) {
|
|
149
|
-
lcbvb_CHANGETYPE chstatus = LCBVB_NO_CHANGES;
|
|
150
|
-
lcbvb_CONFIGDIFF *diff = lcbvb_compare(mon->config->vbc, info->vbc);
|
|
151
|
-
|
|
152
|
-
if (!diff) {
|
|
153
|
-
lcb_log(LOGARGS(mon, DEBUG), "Couldn't create vbucket diff");
|
|
154
|
-
return 0;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
chstatus = lcbvb_get_changetype(diff);
|
|
158
|
-
lcbvb_free_diff(diff);
|
|
159
|
-
|
|
160
|
-
if (chstatus == 0 || lcb_clconfig_compare(mon->config, info) >= 0) {
|
|
161
|
-
const lcbvb_CONFIG *ca, *cb;
|
|
162
|
-
|
|
163
|
-
ca = mon->config->vbc;
|
|
164
|
-
cb = info->vbc;
|
|
165
|
-
|
|
166
|
-
lcb_log(LOGARGS(mon, INFO), "Not applying configuration received via %s. No changes detected. A.rev=%d, B.rev=%d", provider_string(info->origin), ca->revid, cb->revid);
|
|
167
|
-
if (notify_miss) {
|
|
168
|
-
invoke_listeners(mon, CLCONFIG_EVENT_GOT_ANY_CONFIG, info);
|
|
169
|
-
}
|
|
170
|
-
return 0;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
lcb_log(LOGARGS(mon, INFO), "Setting new configuration. Received via %s", provider_string(info->origin));
|
|
175
|
-
|
|
176
|
-
if (mon->config) {
|
|
177
|
-
/** DECREF the old one */
|
|
178
|
-
lcb_clconfig_decref(mon->config);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
for (ii = 0; ii < LCB_CLCONFIG_MAX; ii++) {
|
|
182
|
-
clconfig_provider *cur = mon->all_providers[ii];
|
|
183
|
-
if (cur && cur->enabled && cur->config_updated) {
|
|
184
|
-
cur->config_updated(cur, info->vbc);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
lcb_clconfig_incref(info);
|
|
189
|
-
mon->config = info;
|
|
190
|
-
lcb_confmon_stop(mon);
|
|
191
|
-
|
|
192
|
-
invoke_listeners(mon, CLCONFIG_EVENT_GOT_NEW_CONFIG, info);
|
|
193
|
-
|
|
194
|
-
return 1;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
void lcb_confmon_provider_failed(clconfig_provider *provider,
|
|
198
|
-
lcb_error_t reason)
|
|
199
|
-
{
|
|
200
|
-
lcb_confmon *mon = provider->parent;
|
|
201
|
-
|
|
202
|
-
lcb_log(LOGARGS(mon, INFO), "Provider '%s' failed", provider_string(provider->type));
|
|
203
|
-
|
|
204
|
-
if (provider != mon->cur_provider) {
|
|
205
|
-
lcb_log(LOGARGS(mon, TRACE), "Ignoring failure. Current=%p (%s)", (void*)mon->cur_provider, provider_string(mon->cur_provider->type));
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
if (!lcb_confmon_is_refreshing(mon)) {
|
|
209
|
-
lcb_log(LOGARGS(mon, DEBUG), "Ignoring failure. Refresh not active");
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (reason != LCB_SUCCESS) {
|
|
213
|
-
if (mon->settings->detailed_neterr && mon->last_error != LCB_SUCCESS) {
|
|
214
|
-
/* Filter out any artificial 'connect error' or 'network error' codes */
|
|
215
|
-
if (reason != LCB_CONNECT_ERROR && reason != LCB_NETWORK_ERROR) {
|
|
216
|
-
mon->last_error = reason;
|
|
217
|
-
}
|
|
218
|
-
} else {
|
|
219
|
-
mon->last_error = reason;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
mon->cur_provider = next_active(mon, mon->cur_provider);
|
|
224
|
-
|
|
225
|
-
if (!mon->cur_provider) {
|
|
226
|
-
LOG(mon, TRACE, "Maximum provider reached. Resetting index");
|
|
227
|
-
invoke_listeners(mon, CLCONFIG_EVENT_PROVIDERS_CYCLED, NULL);
|
|
228
|
-
mon->cur_provider = first_active(mon);
|
|
229
|
-
lcb_confmon_stop(mon);
|
|
230
|
-
} else {
|
|
231
|
-
uint32_t interval = 0;
|
|
232
|
-
if (mon->config) {
|
|
233
|
-
/* Not first */
|
|
234
|
-
interval = PROVIDER_SETTING(provider, grace_next_provider);
|
|
235
|
-
}
|
|
236
|
-
lcb_log(LOGARGS(mon, DEBUG), "Will try next provider in %uus", interval);
|
|
237
|
-
mon->state |= CONFMON_S_ITERGRACE;
|
|
238
|
-
lcbio_timer_rearm(mon->as_start, interval);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
void lcb_confmon_provider_success(clconfig_provider *provider,
|
|
243
|
-
clconfig_info *config)
|
|
244
|
-
{
|
|
245
|
-
do_set_next(provider->parent, config, 1);
|
|
246
|
-
lcb_confmon_stop(provider->parent);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
static int do_next_provider(lcb_confmon *mon)
|
|
251
|
-
{
|
|
252
|
-
lcb_list_t *ii;
|
|
253
|
-
mon->state &= ~CONFMON_S_ITERGRACE;
|
|
254
|
-
|
|
255
|
-
LCB_LIST_FOR(ii, (lcb_list_t *)&mon->active_providers) {
|
|
256
|
-
clconfig_info *info;
|
|
257
|
-
clconfig_provider *cached_provider;
|
|
258
|
-
|
|
259
|
-
cached_provider = LCB_LIST_ITEM(ii, clconfig_provider, ll);
|
|
260
|
-
info = cached_provider->get_cached(cached_provider);
|
|
261
|
-
if (!info) {
|
|
262
|
-
continue;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (do_set_next(mon, info, 0)) {
|
|
266
|
-
LOG(mon, DEBUG, "Using cached configuration");
|
|
267
|
-
return 1;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
lcb_log(LOGARGS(mon, TRACE), "Current provider is %s", provider_string(mon->cur_provider->type));
|
|
272
|
-
|
|
273
|
-
mon->cur_provider->refresh(mon->cur_provider);
|
|
274
|
-
return 0;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
static void async_start(void *arg)
|
|
278
|
-
{
|
|
279
|
-
do_next_provider(arg);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
lcb_error_t lcb_confmon_start(lcb_confmon *mon)
|
|
283
|
-
{
|
|
284
|
-
lcb_U32 tmonext = 0;
|
|
285
|
-
|
|
286
|
-
lcbio_async_cancel(mon->as_stop);
|
|
287
|
-
if (IS_REFRESHING(mon)) {
|
|
288
|
-
LOG(mon, DEBUG, "Refresh already in progress...");
|
|
289
|
-
return LCB_SUCCESS;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
LOG(mon, TRACE, "Start refresh requested");
|
|
293
|
-
lcb_assert(mon->cur_provider);
|
|
294
|
-
mon->state = CONFMON_S_ACTIVE|CONFMON_S_ITERGRACE;
|
|
295
|
-
|
|
296
|
-
if (mon->last_stop_us > 0) {
|
|
297
|
-
lcb_U32 diff = LCB_NS2US(gethrtime()) - mon->last_stop_us;
|
|
298
|
-
if (diff <= mon->settings->grace_next_cycle) {
|
|
299
|
-
tmonext = mon->settings->grace_next_cycle - diff;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
lcbio_timer_rearm(mon->as_start, tmonext);
|
|
304
|
-
return LCB_SUCCESS;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
static void async_stop(void *arg)
|
|
308
|
-
{
|
|
309
|
-
lcb_confmon *mon = arg;
|
|
310
|
-
lcb_list_t *ii;
|
|
311
|
-
|
|
312
|
-
LCB_LIST_FOR(ii, (lcb_list_t *)&mon->active_providers) {
|
|
313
|
-
clconfig_provider *provider = LCB_LIST_ITEM(ii, clconfig_provider, ll);
|
|
314
|
-
if (!provider->pause) {
|
|
315
|
-
continue;
|
|
316
|
-
}
|
|
317
|
-
provider->pause(provider);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
mon->last_stop_us = LCB_NS2US(gethrtime());
|
|
321
|
-
invoke_listeners(mon, CLCONFIG_EVENT_MONITOR_STOPPED, NULL);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
lcb_error_t lcb_confmon_stop(lcb_confmon *mon)
|
|
325
|
-
{
|
|
326
|
-
if (!IS_REFRESHING(mon)) {
|
|
327
|
-
return LCB_SUCCESS;
|
|
328
|
-
}
|
|
329
|
-
lcbio_timer_disarm(mon->as_start);
|
|
330
|
-
lcbio_async_signal(mon->as_stop);
|
|
331
|
-
mon->state = CONFMON_S_INACTIVE;
|
|
332
|
-
return LCB_SUCCESS;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
void lcb_clconfig_decref(clconfig_info *info)
|
|
336
|
-
{
|
|
337
|
-
lcb_assert(info->refcount);
|
|
338
|
-
|
|
339
|
-
if (--info->refcount) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (info->vbc) {
|
|
344
|
-
lcbvb_destroy(info->vbc);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
free(info);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
int lcb_clconfig_compare(const clconfig_info *a, const clconfig_info *b)
|
|
351
|
-
{
|
|
352
|
-
/** First check if both have revisions */
|
|
353
|
-
int rev_a, rev_b;
|
|
354
|
-
rev_a = lcbvb_get_revision(a->vbc);
|
|
355
|
-
rev_b = lcbvb_get_revision(b->vbc);
|
|
356
|
-
if (rev_a >= 0 && rev_b >= 0) {
|
|
357
|
-
return rev_a - rev_b;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
if (a->cmpclock == b->cmpclock) {
|
|
361
|
-
return 0;
|
|
362
|
-
|
|
363
|
-
} else if (a->cmpclock < b->cmpclock) {
|
|
364
|
-
return -1;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
return 1;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
clconfig_info *
|
|
371
|
-
lcb_clconfig_create(lcbvb_CONFIG* config, clconfig_method_t origin)
|
|
372
|
-
{
|
|
373
|
-
clconfig_info *info = calloc(1, sizeof(*info));
|
|
374
|
-
if (!info) {
|
|
375
|
-
return NULL;
|
|
376
|
-
}
|
|
377
|
-
info->refcount = 1;
|
|
378
|
-
info->vbc = config;
|
|
379
|
-
info->origin = origin;
|
|
380
|
-
return info;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
void lcb_confmon_add_listener(lcb_confmon *mon, clconfig_listener *listener)
|
|
384
|
-
{
|
|
385
|
-
listener->parent = mon;
|
|
386
|
-
lcb_list_append(&mon->listeners, &listener->ll);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
void lcb_confmon_remove_listener(lcb_confmon *mon, clconfig_listener *listener)
|
|
390
|
-
{
|
|
391
|
-
lcb_list_delete(&listener->ll);
|
|
392
|
-
(void)mon;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
static void invoke_listeners(lcb_confmon *mon,
|
|
396
|
-
clconfig_event_t event,
|
|
397
|
-
clconfig_info *info)
|
|
398
|
-
{
|
|
399
|
-
lcb_list_t *ll, *ll_next;
|
|
400
|
-
LCB_LIST_SAFE_FOR(ll, ll_next, &mon->listeners) {
|
|
401
|
-
clconfig_listener *lsn = LCB_LIST_ITEM(ll, clconfig_listener, ll);
|
|
402
|
-
lsn->callback(lsn, event, info);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
static void generic_shutdown(clconfig_provider *provider)
|
|
407
|
-
{
|
|
408
|
-
free(provider);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
clconfig_provider * lcb_clconfig_create_user(lcb_confmon *mon)
|
|
412
|
-
{
|
|
413
|
-
clconfig_provider *provider = calloc(1, sizeof(*provider));
|
|
414
|
-
provider->type = LCB_CLCONFIG_USER;
|
|
415
|
-
provider->shutdown = generic_shutdown;
|
|
416
|
-
|
|
417
|
-
(void)mon;
|
|
418
|
-
return provider;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
LCB_INTERNAL_API
|
|
422
|
-
int lcb_confmon_is_refreshing(lcb_confmon *mon)
|
|
423
|
-
{
|
|
424
|
-
return IS_REFRESHING(mon);
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
LCB_INTERNAL_API
|
|
428
|
-
void
|
|
429
|
-
lcb_confmon_set_provider_active(lcb_confmon *mon,
|
|
430
|
-
clconfig_method_t type, int enabled)
|
|
431
|
-
{
|
|
432
|
-
clconfig_provider *provider = mon->all_providers[type];
|
|
433
|
-
if (provider->enabled == enabled) {
|
|
434
|
-
return;
|
|
435
|
-
} else {
|
|
436
|
-
provider->enabled = enabled;
|
|
437
|
-
}
|
|
438
|
-
lcb_confmon_prepare(mon);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
void
|
|
442
|
-
lcb_confmon_dump(lcb_confmon *mon, FILE *fp)
|
|
443
|
-
{
|
|
444
|
-
unsigned ii;
|
|
445
|
-
fprintf(fp, "CONFMON=%p\n", (void*)mon);
|
|
446
|
-
fprintf(fp, "STATE= (0x%x)", mon->state);
|
|
447
|
-
if (mon->state & CONFMON_S_ACTIVE) {
|
|
448
|
-
fprintf(fp, "ACTIVE|");
|
|
449
|
-
}
|
|
450
|
-
if (mon->state == CONFMON_S_INACTIVE) {
|
|
451
|
-
fprintf(fp, "INACTIVE/IDLE");
|
|
452
|
-
}
|
|
453
|
-
if (mon->state & CONFMON_S_ITERGRACE) {
|
|
454
|
-
fprintf(fp, "ITERGRACE");
|
|
455
|
-
}
|
|
456
|
-
fprintf(fp, "\n");
|
|
457
|
-
fprintf(fp, "LAST ERROR: 0x%x\n", mon->last_error);
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
for (ii = 0; ii < LCB_CLCONFIG_MAX; ii++) {
|
|
461
|
-
clconfig_provider *cur = mon->all_providers[ii];
|
|
462
|
-
if (!cur) {
|
|
463
|
-
continue;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
fprintf(fp, "** PROVIDER: 0x%x (%s) %p\n", cur->type, provider_string(cur->type), (void*)cur);
|
|
467
|
-
fprintf(fp, "** ENABLED: %s\n", cur->enabled ? "YES" : "NO");
|
|
468
|
-
fprintf(fp, "** CURRENT: %s\n", cur == mon->cur_provider ? "YES" : "NO");
|
|
469
|
-
if (cur->dump) {
|
|
470
|
-
cur->dump(cur, fp);
|
|
471
|
-
}
|
|
472
|
-
fprintf(fp, "\n");
|
|
473
|
-
}
|
|
474
|
-
}
|