@@ -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 */
4948int
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
5957int
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
8482int
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
9390int
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
10196int
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
145134int
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
160148int
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
205190int
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
220204int
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
243224int
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
250230int
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
342319static 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
375352int
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