Skip to content

Commit 640e6db

Browse files
authored
Merge pull request #4100 from nrwahl2/nrwahl2-based_first
More libcib and based cleanups: cib__{get,set}_calldata, cib__perform_op_{ro,rw}, etc.
2 parents 8f17224 + 87081e1 commit 640e6db

16 files changed

Lines changed: 589 additions & 651 deletions

daemons/based/based_callbacks.c

Lines changed: 188 additions & 257 deletions
Large diffs are not rendered by default.

daemons/based/based_ipc.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,15 +280,6 @@ based_ipc_destroy(qb_ipcs_connection_t *c)
280280
{
281281
pcmk__trace("Destroying client connection %p", c);
282282
based_ipc_closed(c);
283-
284-
/* Shut down if this was the last client to leave.
285-
*
286-
* @TODO Is it correct to do this for destroy but not for closed? Other
287-
* daemons handle closed and destroyed connections in the same way.
288-
*/
289-
if (cib_shutdown_flag) {
290-
based_shutdown(0);
291-
}
292283
}
293284

294285
struct qb_ipcs_service_handlers ipc_ro_callbacks = {

daemons/based/based_messages.c

Lines changed: 85 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ xmlNode *the_cib = NULL;
3838
* \brief Process a \c PCMK__CIB_REQUEST_ABS_DELETE
3939
*
4040
* \param[in] req Ignored
41-
* \param[in] input Ignored
4241
* \param[in] cib Ignored
4342
* \param[in] answer Ignored
4443
*
@@ -47,8 +46,7 @@ xmlNode *the_cib = NULL;
4746
* \note This is unimplemented and simply returns an error.
4847
*/
4948
int
50-
based_process_abs_delete(xmlNode *req, xmlNode *input, xmlNode **cib,
51-
xmlNode **answer)
49+
based_process_abs_delete(xmlNode *req, xmlNode **cib, xmlNode **answer)
5250
{
5351
/* @COMPAT Remove when PCMK__CIB_REQUEST_ABS_DELETE is removed. Note that
5452
* external clients with Pacemaker versions < 3.0.0 can send it.
@@ -57,14 +55,14 @@ based_process_abs_delete(xmlNode *req, xmlNode *input, xmlNode **cib,
5755
}
5856

5957
int
60-
based_process_commit_transact(xmlNode *req, xmlNode *input, xmlNode **cib,
61-
xmlNode **answer)
58+
based_process_commit_transact(xmlNode *req, xmlNode **cib, xmlNode **answer)
6259
{
6360
/* On success, our caller will activate *cib locally, trigger a replace
6461
* notification if appropriate, and sync *cib to all nodes. On failure, our
6562
* caller will free *cib.
6663
*/
6764
int rc = pcmk_rc_ok;
65+
xmlNode *input = cib__get_calldata(req);
6866
const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID);
6967
const char *origin = pcmk__xe_get(req, PCMK__XA_SRC);
7068
pcmk__client_t *client = pcmk__find_client_by_id(client_id);
@@ -82,25 +80,21 @@ based_process_commit_transact(xmlNode *req, xmlNode *input, xmlNode **cib,
8280
}
8381

8482
int
85-
based_process_is_primary(xmlNode *req, xmlNode *input, xmlNode **cib,
86-
xmlNode **answer)
83+
based_process_is_primary(xmlNode *req, xmlNode **cib, xmlNode **answer)
8784
{
8885
// @COMPAT Pacemaker Remote clients <3.0.0 may send this
8986
return (based_is_primary? pcmk_rc_ok : EPERM);
9087
}
9188

9289
// @COMPAT: Remove when PCMK__CIB_REQUEST_NOOP is removed
9390
int
94-
based_process_noop(xmlNode *req, xmlNode *input, xmlNode **cib,
95-
xmlNode **answer)
91+
based_process_noop(xmlNode *req, xmlNode **cib, xmlNode **answer)
9692
{
97-
*answer = NULL;
9893
return pcmk_rc_ok;
9994
}
10095

10196
int
102-
based_process_ping(xmlNode *req, xmlNode *input, xmlNode **cib,
103-
xmlNode **answer)
97+
based_process_ping(xmlNode *req, xmlNode **cib, xmlNode **answer)
10498
{
10599
/* existing_cib and *cib should be identical. In the absence of ACL
106100
* filtering, they should also match the_cib. However, they may be copies
@@ -112,24 +106,19 @@ based_process_ping(xmlNode *req, xmlNode *input, xmlNode **cib,
112106
const char *host = pcmk__xe_get(req, PCMK__XA_SRC);
113107
const char *seq = pcmk__xe_get(req, PCMK__XA_CIB_PING_ID);
114108
char *digest = pcmk__digest_xml(the_cib, true);
115-
116-
xmlNode *wrapper = NULL;
109+
xmlNode *shallow = NULL;
117110

118111
*answer = pcmk__xe_create(NULL, PCMK__XE_PING_RESPONSE);
119112

120113
pcmk__xe_set(*answer, PCMK_XA_CRM_FEATURE_SET, CRM_FEATURE_SET);
121114
pcmk__xe_set(*answer, PCMK_XA_DIGEST, digest);
122115
pcmk__xe_set(*answer, PCMK__XA_CIB_PING_ID, seq);
123116

124-
wrapper = pcmk__xe_create(*answer, PCMK__XE_CIB_CALLDATA);
125-
126-
if (*cib != NULL) {
127-
// Use *cib so that ACL filtering is applied to the answer
128-
xmlNode *shallow = pcmk__xe_create(wrapper,
129-
(const char *) (*cib)->name);
130-
131-
pcmk__xe_copy_attrs(shallow, *cib, pcmk__xaf_none);
132-
}
117+
// Use *cib so that ACL filtering is applied to the answer
118+
shallow = pcmk__xe_create(NULL, (const char *) (*cib)->name);
119+
pcmk__xe_copy_attrs(shallow, *cib, pcmk__xaf_none);
120+
cib__set_calldata(*answer, shallow);
121+
pcmk__xml_free(shallow);
133122

134123
pcmk__info("Reporting our current digest to %s: %s for %s.%s.%s",
135124
host, digest,
@@ -143,8 +132,7 @@ based_process_ping(xmlNode *req, xmlNode *input, xmlNode **cib,
143132
}
144133

145134
int
146-
based_process_primary(xmlNode *req, xmlNode *input, xmlNode **cib,
147-
xmlNode **answer)
135+
based_process_primary(xmlNode *req, xmlNode **cib, xmlNode **answer)
148136
{
149137
if (!based_is_primary) {
150138
pcmk__info("We are now in R/W mode");
@@ -158,10 +146,8 @@ based_process_primary(xmlNode *req, xmlNode *input, xmlNode **cib,
158146
}
159147

160148
int
161-
based_process_schemas(xmlNode *req, xmlNode *input, xmlNode **cib,
162-
xmlNode **answer)
149+
based_process_schemas(xmlNode *req, xmlNode **cib, xmlNode **answer)
163150
{
164-
xmlNode *wrapper = NULL;
165151
xmlNode *data = NULL;
166152

167153
const char *after_ver = NULL;
@@ -170,8 +156,7 @@ based_process_schemas(xmlNode *req, xmlNode *input, xmlNode **cib,
170156

171157
*answer = pcmk__xe_create(NULL, PCMK__XA_SCHEMAS);
172158

173-
wrapper = pcmk__xe_first_child(req, PCMK__XE_CIB_CALLDATA, NULL, NULL);
174-
data = pcmk__xe_first_child(wrapper, NULL, NULL, NULL);
159+
data = cib__get_calldata(req);
175160
if (data == NULL) {
176161
pcmk__warn("No data specified in request");
177162
return EPROTO;
@@ -203,8 +188,7 @@ based_process_schemas(xmlNode *req, xmlNode *input, xmlNode **cib,
203188
}
204189

205190
int
206-
based_process_secondary(xmlNode *req, xmlNode *input, xmlNode **cib,
207-
xmlNode **answer)
191+
based_process_secondary(xmlNode *req, xmlNode **cib, xmlNode **answer)
208192
{
209193
if (based_is_primary) {
210194
pcmk__info("We are now in R/O mode");
@@ -218,13 +202,10 @@ based_process_secondary(xmlNode *req, xmlNode *input, xmlNode **cib,
218202
}
219203

220204
int
221-
based_process_shutdown(xmlNode *req, xmlNode *input, xmlNode **cib,
222-
xmlNode **answer)
205+
based_process_shutdown(xmlNode *req, xmlNode **cib, xmlNode **answer)
223206
{
224207
const char *host = pcmk__xe_get(req, PCMK__XA_SRC);
225208

226-
*answer = NULL;
227-
228209
if (pcmk__xe_get(req, PCMK__XA_CIB_ISREPLYTO) == NULL) {
229210
pcmk__info("Peer %s is requesting to shut down", host);
230211
return pcmk_rc_ok;
@@ -241,106 +222,102 @@ based_process_shutdown(xmlNode *req, xmlNode *input, xmlNode **cib,
241222
}
242223

243224
int
244-
based_process_sync(xmlNode *req, xmlNode *input, xmlNode **cib,
245-
xmlNode **answer)
225+
based_process_sync(xmlNode *req, xmlNode **cib, xmlNode **answer)
246226
{
247227
return sync_our_cib(req, true);
248228
}
249229

250230
int
251-
based_process_upgrade(xmlNode *req, xmlNode *input, xmlNode **cib,
252-
xmlNode **answer)
231+
based_process_upgrade(xmlNode *req, xmlNode **cib, xmlNode **answer)
253232
{
254233
int rc = pcmk_rc_ok;
255234

256-
*answer = NULL;
235+
xmlNode *scratch = NULL;
236+
const char *host = pcmk__xe_get(req, PCMK__XA_SRC);
237+
const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID);
238+
const char *call_opts = pcmk__xe_get(req, PCMK__XA_CIB_CALLOPT);
239+
const char *call_id = pcmk__xe_get(req, PCMK__XA_CIB_CALLID);
240+
const char *original_schema = NULL;
241+
const char *new_schema = NULL;
242+
pcmk__node_status_t *origin = NULL;
257243

258244
if (pcmk__xe_get(req, PCMK__XA_CIB_SCHEMA_MAX) != NULL) {
259245
/* The originator of an upgrade request sends it to the DC, without
260246
* PCMK__XA_CIB_SCHEMA_MAX. If an upgrade is needed, the DC
261247
* re-broadcasts the request with PCMK__XA_CIB_SCHEMA_MAX, and each node
262248
* performs the upgrade (and notifies its local clients) here.
263249
*/
264-
return cib__process_upgrade(req, input, cib, answer);
250+
return cib__process_upgrade(req, cib, answer);
251+
}
265252

266-
} else {
267-
xmlNode *scratch = pcmk__xml_copy(NULL, *cib);
268-
const char *host = pcmk__xe_get(req, PCMK__XA_SRC);
269-
const char *original_schema = NULL;
270-
const char *new_schema = NULL;
271-
const char *client_id = pcmk__xe_get(req, PCMK__XA_CIB_CLIENTID);
272-
const char *call_opts = pcmk__xe_get(req, PCMK__XA_CIB_CALLOPT);
273-
const char *call_id = pcmk__xe_get(req, PCMK__XA_CIB_CALLID);
274-
275-
original_schema = pcmk__xe_get(*cib, PCMK_XA_VALIDATE_WITH);
276-
if (original_schema == NULL) {
277-
pcmk__info("Rejecting upgrade request from %s: No "
278-
PCMK_XA_VALIDATE_WITH,
279-
host);
280-
return pcmk_rc_cib_corrupt;
281-
}
253+
scratch = pcmk__xml_copy(NULL, *cib);
282254

283-
rc = pcmk__update_schema(&scratch, NULL, true, true);
284-
new_schema = pcmk__xe_get(scratch, PCMK_XA_VALIDATE_WITH);
255+
original_schema = pcmk__xe_get(*cib, PCMK_XA_VALIDATE_WITH);
256+
if (original_schema == NULL) {
257+
pcmk__info("Rejecting upgrade request from %s: No "
258+
PCMK_XA_VALIDATE_WITH, host);
259+
return pcmk_rc_cib_corrupt;
260+
}
285261

286-
if (pcmk__cmp_schemas_by_name(new_schema, original_schema) > 0) {
287-
xmlNode *up = pcmk__xe_create(NULL, __func__);
262+
rc = pcmk__update_schema(&scratch, NULL, true, true);
263+
new_schema = pcmk__xe_get(scratch, PCMK_XA_VALIDATE_WITH);
288264

289-
rc = pcmk_rc_ok;
290-
pcmk__notice("Upgrade request from %s verified", host);
265+
if (pcmk__cmp_schemas_by_name(new_schema, original_schema) > 0) {
266+
xmlNode *up = pcmk__xe_create(NULL, __func__);
291267

292-
pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB);
293-
pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE);
294-
pcmk__xe_set(up, PCMK__XA_CIB_SCHEMA_MAX, new_schema);
295-
pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host);
296-
pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id);
297-
pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts);
298-
pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id);
268+
rc = pcmk_rc_ok;
269+
pcmk__notice("Upgrade request from %s verified", host);
299270

