diff --git a/lib/common/crmcommon_private.h b/lib/common/crmcommon_private.h index 49dae6c..d55df99 100644 --- a/lib/common/crmcommon_private.h +++ b/lib/common/crmcommon_private.h @@ -175,6 +175,7 @@ typedef struct pcmk__ipc_methods_s { struct pcmk_ipc_api_s { enum pcmk_ipc_server server; // Daemon this IPC API instance is for enum pcmk_ipc_dispatch dispatch_type; // How replies should be dispatched + size_t ipc_size_max; // maximum IPC buffer size crm_ipc_t *ipc; // IPC connection mainloop_io_t *mainloop_io; // If using mainloop, I/O source for IPC bool free_on_disconnect; // Whether disconnect should free object diff --git a/lib/common/ipc_client.c b/lib/common/ipc_client.c index 4077d61..df687da 100644 --- a/lib/common/ipc_client.c +++ b/lib/common/ipc_client.c @@ -46,8 +46,6 @@ int pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server) { - size_t max_size = 0; - if (api == NULL) { return EINVAL; } @@ -64,13 +62,15 @@ pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server) return EOPNOTSUPP; } + (*api)->ipc_size_max = 0; + // Set server methods and max_size (if not default) switch (server) { case pcmk_ipc_attrd: break; case pcmk_ipc_based: - max_size = 512 * 1024; // 512KB + (*api)->ipc_size_max = 512 * 1024; // 512KB break; case pcmk_ipc_controld: @@ -88,7 +88,7 @@ pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server) case pcmk_ipc_schedulerd: // @TODO max_size could vary by client, maybe take as argument? - max_size = 5 * 1024 * 1024; // 5MB + (*api)->ipc_size_max = 5 * 1024 * 1024; // 5MB break; } if ((*api)->cmds == NULL) { @@ -97,7 +97,8 @@ pcmk_new_ipc_api(pcmk_ipc_api_t **api, enum pcmk_ipc_server server) return ENOMEM; } - (*api)->ipc = crm_ipc_new(pcmk_ipc_name(*api, false), max_size); + (*api)->ipc = crm_ipc_new(pcmk_ipc_name(*api, false), + (*api)->ipc_size_max); if ((*api)->ipc == NULL) { pcmk_free_ipc_api(*api); *api = NULL; @@ -451,11 +452,20 @@ pcmk_connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type) { int rc = pcmk_rc_ok; - if ((api == NULL) || (api->ipc == NULL)) { + if (api == NULL) { crm_err("Cannot connect to uninitialized API object"); return EINVAL; } + if (api->ipc == NULL) { + api->ipc = crm_ipc_new(pcmk_ipc_name(api, false), + api->ipc_size_max); + if (api->ipc == NULL) { + crm_err("Failed to re-create IPC API"); + return ENOMEM; + } + } + if (crm_ipc_connected(api->ipc)) { crm_trace("Already connected to %s IPC API", pcmk_ipc_name(api, true)); return pcmk_rc_ok;