Author: mjordan Date: Sun Apr 5 21:14:30 2015 New Revision: 434016 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=434016 Log: Fix Mark's findings
Modified: team/mjordan/trunk-astdb-cluster/funcs/func_db.c team/mjordan/trunk-astdb-cluster/main/db.c team/mjordan/trunk-astdb-cluster/tests/test_db.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=434016&r1=434015&r2=434016 ============================================================================== --- team/mjordan/trunk-astdb-cluster/funcs/func_db.c (original) +++ team/mjordan/trunk-astdb-cluster/funcs/func_db.c Sun Apr 5 21:14:30 2015 @@ -450,27 +450,16 @@ }; static int function_db_shared_exists_read(struct ast_channel *chan, - const char *cmd, char *parse, char *buf, size_t len) -{ - AST_DECLARE_APP_ARGS(args, - AST_APP_ARG(family); - ); - + const char *cmd, char *args, char *buf, size_t len) +{ buf[0] = '\0'; - if (ast_strlen_zero(parse)) { + if (ast_strlen_zero(args)) { ast_log(LOG_WARNING, "DB_SHARED_EXISTS requires an argument, DB_SHARED_EXISTS(<family>)\n"); return -1; } - AST_STANDARD_APP_ARGS(args, parse); - - if (args.argc != 1) { - ast_log(LOG_WARNING, "DB_SHARED_EXISTS requires an argument, DB_SHARED_EXISTS(<family>)\n"); - return -1; - } - - if (ast_db_is_shared(args.family)) { + if (ast_db_is_shared(args)) { ast_copy_string(buf, "1", len); } else { ast_copy_string(buf, "0", len); @@ -494,6 +483,11 @@ AST_APP_ARG(type); ); + if (ast_strlen_zero(value)) { + ast_log(LOG_WARNING, "DB_SHARED requires a value, DB_SHARED(<action>[,<type>])=<family>\n"); + return -1; + } + if (ast_strlen_zero(parse)) { ast_log(LOG_WARNING, "DB_SHARED requires an argument, DB_SHARED(<action>[,<type>])=<family>\n"); return -1; @@ -501,18 +495,14 @@ AST_STANDARD_APP_ARGS(args, parse); - if (args.argc < 1) { - ast_log(LOG_WARNING, "DB_SHARED requires an argument, DB_SHARED(<action>[,<type>])=<family>\n"); - return -1; - } - - if (ast_strlen_zero(value)) { - ast_log(LOG_WARNING, "DB_SHARED requires a value, DB_SHARED(<action>[,<type>])=<family>\n"); - return -1; - } - if (!strcasecmp(args.action, "put")) { - if (ast_strlen_zero(args.type) || !strcasecmp(args.type, "global")) { + + if (ast_strlen_zero(args.type)) { + ast_log(LOG_WARNING, "DB_SHARED: No 'type' provided.\n"); + return -1; + } + + if (!strcasecmp(args.type, "global")) { share_type = DB_SHARE_TYPE_GLOBAL; } else if (!strcasecmp(args.type, "unique")) { share_type = DB_SHARE_TYPE_UNIQUE; 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=434016&r1=434015&r2=434016 ============================================================================== --- team/mjordan/trunk-astdb-cluster/main/db.c (original) +++ team/mjordan/trunk-astdb-cluster/main/db.c Sun Apr 5 21:14:30 2015 @@ -258,11 +258,7 @@ */ static struct ast_db_shared_family *db_shared_family_clone(const struct ast_db_shared_family *shared_family) { - struct ast_db_shared_family *clone; - - clone = ast_db_shared_family_alloc(shared_family->name, shared_family->share_type); - - return clone; + return ast_db_shared_family_alloc(shared_family->name, shared_family->share_type); } /*! \internal @@ -427,13 +423,12 @@ } ao2_link_flags(shared_families, shared_family, OBJ_NOLOCK); + ao2_unlock(shared_families); db_put_common(SHARED_FAMILY, shared_family->name, share_type == DB_SHARE_TYPE_UNIQUE ? "UNIQUE" : "GLOBAL", 0); ao2_ref(shared_family, -1); - - ao2_unlock(shared_families); return 0; } @@ -559,13 +554,14 @@ shared_family = ao2_find(shared_families, family, OBJ_SEARCH_KEY | OBJ_NOLOCK); if (shared_family) { ao2_unlink_flags(shared_families, shared_family, OBJ_NOLOCK); + ao2_unlock(shared_families); + db_del_common(SHARED_FAMILY, shared_family->name, 0); ao2_ref(shared_family, -1); } else { + ao2_unlock(shared_families); res = -1; } - - ao2_unlock(shared_families); return res; } @@ -1429,7 +1425,6 @@ ao2_ref(shared_family, -1); continue; } - ast_db_publish_shared_message(ast_db_put_shared_type(), clone, NULL); ao2_ref(clone, -1); @@ -1641,10 +1636,11 @@ const char *family; /* Find the 'key', which is the name of the shared family */ - family = strchr(cur->key + 1, '/') + 1; + family = strchr(cur->key + 1, '/'); if (!family) { continue; } + family++; if (!strcasecmp(cur->data, "unique")) { share_type = DB_SHARE_TYPE_UNIQUE; Modified: team/mjordan/trunk-astdb-cluster/tests/test_db.c URL: http://svnview.digium.com/svn/asterisk/team/mjordan/trunk-astdb-cluster/tests/test_db.c?view=diff&rev=434016&r1=434015&r2=434016 ============================================================================== --- team/mjordan/trunk-astdb-cluster/tests/test_db.c (original) +++ team/mjordan/trunk-astdb-cluster/tests/test_db.c Sun Apr 5 21:14:30 2015 @@ -137,7 +137,7 @@ if (r == ETIMEDOUT) { break; } - ast_assert(r == 0); /* Not expecting any othet types of errors */ + ast_assert(r == 0); /* Not expecting any other types of errors */ } return consumer->messages_rxed_len; } @@ -390,7 +390,7 @@ * As annoying as it is, it's actually really hard to synchronize on when the * AstDB updates itself from the received publication of a shared family value. * This is because while we can synchronize on the delivery to a topic, we can't - * synchronize that the AstDB handler's for that topic has written the value out. + * synchronize that the AstDB handlers for that topic have written the value out. * Hence, we use this loop - if we don't get a value written within 1000 usec, * something is definitely wrong and we should just fail the unit test. */ @@ -410,6 +410,8 @@ AST_TEST_DEFINE(test_ast_db_put_shared_create) { + RAII_VAR(const char *, global_family, GLOBAL_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, unique_family, UNIQUE_SHARED_FAMILY, ast_db_del_shared); int res; switch (cmd) { @@ -442,14 +444,13 @@ res = ast_db_put_shared(UNIQUE_SHARED_FAMILY, DB_SHARE_TYPE_GLOBAL); ast_test_validate(test, res != 0, "Creating duplicate global of unique shared area"); - ast_db_del_shared(GLOBAL_SHARED_FAMILY); - ast_db_del_shared(UNIQUE_SHARED_FAMILY); - return AST_TEST_PASS; } AST_TEST_DEFINE(test_ast_db_put_shared_delete) { + RAII_VAR(const char *, global_family, GLOBAL_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, unique_family, UNIQUE_SHARED_FAMILY, ast_db_del_shared); int res; switch (cmd) { @@ -485,8 +486,15 @@ return AST_TEST_PASS; } +static void tree_cleanup(const char *name) +{ + ast_db_deltree(name, ""); +} + AST_TEST_DEFINE(test_ast_db_put_shared_unique) { + RAII_VAR(const char *, unique_family, UNIQUE_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, tree_family, UNIQUE_SHARED_FAMILY, tree_cleanup); RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup); RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe); int res; @@ -534,14 +542,13 @@ ast_test_validate(test, stasis_message_type(consumer->messages_rxed[0]) == ast_db_put_shared_type()); ast_test_validate(test, stasis_message_type(consumer->messages_rxed[1]) == ast_db_put_shared_type()); - ast_db_del_shared(UNIQUE_SHARED_FAMILY); - ast_db_deltree(UNIQUE_SHARED_FAMILY, ""); - return AST_TEST_PASS; } AST_TEST_DEFINE(test_ast_db_put_shared_global) { + RAII_VAR(const char *, global_family, GLOBAL_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, tree_family, GLOBAL_SHARED_FAMILY, tree_cleanup); RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup); RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe); int res; @@ -589,17 +596,17 @@ ast_test_validate(test, stasis_message_type(consumer->messages_rxed[0]) == ast_db_put_shared_type()); ast_test_validate(test, stasis_message_type(consumer->messages_rxed[1]) == ast_db_put_shared_type()); - ast_db_deltree(GLOBAL_SHARED_FAMILY, ""); - ast_db_del_shared(GLOBAL_SHARED_FAMILY); - return AST_TEST_PASS; } AST_TEST_DEFINE(test_ast_db_put_shared_unique_update) { + RAII_VAR(const char *, unique_family, UNIQUE_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, tree_family, "astdbtest_unique", tree_cleanup); + RAII_VAR(const char *, eid_tree_family, TEST_EID, tree_cleanup); RAII_VAR(struct ast_db_shared_family *, shared_family, NULL, ao2_cleanup); + RAII_VAR(char *, value, NULL, ast_free); char eid_family[256]; - char *value = NULL; struct ast_eid eid; int res; @@ -634,6 +641,7 @@ TEST_FOR_VALUE(eid_family, "foo", value); ast_test_validate(test, strcmp(value, "bar") == 0); ast_free(value); + value = NULL; res = ast_db_del_shared(UNIQUE_SHARED_FAMILY); ast_test_validate(test, res == 0, "Removal of unique shared area"); @@ -652,18 +660,17 @@ /* Make sure we didn't update the value */ TEST_FOR_VALUE(eid_family, "foo", value); ast_test_validate(test, strcmp(value, "bar") == 0); - ast_free(value); - - ast_db_deltree("astdbtest_unique", ""); - ast_db_deltree(TEST_EID, ""); + return AST_TEST_PASS; } AST_TEST_DEFINE(test_ast_db_put_shared_global_update) { + RAII_VAR(const char *, global_family, GLOBAL_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, tree_family, GLOBAL_SHARED_FAMILY, tree_cleanup); RAII_VAR(struct ast_db_shared_family *, shared_family, NULL, ao2_cleanup); + RAII_VAR(char *, value, NULL, ast_free); struct ast_eid eid; - char *value = NULL; int res; switch (cmd) { @@ -696,6 +703,7 @@ TEST_FOR_VALUE(GLOBAL_SHARED_FAMILY, "foo", value); ast_test_validate(test, strcmp(value, "bar") == 0); ast_free(value); + value = NULL; res = ast_db_del_shared(GLOBAL_SHARED_FAMILY); ast_test_validate(test, res == 0, "Removal of global shared area"); @@ -714,9 +722,6 @@ /* Make sure we didn't update the value */ TEST_FOR_VALUE(GLOBAL_SHARED_FAMILY, "foo", value); ast_test_validate(test, strcmp(value, "bar") == 0); - ast_free(value); - - ast_db_deltree(GLOBAL_SHARED_FAMILY, ""); return AST_TEST_PASS; } @@ -725,6 +730,10 @@ { RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup); RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe); + RAII_VAR(const char *, global_family, GLOBAL_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, global_tree_family, GLOBAL_SHARED_FAMILY, tree_cleanup); + RAII_VAR(const char *, unique_family, UNIQUE_SHARED_FAMILY, ast_db_del_shared); + RAII_VAR(const char *, unique_tree_family, UNIQUE_SHARED_FAMILY, tree_cleanup); int res; int actual_len; @@ -767,11 +776,6 @@ ast_test_validate(test, stasis_message_type(consumer->messages_rxed[0]) == ast_db_put_shared_type()); ast_test_validate(test, stasis_message_type(consumer->messages_rxed[1]) == ast_db_put_shared_type()); - - ast_db_del_shared(UNIQUE_SHARED_FAMILY); - ast_db_del_shared(GLOBAL_SHARED_FAMILY); - ast_db_deltree(UNIQUE_SHARED_FAMILY, ""); - ast_db_deltree(GLOBAL_SHARED_FAMILY, ""); return AST_TEST_PASS; } -- _____________________________________________________________________ -- 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