libcouchbase 0.0.7 → 0.0.8

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/.gitignore +2 -0
  3. data/ext/libcouchbase/CMakeLists.txt +5 -7
  4. data/ext/libcouchbase/README.markdown +2 -2
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  7. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  10. data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
  11. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  12. data/ext/libcouchbase/cmake/source_files.cmake +34 -14
  13. data/ext/libcouchbase/configure.pl +1 -1
  14. data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
  15. data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
  16. data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
  17. data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
  18. data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
  19. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  20. data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
  21. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  22. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  23. data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  26. data/ext/libcouchbase/src/README.md +0 -2
  27. data/ext/libcouchbase/src/auth-priv.h +1 -0
  28. data/ext/libcouchbase/src/auth.cc +10 -0
  29. data/ext/libcouchbase/src/bootstrap.cc +216 -0
  30. data/ext/libcouchbase/src/bootstrap.h +50 -39
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
  37. data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
  38. data/ext/libcouchbase/src/cbft.cc +22 -27
  39. data/ext/libcouchbase/src/cntl.cc +24 -24
  40. data/ext/libcouchbase/src/connspec.cc +30 -1
  41. data/ext/libcouchbase/src/connspec.h +17 -0
  42. data/ext/libcouchbase/src/dns-srv.cc +143 -0
  43. data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
  44. data/ext/libcouchbase/src/getconfig.cc +73 -0
  45. data/ext/libcouchbase/src/handler.cc +84 -85
  46. data/ext/libcouchbase/src/hostlist.cc +0 -1
  47. data/ext/libcouchbase/src/hostlist.h +6 -1
  48. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  49. data/ext/libcouchbase/src/http/http.cc +9 -29
  50. data/ext/libcouchbase/src/http/http.h +1 -34
  51. data/ext/libcouchbase/src/http/http_io.cc +22 -26
  52. data/ext/libcouchbase/src/instance.cc +102 -28
  53. data/ext/libcouchbase/src/internal.h +47 -29
  54. data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
  55. data/ext/libcouchbase/src/jsparse/parser.h +91 -98
  56. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  57. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  58. data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
  59. data/ext/libcouchbase/src/lcbio/connect.h +9 -2
  60. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  61. data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
  62. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  63. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  64. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  65. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  66. data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
  67. data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
  68. data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
  69. data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
  70. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  71. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  72. data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
  73. data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
  74. data/ext/libcouchbase/src/nodeinfo.cc +4 -8
  75. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  76. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  77. data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
  78. data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
  79. data/ext/libcouchbase/src/operations/durability.cc +643 -0
  80. data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
  81. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  82. data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
  83. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
  84. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  85. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  86. data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
  87. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  88. data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
  89. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  90. data/ext/libcouchbase/src/packetutils.h +200 -137
  91. data/ext/libcouchbase/src/probes.d +1 -1
  92. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
  93. data/ext/libcouchbase/src/retryq.cc +394 -0
  94. data/ext/libcouchbase/src/retryq.h +116 -104
  95. data/ext/libcouchbase/src/settings.h +2 -1
  96. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  97. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  98. data/ext/libcouchbase/src/trace.h +8 -8
  99. data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
  100. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  101. data/ext/libcouchbase/src/views/docreq.h +24 -30
  102. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  103. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  104. data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
  105. data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
  106. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
  107. data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
  108. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  109. data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
  110. data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
  111. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  112. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  113. data/lib/libcouchbase/version.rb +1 -1
  114. metadata +36 -39
  115. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  116. data/ext/libcouchbase/src/bootstrap.c +0 -269
  117. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
  118. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  119. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  120. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  121. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  122. data/ext/libcouchbase/src/getconfig.c +0 -100
  123. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  124. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  125. data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
  126. data/ext/libcouchbase/src/operations/durability.c +0 -668
  127. data/ext/libcouchbase/src/packetutils.c +0 -60
  128. data/ext/libcouchbase/src/retryq.c +0 -424
  129. data/ext/libcouchbase/src/simplestring.c +0 -211
  130. data/ext/libcouchbase/src/simplestring.h +0 -228
  131. data/ext/libcouchbase/src/ssobuf.h +0 -82
  132. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  133. 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
- }