Author: mjordan Date: Fri Mar 13 15:25:51 2015 New Revision: 432913 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432913 Log: AstDB clustering: add shared DB functions; res_pjsip support
Modified: team/mjordan/trunk-astdb-cluster/funcs/func_db.c team/mjordan/trunk-astdb-cluster/include/asterisk/astdb.h team/mjordan/trunk-astdb-cluster/include/asterisk/event_defs.h team/mjordan/trunk-astdb-cluster/main/db.c team/mjordan/trunk-astdb-cluster/res/res_pjsip_outbound_publish.c team/mjordan/trunk-astdb-cluster/res/res_pjsip_publish_asterisk.c team/mjordan/trunk-astdb-cluster/res/res_pjsip_pubsub.c Modified: team/mjordan/trunk-astdb-cluster/funcs/func_db.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/funcs/func_db.c?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/funcs/func_db.c (original) +++ team/mjordan/trunk-astdb-cluster/funcs/func_db.c Fri Mar 13 15:25:51 2015 @@ -437,7 +437,7 @@ /* Generally, failure is benign (key exists) */ ast_debug(2, "Failed to create shared family '%s'\n", value); } else { - ast_verb(4, "Created %s shared family '%s'", + ast_verb(4, "Created %s shared family '%s'\n", share_type == SHARED_DB_TYPE_GLOBAL ? "GLOBAL" : "UNIQUE", value); } Modified: team/mjordan/trunk-astdb-cluster/include/asterisk/astdb.h URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/include/asterisk/astdb.h?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/include/asterisk/astdb.h (original) +++ team/mjordan/trunk-astdb-cluster/include/asterisk/astdb.h Fri Mar 13 15:25:51 2015 @@ -29,6 +29,9 @@ #endif #include "asterisk/utils.h" + +struct stasis_topic; +struct stasis_message_type; enum ast_db_shared_type { /* Items in the shared family are common across all Asterisk instances */ @@ -37,15 +40,17 @@ SHARED_DB_TYPE_UNIQUE, }; +/*! \brief An actual entry in the AstDB */ struct ast_db_entry { + /*! The next entry, if there are multiple entries */ struct ast_db_entry *next; + /*! The key of the entry */ char *key; + /*! The data associated with the key */ char data[0]; }; -struct stasis_topic; -struct stasis_message_type; - +/*! \brief A shared family of keys in the AstDB */ struct ast_db_shared_family { /*! How the family is shared */ enum ast_db_shared_type share_type; @@ -55,31 +60,61 @@ char name[0]; }; +/*! + * \since 14.0.0 + * \brief Create a new database entry + * + * \param key The key of the entry in the database + * \param value The value of the entry + * + * \note The entry returned is allocated on the heap, and should be + * disposed of using \ref ast_db_freetree + * + * \retval NULL on error + * \retval \c ast_db_entry on success + */ struct ast_db_entry *ast_db_entry_create(const char *key, const char *value); -struct ast_db_shared_family *ast_db_shared_family_alloc(const char *family, enum ast_db_shared_type share_type); - -int ast_db_publish_shared_message(struct stasis_message_type *type, struct ast_db_shared_family *shared_family, struct ast_eid *eid); - -void ast_db_refresh_shared(void); +/*! + * \since 14.0.0 + * \brief Create a shared database family + * + * \param family The family to share + * \param share_type The way in which the family should be shared + * + * \note The \c ast_db_shared_family structure is an \c ao2 ref counted + * object. + * + * \retval NULL on error + * \retval an \c ao2 ref counted \c ast_db_shared_family object + */ +struct ast_db_shared_family *ast_db_shared_family_alloc(const char *family, + enum ast_db_shared_type share_type); /*! \addtogroup StasisTopicsAndMessages * @{ */ +/*! + * \since 14.0.0 + * \brief Topic for families that should be passed to clustered Asterisk + * instances + * + * \retval A stasis topic + */ struct stasis_topic *ast_db_cluster_topic(void); /*! - * \since 14 - * \brief Message type for an RTCP message sent from this Asterisk instance + * \since 14.0.0 + * \brief Message type for an update to a shared family * * \retval A stasis message type */ struct stasis_message_type *ast_db_put_shared_type(void); /*! - * \since 14 - * \brief Message type for an RTCP message received from some external source + * \since 14.0.0 + * \brief Message type for deletion of a shared family * * \retval A stasis message type */ @@ -88,12 +123,64 @@ /* }@ */ /*! - * \brief @@@@ - */ -int ast_db_put_shared(const char *family, enum ast_db_shared_type); - + * \since 14.0.0 + * \brief Publish a message for a shared family + * + * \param type The \c stasis_message_type indicating what happened to + the shared family + * \param shared_family The shared family that was updated + * \param eid The server that conveyed the update + * + * \retval 0 success + * \retval -1 error + */ +int ast_db_publish_shared_message(struct stasis_message_type *type, + struct ast_db_shared_family *shared_family, struct ast_eid *eid); + +/*! + * \since 14.0.0 + * \brief Refresh the state of all shared families + * + * \details + * This will cause Stasis messages to be generated that contain the current + * key/value pairs of all shared families. This can be used to send the state + * of all shared families to other Asterisk instances. + */ +void ast_db_refresh_shared(void); + + +/*! + * \since 14.0.0 + * \brief Add a new shared family + * + * \param family The family to share + * \param share_type The way in which the family should be shared + * + * \retval 0 success + * \retval -1 failure + */ +int ast_db_put_shared(const char *family, enum ast_db_shared_type share_type); + +/*! + * \since 14.0.0 + * \brief Delete a shared family + * + * \param family The family whose shared status should be removed + * + * \retval 0 success + * \retval -1 failure + */ int ast_db_del_shared(const char *family); +/*! + * \since 14.0.0 + * \brief Check if a family is shared + * + * \param family The family to verify + * + * \retval 0 The family is not shared + * \retval 1 The family is shared + */ int ast_db_is_shared(const char *family); /*! \brief Get key value specified by family/key */ Modified: team/mjordan/trunk-astdb-cluster/include/asterisk/event_defs.h URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/include/asterisk/event_defs.h?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/include/asterisk/event_defs.h (original) +++ team/mjordan/trunk-astdb-cluster/include/asterisk/event_defs.h Fri Mar 13 15:25:51 2015 @@ -58,8 +58,10 @@ AST_EVENT_ACL_CHANGE = 0x0b, /*! Send out a ping for debugging distributed events */ AST_EVENT_PING = 0x0c, + /*! Send out a shared database event */ + AST_EVENT_DB_SHARED = 0x0d, /*! Number of event types. This should be the last event type + 1 */ - AST_EVENT_TOTAL = 0x0d, + AST_EVENT_TOTAL = 0x0e, }; /*! \brief Event Information Element types */ @@ -302,8 +304,38 @@ * Payload type: UINT */ AST_EVENT_IE_CACHABLE = 0x003d, + /*! + * \brief AstDB Family + * Used by: AST_EVENT_DB_SHARED + * Payload type: STR + */ + AST_EVENT_IE_DB_FAMILY = 0x003e, + /*! + * \brief AstDB action to take + * Used by: AST_EVENT_DB_SHARED + * Payload type: STR + */ + AST_EVENT_ID_DB_ACTION_TYPE = 0x003f, + /*! + * \brief AstDB share type + * Used by: AST_EVENT_DB_SHARED + * Payload type: UINT + */ + AST_EVENT_IE_DB_SHARE_TYPE = 0x0040, + /*! + * \brief AstDB key + * Used by: AST_EVENT_DB_SHARED + * Payload type: STR + */ + AST_EVENT_IE_DB_KEY = 0x0041, + /*! + * \brief AstDB value + * Used by: AST_EVENT_DB_SHARED + * Payload type: STR + */ + AST_EVENT_IE_DB_VALUE = 0x0042, /*! \brief Must be the last IE value +1 */ - AST_EVENT_IE_TOTAL = 0x003e, + AST_EVENT_IE_TOTAL = 0x0043, }; /*! Modified: team/mjordan/trunk-astdb-cluster/main/db.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/main/db.c?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/main/db.c (original) +++ team/mjordan/trunk-astdb-cluster/main/db.c Fri Mar 13 15:25:51 2015 @@ -51,6 +51,7 @@ #include "asterisk/cli.h" #include "asterisk/utils.h" #include "asterisk/manager.h" +#include "asterisk/event.h" /*** DOCUMENTATION <manager name="DBGet" language="en_US"> @@ -115,12 +116,15 @@ /*! \brief A container of families to share across Asterisk instances */ static struct ao2_container *shared_families; +/*! \brief The Stasis topic for shared families */ static struct stasis_topic *db_cluster_topic; +/*! \brief A Stasis message router for handling external AstDB updates */ static struct stasis_message_router *message_router; static void db_sync(void); +/*! \brief The AstDB key used to store which families are shared across restarts */ #define SHARED_FAMILY "__asterisk_shared_family" #define DEFINE_SQL_STATEMENT(stmt,sql) static sqlite3_stmt *stmt; \ @@ -223,6 +227,9 @@ return entry; } +/*! \internal + * \brief AO2 destructor for \c ast_db_shared_family + */ static void shared_db_family_dtor(void *obj) { struct ast_db_shared_family *family = obj; @@ -245,6 +252,9 @@ return shared_family; } +/*! \internal + * \brief Clone a \c ast_db_shared_family + */ static struct ast_db_shared_family *db_shared_family_clone(const struct ast_db_shared_family *shared_family) { struct ast_db_shared_family *clone; @@ -254,6 +264,9 @@ return clone; } +/*! \internal + * \brief AO2 container sort function for \c ast_db_shared_family + */ static int db_shared_family_sort_fn(const void *obj_left, const void *obj_right, int flags) { const struct ast_db_shared_family *left = obj_left; @@ -275,7 +288,6 @@ } return cmp; } - static int db_create_astdb(void) { @@ -436,7 +448,7 @@ return res; } -static int db_put_shared(const char *family, const char *key, const char *value) +static int db_entry_put_shared(const char *family, const char *key, const char *value) { struct ast_db_shared_family *shared_family; struct ast_db_shared_family *clone; @@ -468,7 +480,7 @@ return 0; } -static int db_del_shared(const char *family, const char *key) +static int db_entry_del_shared(const char *family, const char *key) { struct ast_db_shared_family *shared_family; struct ast_db_shared_family *clone; @@ -558,7 +570,7 @@ sqlite3_reset(put_stmt); db_sync(); if (share) { - db_put_shared(family, key, value); + db_entry_put_shared(family, key, value); } ast_mutex_unlock(&dblock); @@ -664,7 +676,7 @@ sqlite3_reset(del_stmt); db_sync(); if (share) { - db_del_shared(family, key); + db_entry_del_shared(family, key); } ast_mutex_unlock(&dblock); @@ -707,7 +719,7 @@ sqlite3_reset(stmt); db_sync(); if (share) { - db_del_shared(prefix, NULL); + db_entry_del_shared(prefix, NULL); } ast_mutex_unlock(&dblock); @@ -863,6 +875,71 @@ return CLI_SUCCESS; } +static char *handle_cli_database_put_shared(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + int res; + enum ast_db_shared_type share_type; + + switch (cmd) { + case CLI_INIT: + e->command = "database put shared"; + e->usage = + "Usage: database put shared <family> <type>\n" + " Creates a new shared family of the given type,\n" + " where type is either 'unique' or 'global'.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 5) { + return CLI_SHOWUSAGE; + } + + if (!strcasecmp(a->argv[4], "unique")) { + share_type = SHARED_DB_TYPE_UNIQUE; + } else if (!strcasecmp(a->argv[4], "global")) { + share_type = SHARED_DB_TYPE_GLOBAL; + } else { + ast_cli(a->fd, "Unknown share type: '%s'\n", a->argv[4]); + return CLI_SUCCESS; + } + + res = ast_db_put_shared(a->argv[3], share_type); + if (res) { + ast_cli(a->fd, "Could not share family '%s' (is it already shared?)\n", a->argv[3]); + } else { + ast_cli(a->fd, "Shared database family '%s'.\n", a->argv[3]); + } + return CLI_SUCCESS; +} + +static char *handle_cli_database_del_shared(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + int res; + + switch (cmd) { + case CLI_INIT: + e->command = "database del shared"; + e->usage = + "Usage: database del shared <family>\n" + " Deletes the shared status of a database family.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 4) { + return CLI_SHOWUSAGE; + } + res = ast_db_del_shared(a->argv[3]); + if (res) { + ast_cli(a->fd, "Shared family '%s' does not exist.\n", a->argv[3]); + } else { + ast_cli(a->fd, "Shared database family '%s' removed.\n", a->argv[3]); + } + return CLI_SUCCESS; +} static char *handle_cli_database_deltree(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { int num_deleted; @@ -896,6 +973,45 @@ ast_cli(a->fd, "%d database entries removed.\n",num_deleted); } return CLI_SUCCESS; +} + +static int print_database_show(struct ast_cli_args *a, sqlite3_stmt *stmt) +{ + int counter = 0; + + ast_cli(a->fd, "%-50s: %-25s %s\n", "Key", "Data", "Shared"); + ast_cli(a->fd, "-------------------------------------------------- ------------------------- ------\n"); + while (sqlite3_step(stmt) == SQLITE_ROW) { + struct ast_db_shared_family *shared_family; + const char *key_s; + const char *value_s; + char *family_s; + char *delim; + + if (!(key_s = (const char *) sqlite3_column_text(stmt, 0))) { + break; + } + if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) { + break; + } + family_s = ast_strdup(key_s); + if (!family_s) { + break; + } + delim = strchr(family_s + 1, '/'); + *delim = '\0'; + + shared_family = ao2_find(shared_families, family_s + 1, OBJ_SEARCH_KEY); + + ++counter; + ast_cli(a->fd, "%-50s: %-25s %s\n", key_s, value_s, + shared_family ? (shared_family->share_type == SHARED_DB_TYPE_UNIQUE ? "(U)" : "(G)") : ""); + + ao2_cleanup(shared_family); + ast_free(family_s); + } + + return counter; } static char *handle_cli_database_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) @@ -941,19 +1057,7 @@ return NULL; } - while (sqlite3_step(stmt) == SQLITE_ROW) { - const char *key_s, *value_s; - if (!(key_s = (const char *) sqlite3_column_text(stmt, 0))) { - ast_log(LOG_WARNING, "Skipping invalid key!\n"); - continue; - } - if (!(value_s = (const char *) sqlite3_column_text(stmt, 1))) { - ast_log(LOG_WARNING, "Skipping invalid value!\n"); - continue; - } - ++counter; - ast_cli(a->fd, "%-50s: %-25s\n", key_s, value_s); - } + counter = print_database_show(a, stmt); sqlite3_reset(stmt); ast_mutex_unlock(&dblock); @@ -989,29 +1093,8 @@ return NULL; } - while (sqlite3_step(showkey_stmt) == SQLITE_ROW) { - const char *key_s, *value_s; - char *family_s; - char *delim; - - if (!(key_s = (const char *) sqlite3_column_text(showkey_stmt, 0))) { - break; - } - if (!(value_s = (const char *) sqlite3_column_text(showkey_stmt, 1))) { - break; - } - family_s = ast_strdup(key_s); - if (!family_s) { - break; - } - delim = strchr(family_s + 1, '/'); - *delim = '\0'; - - ++counter; - ast_cli(a->fd, "%-50s: %-25s %s\n", key_s, value_s, - ast_db_is_shared(family_s + 1) ? "(S)" : ""); - ast_free(family_s); - } + counter = print_database_show(a, showkey_stmt); + sqlite3_reset(showkey_stmt); ast_mutex_unlock(&dblock); @@ -1059,13 +1142,15 @@ } static struct ast_cli_entry cli_database[] = { - AST_CLI_DEFINE(handle_cli_database_show, "Shows database contents"), - AST_CLI_DEFINE(handle_cli_database_showkey, "Shows database contents"), - AST_CLI_DEFINE(handle_cli_database_get, "Gets database value"), - AST_CLI_DEFINE(handle_cli_database_put, "Adds/updates database value"), - AST_CLI_DEFINE(handle_cli_database_del, "Removes database key/value"), - AST_CLI_DEFINE(handle_cli_database_deltree, "Removes database keytree/values"), - AST_CLI_DEFINE(handle_cli_database_query, "Run a user-specified query on the astdb"), + AST_CLI_DEFINE(handle_cli_database_show, "Shows database contents"), + AST_CLI_DEFINE(handle_cli_database_showkey, "Shows database contents"), + AST_CLI_DEFINE(handle_cli_database_get, "Gets database value"), + AST_CLI_DEFINE(handle_cli_database_put, "Adds/updates database value"), + AST_CLI_DEFINE(handle_cli_database_del, "Removes database key/value"), + AST_CLI_DEFINE(handle_cli_database_put_shared, "Add a shared family"), + AST_CLI_DEFINE(handle_cli_database_del_shared, "Remove a shared family"), + AST_CLI_DEFINE(handle_cli_database_deltree, "Removes database keytree/values"), + AST_CLI_DEFINE(handle_cli_database_query, "Run a user-specified query on the astdb"), }; static int manager_dbput(struct mansession *s, const struct message *m) @@ -1254,7 +1339,6 @@ if (!message) { return -1; } - stasis_publish(ast_db_cluster_topic(), message); return 0; @@ -1343,25 +1427,21 @@ "entries", shared_family->entries ? db_entries_to_json(shared_family->entries) : ast_json_null()); } -static struct ast_event *db_put_shared_type_to_event(struct stasis_message *message) -{ - return NULL; -} - struct stasis_topic *ast_db_cluster_topic(void) { return db_cluster_topic; } STASIS_MESSAGE_TYPE_DEFN(ast_db_put_shared_type, - .to_event = db_put_shared_type_to_event, .to_json = db_shared_family_to_json, ); STASIS_MESSAGE_TYPE_DEFN(ast_db_del_shared_type, - .to_event = db_del_shared_type_to_event, .to_json = db_shared_family_to_json, ); +/*! \internal + * \brief Stasis message callback for external updates to AstDB shared families + */ static void db_put_shared_msg_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message) { struct ast_db_shared_family *shared_family; @@ -1375,6 +1455,7 @@ return; } + /* Pass on any updates that originated from ourselves */ eid = stasis_message_eid(message); if (!eid || !ast_eid_cmp(eid, &ast_eid_default)) { return; @@ -1403,6 +1484,9 @@ } } +/*! \internal + * \brief Stasis message callback for external deletes to AstDB shared families + */ static void db_del_shared_msg_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message) { struct ast_db_shared_family *shared_family; @@ -1414,6 +1498,7 @@ return; } + /* Pass on any updates that originated from ourselves */ eid = stasis_message_eid(message); if (!eid || !ast_eid_cmp(eid, &ast_eid_default)) { return; @@ -1467,6 +1552,39 @@ ast_mutex_unlock(&dblock); } +/*! \internal + * \brief Rebuild shared families from any stored in the AstDB + */ +static void restore_shared_families(void) +{ + struct ast_db_entry *entry; + struct ast_db_entry *cur; + + entry = ast_db_gettree(SHARED_FAMILY, ""); + for (cur = entry; cur; cur = cur->next) { + enum ast_db_shared_type share_type; + const char *family; + + /* Find the 'key', which is the name of the shared family */ + family = strchr(cur->key + 1, '/') + 1; + if (!family) { + continue; + } + + if (!strcasecmp(cur->data, "unique")) { + share_type = SHARED_DB_TYPE_UNIQUE; + } else if (!strcasecmp(cur->data, "global")) { + share_type = SHARED_DB_TYPE_GLOBAL; + } else { + continue; + } + + ast_db_put_shared(family, share_type); + } + + ast_db_freetree(entry); +} + int astdb_init(void) { shared_families = ao2_container_alloc_rbtree(AO2_ALLOC_OPT_LOCK_MUTEX, @@ -1501,6 +1619,8 @@ ao2_ref(shared_families, -1); return -1; } + + restore_shared_families(); ast_cond_init(&dbcond, NULL); if (ast_pthread_create_background(&syncthread, NULL, db_sync_thread, NULL)) { Modified: team/mjordan/trunk-astdb-cluster/res/res_pjsip_outbound_publish.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/res/res_pjsip_outbound_publish.c?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/res/res_pjsip_outbound_publish.c (original) +++ team/mjordan/trunk-astdb-cluster/res/res_pjsip_outbound_publish.c Fri Mar 13 15:25:51 2015 @@ -370,6 +370,8 @@ ast_log(LOG_ERROR, "Failed to start outbound publish with event '%s' for client '%s'\n", publish->event, ast_sorcery_object_get_id(publish)); } else { + ast_debug(2, "Started outbound publish client '%s' for event '%s'\n", + ast_sorcery_object_get_id(publish), publish->event); state->client->started = 1; } } else if (state->client->started && !handler && removed && !strcmp(publish->event, removed->event_name)) { @@ -380,6 +382,9 @@ ast_log(LOG_WARNING, "Could not stop refresh timer on client '%s'\n", ast_sorcery_object_get_id(publish)); ao2_ref(state->client, -1); + } else { + ast_debug(2, "Stopped outbound publish client '%s'\n", + ast_sorcery_object_get_id(publish)); } } ao2_ref(publish, -1); @@ -429,6 +434,8 @@ } sub_add_handler(handler); + + ast_debug(1, "Registered publisher handler for event '%s'\n", handler->event_name); sip_outbound_publish_synchronize(NULL); Modified: team/mjordan/trunk-astdb-cluster/res/res_pjsip_publish_asterisk.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/res/res_pjsip_publish_asterisk.c?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/res/res_pjsip_publish_asterisk.c (original) +++ team/mjordan/trunk-astdb-cluster/res/res_pjsip_publish_asterisk.c Fri Mar 13 15:25:51 2015 @@ -59,7 +59,7 @@ <configOption name="mailboxstate_publish"> <synopsis>Optional name of a publish item that can be used to publish a request for full mailbox state information.</synopsis> </configOption> - <configOption name="dbstate_publish"> + <configOption name="db_publish"> <synopsis>Optional name of a publish item that can be used to publish a request for full AstDB state information.</synopsis> </configOption> <configOption name="device_state" default="no"> @@ -187,10 +187,28 @@ } } -/*! \brief Datastore for attaching devicestate publisher state information */ +/*! \brief Datastore for attaching MWI publisher state information */ static const struct ast_datastore_info asterisk_mwi_publisher_state_datastore = { .type = "asterisk-mwi-publisher", .destroy = asterisk_mwi_publisher_state_destroy, +}; + +static void asterisk_db_publisher_state_destroy(void *obj) +{ + struct asterisk_db_publisher_state *publisher_state = obj; + + ao2_cleanup(publisher_state->client); + + if (publisher_state->db_state_filter) { + regfree(&publisher_state->db_state_regex); + } +} + + +/*! \brief Datastore for attaching database publisher state information */ +static const struct ast_datastore_info asterisk_db_publisher_state_datastore = { + .type = "asterisk-db-publisher", + .destroy = asterisk_db_publisher_state_destroy, }; /*! @@ -336,6 +354,11 @@ return; } + if (stasis_message_type(msg) != ast_db_put_shared_type() + && stasis_message_type(msg) != ast_db_del_shared_type()) { + return; + } + eid = stasis_message_eid(msg); if (!eid || ast_eid_cmp(&ast_eid_default, eid)) { /* If the event is aggregate, unknown, or didn't originate from this @@ -350,6 +373,7 @@ if (publisher_state->db_state_filter && regexec(&publisher_state->db_state_regex, shared_family->name, 0, NULL, 0)) { /* Outgoing AstDB state is filtered and the family wasn't allowed */ + ast_debug(3, "Filtered out state family '%s'\n", shared_family->name); return; } @@ -578,7 +602,7 @@ struct asterisk_db_publisher_state *publisher_state; const char *value; - datastore = ast_sip_publish_client_alloc_datastore(&asterisk_mwi_publisher_state_datastore, "asterisk-db-publisher"); + datastore = ast_sip_publish_client_alloc_datastore(&asterisk_db_publisher_state_datastore, "asterisk-db-publisher"); if (!datastore) { return -1; } @@ -596,7 +620,6 @@ } publisher_state->db_state_filter = 1; } - publisher_state->client = ao2_bump(client); if (ast_sip_publish_client_add_datastore(client, datastore)) { @@ -1261,7 +1284,7 @@ ast_sorcery_object_field_register_custom(ast_sip_get_sorcery(), "asterisk-publication", "db_state_filter", "", regex_filter_handler, NULL, NULL, 0, 0); ast_sorcery_reload_object(ast_sip_get_sorcery(), "asterisk-publication"); - for (i = 0; i < ARRAY_LEN(&publish_handlers); i++) { + for (i = 0; i < ARRAY_LEN(publish_handlers); i++) { if (ast_sip_register_publish_handler(publish_handlers[i])) { ast_log(LOG_WARNING, "Unable to register event publication handler %s\n", publish_handlers[i]->event_name); @@ -1272,7 +1295,7 @@ } } - for (i = 0; i < ARRAY_LEN(&event_publisher_handlers); i++) { + for (i = 0; i < ARRAY_LEN(event_publisher_handlers); i++) { if (ast_sip_register_event_publisher_handler(event_publisher_handlers[i])) { ast_log(LOG_WARNING, "Unable to register event publisher handler %s\n", event_publisher_handlers[i]->event_name); @@ -1302,11 +1325,11 @@ { int i; - for (i = 0; i < ARRAY_LEN(&publish_handlers); i++) { + for (i = 0; i < ARRAY_LEN(publish_handlers); i++) { ast_sip_unregister_publish_handler(publish_handlers[i]); } - for (i = 0; i < ARRAY_LEN(&event_publisher_handlers); i++) { + for (i = 0; i < ARRAY_LEN(event_publisher_handlers); i++) { ast_sip_unregister_event_publisher_handler(event_publisher_handlers[i]); } Modified: team/mjordan/trunk-astdb-cluster/res/res_pjsip_pubsub.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/res/res_pjsip_pubsub.c?view=diff&rev=432913&r1=432912&r2=432913 ============================================================================== --- team/mjordan/trunk-astdb-cluster/res/res_pjsip_pubsub.c (original) +++ team/mjordan/trunk-astdb-cluster/res/res_pjsip_pubsub.c Fri Mar 13 15:25:51 2015 @@ -2331,6 +2331,8 @@ publish_add_handler(handler); + ast_debug(1, "Registered publish handler for event '%s'\n", handler->event_name); + ast_module_ref(ast_module_info->self); return 0; @@ -2770,11 +2772,14 @@ resource = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "inbound-publication", resource_name); if (!resource) { + ast_debug(1, "No publication resource found for resource: '%s'\n", resource_name); pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 404, NULL, NULL, NULL); return NULL; } if (!ast_strlen_zero(resource->endpoint) && strcmp(resource->endpoint, ast_sorcery_object_get_id(endpoint))) { + ast_debug(1, "Resource endpoint '%s' does not match endpoint '%s'\n", + resource->endpoint, ast_sorcery_object_get_id(endpoint)); pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 403, NULL, NULL, NULL); return NULL; } @@ -2786,6 +2791,7 @@ } if (!event_configuration_name) { + ast_debug(1, "Configuration did not contain a match for event '%s'\n", handler->event_name); pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 404, NULL, NULL, NULL); return NULL; } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits