summaryrefslogtreecommitdiff
path: root/cdr
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2013-10-27 20:04:17 +0000
committerMatthew Jordan <mjordan@digium.com>2013-10-27 20:04:17 +0000
commit3713fa5c9f9bab64f21a3602c4a201bcb2458084 (patch)
tree14a82dae119e398850640e050a97801bcffd3d96 /cdr
parent2e24dfe4d1c44f978607aaee80225db8e18967fc (diff)
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
Diffstat (limited to 'cdr')
-rw-r--r--cdr/cdr_adaptive_odbc.c5
-rw-r--r--cdr/cdr_csv.c5
-rw-r--r--cdr/cdr_custom.c4
-rw-r--r--cdr/cdr_manager.c24
-rw-r--r--cdr/cdr_odbc.c8
-rw-r--r--cdr/cdr_pgsql.c5
-rw-r--r--cdr/cdr_radius.c5
-rw-r--r--cdr/cdr_sqlite.c5
-rw-r--r--cdr/cdr_sqlite3_custom.c4
-rw-r--r--cdr/cdr_syslog.c4
-rw-r--r--cdr/cdr_tds.c6
11 files changed, 56 insertions, 19 deletions
diff --git a/cdr/cdr_adaptive_odbc.c b/cdr/cdr_adaptive_odbc.c
index 0a9cfdbdd..4078b79ba 100644
--- a/cdr/cdr_adaptive_odbc.c
+++ b/cdr/cdr_adaptive_odbc.c
@@ -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");
diff --git a/cdr/cdr_csv.c b/cdr/cdr_csv.c
index a6f8a4dc0..1cc1747c6 100644
--- a/cdr/cdr_csv.c
+++ b/cdr/cdr_csv.c
@@ -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;
}
diff --git a/cdr/cdr_custom.c b/cdr/cdr_custom.c
index 2a3b1a1dd..51235db7f 100644
--- a/cdr/cdr_custom.c
+++ b/cdr/cdr_custom.c
@@ -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);
diff --git a/cdr/cdr_manager.c b/cdr/cdr_manager.c
index e3ae7a57d..90c5dbd23 100644
--- a/cdr/cdr_manager.c
+++ b/cdr/cdr_manager.c
@@ -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;
}
diff --git a/cdr/cdr_odbc.c b/cdr/cdr_odbc.c
index 022d75210..be07a8a56 100644
--- a/cdr/cdr_odbc.c
+++ b/cdr/cdr_odbc.c
@@ -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");
diff --git a/cdr/cdr_pgsql.c b/cdr/cdr_pgsql.c
index dc73de477..6ac389788 100644
--- a/cdr/cdr_pgsql.c
+++ b/cdr/cdr_pgsql.c
@@ -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);
diff --git a/cdr/cdr_radius.c b/cdr/cdr_radius.c
index 2bf2002fe..1466808d5 100644
--- a/cdr/cdr_radius.c
+++ b/cdr/cdr_radius.c
@@ -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;
diff --git a/cdr/cdr_sqlite.c b/cdr/cdr_sqlite.c
index 46aa42bb1..884837c16 100644
--- a/cdr/cdr_sqlite.c
+++ b/cdr/cdr_sqlite.c
@@ -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);
}
diff --git a/cdr/cdr_sqlite3_custom.c b/cdr/cdr_sqlite3_custom.c
index 601234604..83dac6a5d 100644
--- a/cdr/cdr_sqlite3_custom.c
+++ b/cdr/cdr_sqlite3_custom.c
@@ -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);
diff --git a/cdr/cdr_syslog.c b/cdr/cdr_syslog.c
index dec4d65e9..de8cae4ec 100644
--- a/cdr/cdr_syslog.c
+++ b/cdr/cdr_syslog.c
@@ -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);
diff --git a/cdr/cdr_tds.c b/cdr/cdr_tds.c
index aef57b55d..5a1312ecc 100644
--- a/cdr/cdr_tds.c
+++ b/cdr/cdr_tds.c
@@ -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;