Prevent CDR backends from unregistering while billing data is in flight

This patch makes it so that CDR backends cannot be unregistered while active
CDR records exist. This helps to prevent billing data from being lost during
restarts and shutdowns.

Review: https://reviewboard.asterisk.org/r/2880/
........

Merged revisions 402081 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@402082 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Matthew Jordan
2013-10-27 20:04:17 +00:00
parent 2e24dfe4d1
commit 3713fa5c9f
14 changed files with 152 additions and 36 deletions

View File

@@ -767,7 +767,10 @@ early_release:
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (AST_RWLIST_WRLOCK(&odbc_tables)) {
ast_cdr_register(name, ast_module_info->description, odbc_log);
ast_log(LOG_ERROR, "Unable to lock column list. Unload failed.\n");

View File

@@ -315,7 +315,10 @@ static int csv_log(struct ast_cdr *cdr)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
loaded = 0;
return 0;
}

View File

@@ -184,7 +184,9 @@ static int custom_log(struct ast_cdr *cdr)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (AST_RWLIST_WRLOCK(&sinks)) {
ast_cdr_register(name, ast_module_info->description, custom_log);

View File

@@ -86,8 +86,9 @@ static int load_config(int reload)
if (!cfg) {
/* Standard configuration */
ast_log(LOG_WARNING, "Failed to load configuration file. Module not activated.\n");
if (enablecdr)
ast_cdr_unregister(name);
if (enablecdr) {
ast_cdr_backend_suspend(name);
}
enablecdr = 0;
return -1;
}
@@ -135,10 +136,11 @@ static int load_config(int reload)
ast_config_destroy(cfg);
if (enablecdr && !newenablecdr)
ast_cdr_unregister(name);
else if (!enablecdr && newenablecdr)
ast_cdr_register(name, "Asterisk Manager Interface CDR Backend", manager_log);
if (!newenablecdr) {
ast_cdr_backend_suspend(name);
} else if (newenablecdr) {
ast_cdr_backend_unsuspend(name);
}
enablecdr = newenablecdr;
return 0;
@@ -210,7 +212,10 @@ static int manager_log(struct ast_cdr *cdr)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (customfields)
ast_free(customfields);
@@ -219,7 +224,12 @@ static int unload_module(void)
static int load_module(void)
{
if (ast_cdr_register(name, "Asterisk Manager Interface CDR Backend", manager_log)) {
return AST_MODULE_LOAD_DECLINE;
}
if (load_config(0)) {
ast_cdr_unregister(name);
return AST_MODULE_LOAD_DECLINE;
}

View File

@@ -266,8 +266,10 @@ static int odbc_load_module(int reload)
} while (0);
if (ast_test_flag(&config, CONFIG_REGISTERED) && (!cfg || dsn == NULL || table == NULL)) {
ast_cdr_unregister(name);
ast_cdr_backend_suspend(name);
ast_clear_flag(&config, CONFIG_REGISTERED);
} else {
ast_cdr_backend_unsuspend(name);
}
if (cfg && cfg != CONFIG_STATUS_FILEUNCHANGED && cfg != CONFIG_STATUS_FILEINVALID) {
@@ -283,7 +285,9 @@ static int load_module(void)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (dsn) {
ast_verb(11, "cdr_odbc: free dsn\n");

View File

@@ -436,7 +436,10 @@ static void empty_columns(void)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
ast_cli_unregister_multiple(cdr_pgsql_status_cli, ARRAY_LEN(cdr_pgsql_status_cli));
PQfinish(conn);

View File

@@ -230,7 +230,10 @@ return_cleanup:
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (rh) {
rc_destroy(rh);
rh = NULL;

View File

@@ -191,7 +191,10 @@ static int sqlite_log(struct ast_cdr *cdr)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (db) {
sqlite_close(db);
}

View File

@@ -289,7 +289,9 @@ static int write_cdr(struct ast_cdr *cdr)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
free_config(0);

View File

@@ -235,7 +235,9 @@ static int load_config(int reload)
static int unload_module(void)
{
ast_cdr_unregister(name);
if (ast_cdr_unregister(name)) {
return -1;
}
if (AST_RWLIST_WRLOCK(&sinks)) {
ast_cdr_register(name, ast_module_info->description, syslog_log);

View File

@@ -443,6 +443,10 @@ failed:
static int tds_unload_module(void)
{
if (ast_cdr_unregister(name)) {
return -1;
}
if (settings) {
ast_mutex_lock(&tds_lock);
mssql_disconnect();
@@ -452,8 +456,6 @@ static int tds_unload_module(void)
ast_free(settings);
}
ast_cdr_unregister(name);
dbexit();
return 0;