Attached is a brief patch which exposes some new APIs and callbacks I am
considering adding to the CPG interface. The general use for this is to
synchronize state after a configuration change.
The initialization is as follows:
cpg_model_initialize (&handle, CPG_MODEL_V2, &model_v2_data, NULL);
model_v2_data is a typedef of cpg_model_v2_data_t which contains the new
callbacks:
typedef void (*cpg_confchg_pending_fn_t) (
cpg_handle_t handle,
const struct cpg_name *group_name,
uint64_t checkpoint_pending_id);
This is delivered prior to a confchg_fn being called. This tells the
application to package a checkpoint and send it with
cpg_checkpoint_send(). (checkpoint_pending_id is passed into this api).
The checkpoint contents are packaged with the apis
cpg_checkpoint_create() and cpg_checkpoint_add().
typedef void (*cpg_confchg_pending_deliver_checkpoint_fn_t) (
cpg_handle_t handle,
const struct cpg_name *group_name,
uint32_t nodeid,
struct cpg_address *source_member,
void *checkpoint_instance);
When a processor receives the cpg_checkpoint_send data, it processes it
and starts to replace its internal state with the state of the
checkpoint information via the cpg_checkpoint_iteration_reset and
cpg_checkpoint_iteration_next apis. After it is done, it executes a
cpg_checkpoint_destroy API call on the data.
After all checkpoint_deliver_checkpoint_fn checkpoint_instance data have
been delivered to the cpg clients, the cpg clients then receive the
original checkpoint_confchg_fn callback.
When this happens, the cpg applications are in a perfectly consistent state.
This would be a Y bump of the cpg soname and a X bump of the corosync
package (corosnync 2.0 but maintaining backwards ABI compatability).
Regards
-steve
Index: include/corosync/cpg.h
===================================================================
--- include/corosync/cpg.h (revision 3041)
+++ include/corosync/cpg.h (working copy)
@@ -80,6 +80,7 @@
typedef enum {
CPG_MODEL_V1 = 1,
+ CPG_MODEL_V2 = 2
} cpg_model_t;
struct cpg_address {
@@ -132,6 +133,18 @@
uint32_t member_list_entries,
const uint32_t *member_list);
+typedef void (*cpg_confchg_pending_fn_t) (
+ cpg_handle_t handle,
+ const struct cpg_name *group_name,
+ uint64_t checkpoint_pending_id);
+
+typedef void (*cpg_confchg_pending_deliver_checkpoint_fn_t) (
+ cpg_handle_t handle,
+ const struct cpg_name *group_name,
+ uint32_t nodeid,
+ struct cpg_address *source_member,
+ void *checkpoint_instance);
+
typedef struct {
cpg_deliver_fn_t cpg_deliver_fn;
cpg_confchg_fn_t cpg_confchg_fn;
@@ -151,6 +164,15 @@
unsigned int flags;
} cpg_model_v1_data_t;
+typedef struct {
+ cpg_model_t model;
+ cpg_deliver_fn_t cpg_deliver_fn;
+ cpg_confchg_fn_t cpg_confchg_fn;
+ cpg_confchg_pending_fn_t cpg_confhg_pending_fn;
+ cpg_confchg_pending_deliver_checkpoint_fn_t
cpg_onfhg_pending_deliver_checkpoint_fn;
+ cpg_totem_confchg_fn_t cpg_totem_confchg_fn;
+ unsigned int flags;
+} cpg_model_v2_data_t;
/** @} */
@@ -279,6 +301,37 @@
cs_error_t cpg_iteration_finalize (
cpg_iteration_handle_t handle);
+/*
+ * V2 Model checkpoint features
+ */
+cs_error_t cpg_checkpoint_create (
+ void **checkpoint_instance);
+
+cs_error_t cpg_checkpoint_destroy (
+ void *checkpoint_instance);
+
+cs_error_t cpg_checkpoint_add (
+ void *checkpoint_instance,
+ void *checkpoint_id,
+ uint64_t checkpoint_id_len,
+ void *checkpoint_data,
+ uint64_t checkpoint_data_len);
+
+cs_error_t cpg_checkpoint_iteration_reset (
+ void *checkpoint_instance);
+
+cs_error_t cpg_checkpoint_iteration_next (
+ void *checkpoint_instance,
+ void **checkpoint_id,
+ uint64_t *checkpoint_id_len,
+ void **checkpoint_data,
+ uint64_t *checkpoint_data_len);
+
+cs_error_t cpg_checkpoint_send (
+ cpg_handle_t handle,
+ uint64_t checkpoint_pending_id,
+ void *checkpoint_instance);
+
#ifdef __cplusplus
}
#endif
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais