/*! \brief Dump the event cache for the subscribed event type */
void ast_event_dump_cache(const struct ast_event_sub *event_sub)
{
+ if (!ast_event_cache[event_sub->type].container) {
+ return;
+ }
+
ao2_callback(ast_event_cache[event_sub->type].container, OBJ_NODATA,
dump_cache_cb, (void *) event_sub);
}
struct ast_event *event;
enum ast_event_ie_type ie_type;
struct ast_event_ie_val *ie_val;
- int has_ie = 0;
AST_LIST_HEAD_NOLOCK_STATIC(ie_vals, ast_event_ie_val);
/* Invalid type */
if (insert) {
AST_LIST_INSERT_TAIL(&ie_vals, ie_value, entry);
- has_ie = 1;
} else {
ast_log(LOG_WARNING, "Unsupported PLTYPE(%d)\n", ie_value->ie_pltype);
}
}
}
- if (has_ie && !ast_event_get_ie_raw(event, AST_EVENT_IE_EID)) {
+ if (!ast_event_get_ie_raw(event, AST_EVENT_IE_EID)) {
/* If the event is originating on this server, add the server's
* entity ID to the event. */
ast_event_append_eid(&event);
const char *name;
struct ast_event_sub *sub;
unsigned char publish;
+ unsigned char publish_default;
unsigned char subscribe;
+ unsigned char subscribe_default;
} event_types[] = {
[AST_EVENT_MWI] = { .name = "mwi", },
[AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state", },
+ [AST_EVENT_PING] = { .name = "ping", .publish_default = 1, .subscribe_default = 1 },
};
static struct {
memcpy(event, msg, msg_len);
- ast_event_queue_and_cache(event);
+ if (ast_event_get_type(event) == AST_EVENT_PING) {
+ const struct ast_eid *eid;
+ char buf[128] = "";
+
+ eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+ ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
+ ast_log(LOG_NOTICE, "(cpg_deliver_cb) Got event PING from server with EID: '%s'\n", buf);
+
+ ast_event_queue(event);
+ } else {
+ ast_event_queue_and_cache(event);
+ }
}
static void cpg_confchg_cb(cpg_handle_t handle, const struct cpg_name *group_name,
.iov_len = ast_event_get_size(event),
};
+ if (ast_event_get_type(event) == AST_EVENT_PING) {
+ const struct ast_eid *eid;
+ char buf[128] = "";
+
+ eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
+ ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid);
+ ast_log(LOG_NOTICE, "(ast_event_cb) Got event PING from server with EID: '%s'\n", buf);
+ }
+
if (ast_eid_cmp(&ast_eid_default,
ast_event_get_ie_raw(event, AST_EVENT_IE_EID))) {
/* If the event didn't originate from this server, don't send it back out. */
return CLI_SUCCESS;
}
+static char *corosync_ping(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ struct ast_event *event;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "corosync ping";
+ e->usage =
+ "Usage: corosync ping\n"
+ " Send a test ping to the cluster.\n"
+ "A NOTICE will be in the log for every ping received\n"
+ "on a server.\n If you send a ping, you should see a NOTICE\n"
+ "in the log for every server in the cluster.\n";
+ return NULL;
+
+ case CLI_GENERATE:
+ return NULL; /* no completion */
+ }
+
+ if (a->argc != e->args) {
+ return CLI_SHOWUSAGE;
+ }
+
+ event = ast_event_new(AST_EVENT_PING, AST_EVENT_IE_END);
+
+ if (!event) {
+ return CLI_FAILURE;
+ }
+
+ ast_event_queue(event);
+
+ return CLI_SUCCESS;
+}
+
static char *corosync_show_config(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
unsigned int i;
static struct ast_cli_entry corosync_cli[] = {
AST_CLI_DEFINE(corosync_show_config, "Show configuration"),
AST_CLI_DEFINE(corosync_show_members, "Show cluster members"),
+ AST_CLI_DEFINE(corosync_ping, "Send a test ping to the cluster"),
};
enum {
ast_rwlock_wrlock(&event_types_lock);
for (i = 0; i < ARRAY_LEN(event_types); i++) {
- event_types[i].publish = 0;
- event_types[i].subscribe = 0;
+ event_types[i].publish = event_types[i].publish_default;
+ event_types[i].subscribe = event_types[i].subscribe_default;
}
for (v = ast_variable_browse(cfg, "general"); v && !res; v = v->next) {