300-
pcmk__cluster_send_message(NULL, pcmk_ipc_based, up);
271+
pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB);
272+
pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE);
273+
pcmk__xe_set(up, PCMK__XA_CIB_SCHEMA_MAX, new_schema);
274+
pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host);
275+
pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id);
276+
pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts);
277+
pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id);
301278

302-
pcmk__xml_free(up);
279+
pcmk__cluster_send_message(NULL, pcmk_ipc_based, up);
303280

304-
} else if (rc == pcmk_rc_ok) {
305-
rc = pcmk_rc_schema_unchanged;
306-
}
281+
pcmk__xml_free(up);
282+
goto done;
283+
}
284+
285+
if (rc == pcmk_rc_ok) {
286+
rc = pcmk_rc_schema_unchanged;
287+
}
307288

308-
if (rc != pcmk_rc_ok) {
309-
// Notify originating peer so it can notify its local clients
310-
pcmk__node_status_t *origin = NULL;
311-
312-
origin = pcmk__search_node_caches(0, host, NULL,
313-
pcmk__node_search_cluster_member);
314-
315-
pcmk__info("Rejecting upgrade request from %s: %s "
316-
QB_XS " rc=%d peer=%s", host, pcmk_rc_str(rc), rc,
317-
((origin != NULL)? origin->name : "lost"));
318-
319-
if (origin) {
320-
xmlNode *up = pcmk__xe_create(NULL, __func__);
321-
322-
pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB);
323-
pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE);
324-
pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host);
325-
pcmk__xe_set(up, PCMK__XA_CIB_ISREPLYTO, host);
326-
pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id);
327-
pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts);
328-
pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id);
329-
pcmk__xe_set_int(up, PCMK__XA_CIB_UPGRADE_RC,
330-
pcmk_rc2legacy(rc));
331-
if (!pcmk__cluster_send_message(origin, pcmk_ipc_based, up)) {
332-
pcmk__warn("Could not send CIB upgrade result to %s", host);
333-
}
334-
pcmk__xml_free(up);
335-
}
289+
// Notify originating peer so it can notify its local clients
290+
origin = pcmk__search_node_caches(0, host, NULL,
291+
pcmk__node_search_cluster_member);
292+
293+
pcmk__info("Rejecting upgrade request from %s: %s " QB_XS " rc=%d peer=%s",
294+
host, pcmk_rc_str(rc), rc,
295+
((origin != NULL)? origin->name : "lost"));
296+
297+
if (origin != NULL) {
298+
xmlNode *up = pcmk__xe_create(NULL, __func__);
299+
300+
pcmk__xe_set(up, PCMK__XA_T, PCMK__VALUE_CIB);
301+
pcmk__xe_set(up, PCMK__XA_CIB_OP, PCMK__CIB_REQUEST_UPGRADE);
302+
pcmk__xe_set(up, PCMK__XA_CIB_DELEGATED_FROM, host);
303+
pcmk__xe_set(up, PCMK__XA_CIB_ISREPLYTO, host);
304+
pcmk__xe_set(up, PCMK__XA_CIB_CLIENTID, client_id);
305+
pcmk__xe_set(up, PCMK__XA_CIB_CALLOPT, call_opts);
306+
pcmk__xe_set(up, PCMK__XA_CIB_CALLID, call_id);
307+
pcmk__xe_set_int(up, PCMK__XA_CIB_UPGRADE_RC, pcmk_rc2legacy(rc));
308+
if (!pcmk__cluster_send_message(origin, pcmk_ipc_based, up)) {
309+
pcmk__warn("Could not send CIB upgrade result to %s", host);
336310
}
337-
pcmk__xml_free(scratch);
311+
pcmk__xml_free(up);
338312
}
313+
314+
done:
315+
pcmk__xml_free(scratch);
339316
return rc;
340317
}
341318

342319
static xmlNode *
343-
cib_msg_copy(xmlNode *msg)
320+
cib_msg_copy(const xmlNode *msg)
344321
{
345322
static const char *field_list[] = {
346323
PCMK__XA_T,
@@ -373,17 +350,15 @@ cib_msg_copy(xmlNode *msg)
373350
}
374351

375352
int
376-
sync_our_cib(xmlNode *request, bool all)
353+
sync_our_cib(const xmlNode *request, bool all)
377354
{
378355
int rc = pcmk_rc_ok;
379356
char *digest = NULL;
380357
const char *host = pcmk__xe_get(request, PCMK__XA_SRC);
381358
const char *op = pcmk__xe_get(request, PCMK__XA_CIB_OP);
382359
pcmk__node_status_t *peer = NULL;
383360
xmlNode *replace_request = NULL;
384-
xmlNode *wrapper = NULL;
385361

386-
CRM_CHECK(the_cib != NULL, return EINVAL);
387362
CRM_CHECK(all || (host != NULL), return EINVAL);
388363

389364
pcmk__debug("Syncing CIB to %s", (all? "all peers" : host));
@@ -408,8 +383,7 @@ sync_our_cib(xmlNode *request, bool all)
408383
digest = pcmk__digest_xml(the_cib, true);
409384
pcmk__xe_set(replace_request, PCMK_XA_DIGEST, digest);
410385

411-
wrapper = pcmk__xe_create(replace_request, PCMK__XE_CIB_CALLDATA);
412-
pcmk__xml_copy(wrapper, the_cib);
386+
cib__set_calldata(replace_request, the_cib);
413387

414388
if (!all) {
415389
peer = pcmk__get_node(0, host, NULL, pcmk__node_search_cluster_member);

0 commit comments

Comments
 (0)