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.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/CMakeLists.txt +6 -8
  3. data/ext/libcouchbase/README.markdown +2 -2
  4. data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
  5. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  6. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
  7. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
  8. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  9. data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
  10. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  11. data/ext/libcouchbase/cmake/source_files.cmake +21 -5
  12. data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
  13. data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
  14. data/ext/libcouchbase/example/users/README +48 -0
  15. data/ext/libcouchbase/example/users/users.c +147 -0
  16. data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
  17. data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
  18. data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
  19. data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
  20. data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
  21. data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
  22. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
  23. data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
  24. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  25. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  26. data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
  27. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  28. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  29. data/ext/libcouchbase/src/README.md +0 -2
  30. data/ext/libcouchbase/src/auth-priv.h +23 -4
  31. data/ext/libcouchbase/src/auth.cc +51 -43
  32. data/ext/libcouchbase/src/bootstrap.cc +244 -0
  33. data/ext/libcouchbase/src/bootstrap.h +58 -38
  34. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
  35. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  36. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
  37. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  38. data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
  39. data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
  40. data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
  41. data/ext/libcouchbase/src/cbft.cc +22 -27
  42. data/ext/libcouchbase/src/cntl.cc +56 -22
  43. data/ext/libcouchbase/src/connspec.cc +47 -6
  44. data/ext/libcouchbase/src/connspec.h +27 -0
  45. data/ext/libcouchbase/src/dns-srv.cc +147 -0
  46. data/ext/libcouchbase/src/dump.cc +3 -3
  47. data/ext/libcouchbase/src/errmap.cc +173 -0
  48. data/ext/libcouchbase/src/errmap.h +198 -0
  49. data/ext/libcouchbase/src/getconfig.cc +7 -33
  50. data/ext/libcouchbase/src/handler.cc +118 -7
  51. data/ext/libcouchbase/src/hostlist.cc +0 -36
  52. data/ext/libcouchbase/src/hostlist.h +44 -62
  53. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  54. data/ext/libcouchbase/src/http/http.cc +27 -35
  55. data/ext/libcouchbase/src/http/http.h +1 -34
  56. data/ext/libcouchbase/src/http/http_io.cc +28 -36
  57. data/ext/libcouchbase/src/instance.cc +131 -34
  58. data/ext/libcouchbase/src/internal.h +58 -26
  59. data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
  60. data/ext/libcouchbase/src/jsparse/parser.h +84 -98
  61. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  62. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  63. data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
  64. data/ext/libcouchbase/src/lcbio/connect.h +16 -7
  65. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  66. data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
  67. data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
  68. data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
  69. data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
  70. data/ext/libcouchbase/src/lcbio/manager.h +133 -96
  71. data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
  72. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  73. data/ext/libcouchbase/src/mc/mcreq.c +11 -2
  74. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  75. data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
  76. data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
  77. data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
  78. data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
  79. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  80. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  81. data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
  82. data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
  83. data/ext/libcouchbase/src/newconfig.cc +6 -6
  84. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  85. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  86. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  87. data/ext/libcouchbase/src/operations/durability.cc +6 -26
  88. data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
  89. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  90. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
  91. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  92. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  93. data/ext/libcouchbase/src/operations/stats.cc +3 -8
  94. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  95. data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
  96. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  97. data/ext/libcouchbase/src/packetutils.h +30 -2
  98. data/ext/libcouchbase/src/probes.d +1 -1
  99. data/ext/libcouchbase/src/rdb/rope.c +1 -1
  100. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
  101. data/ext/libcouchbase/src/retryq.cc +52 -14
  102. data/ext/libcouchbase/src/retryq.h +3 -3
  103. data/ext/libcouchbase/src/settings.c +5 -0
  104. data/ext/libcouchbase/src/settings.h +11 -0
  105. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  106. data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
  107. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  108. data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
  109. data/ext/libcouchbase/src/trace.h +4 -4
  110. data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
  111. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  112. data/ext/libcouchbase/src/views/docreq.h +24 -30
  113. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  114. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  115. data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
  116. data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
  117. data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
  118. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
  119. data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
  120. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
  121. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  122. data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
  123. data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
  124. data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
  125. data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
  126. data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
  127. data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
  128. data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
  129. data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
  130. data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
  131. data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
  132. data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
  133. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
  134. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
  135. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  136. data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
  137. data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
  138. data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
  139. data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
  140. data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
  141. data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
  142. data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
  143. data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
  144. data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
  145. data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
  146. data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
  147. data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
  148. data/ext/libcouchbase/tools/cbc.cc +143 -10
  149. data/ext/libcouchbase/tools/docgen/loc.h +1 -1
  150. data/lib/libcouchbase/connection.rb +4 -3
  151. data/lib/libcouchbase/version.rb +1 -1
  152. metadata +37 -28
  153. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  154. data/ext/libcouchbase/src/bootstrap.c +0 -269
  155. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  156. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  157. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  158. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  159. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  160. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  161. data/ext/libcouchbase/src/lcbio/manager.c +0 -584
  162. data/ext/libcouchbase/src/packetutils.c +0 -37
  163. data/ext/libcouchbase/src/simplestring.c +0 -211
  164. data/ext/libcouchbase/src/simplestring.h +0 -228
  165. data/ext/libcouchbase/src/ssobuf.h +0 -82
  166. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  167. 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
- }