From 14e051776fe07cbc7f9c5775ea62f04fe79bd357 Mon Sep 17 00:00:00 2001 From: Stefan Sperling Date: Mon, 22 Jan 2018 17:31:20 +0100 Subject: Delete expired SMS automatically. Delete expired SMS whenever we are done processing an SMS-related signal. In order to minimize additional latency only one SMS is removed at a time. Change-Id: I56cbe716e52b679c4b94f6cbb4a171306975be2e Related: OS#2354 --- include/osmocom/msc/db.h | 1 + src/libmsc/db.c | 58 ++++++++++++++++++++++++++++++++++++------------ src/libmsc/sms_queue.c | 3 +++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/include/osmocom/msc/db.h b/include/osmocom/msc/db.h index 2105d38da..a1de7d631 100644 --- a/include/osmocom/msc/db.h +++ b/include/osmocom/msc/db.h @@ -51,6 +51,7 @@ int db_sms_inc_deliver_attempts(struct gsm_sms *sms); int db_sms_delete_by_msisdn(const char *msisdn); int db_sms_delete_sent_message_by_id(unsigned long long sms_id); int db_sms_delete_expired_message_by_id(unsigned long long sms_id); +void db_sms_delete_oldest_expired_message(void); /* Statistics counter storage */ struct osmo_counter; diff --git a/src/libmsc/db.c b/src/libmsc/db.c index c21aa7026..db9989dc8 100644 --- a/src/libmsc/db.c +++ b/src/libmsc/db.c @@ -989,22 +989,11 @@ int db_sms_delete_sent_message_by_id(unsigned long long sms_id) return 0; } -int db_sms_delete_expired_message_by_id(unsigned long long sms_id) + +static int delete_expired_sms(unsigned long long sms_id, time_t created, time_t validity_timestamp) { dbi_result result; - time_t created, validity_timestamp, now, min_created; - - result = dbi_conn_queryf(conn, "SELECT created,valid_until FROM SMS WHERE id = %llu", sms_id); - if (!result) - return -1; - if (!next_row(result)) { - dbi_result_free(result); - return -1; - } - - created = dbi_result_get_datetime(result, "created"); - validity_timestamp = dbi_result_get_datetime(result, "valid_until"); - dbi_result_free(result); + time_t now, min_created; now = time(NULL); if (validity_timestamp > now) @@ -1026,6 +1015,47 @@ int db_sms_delete_expired_message_by_id(unsigned long long sms_id) return 0; } +int db_sms_delete_expired_message_by_id(unsigned long long sms_id) +{ + dbi_result result; + time_t created, validity_timestamp; + + result = dbi_conn_queryf(conn, "SELECT created,valid_until FROM SMS WHERE id = %llu", sms_id); + if (!result) + return -1; + if (!next_row(result)) { + dbi_result_free(result); + return -1; + } + + created = dbi_result_get_datetime(result, "created"); + validity_timestamp = dbi_result_get_datetime(result, "valid_until"); + + dbi_result_free(result); + return delete_expired_sms(sms_id, created, validity_timestamp); +} + +void db_sms_delete_oldest_expired_message(void) +{ + dbi_result result; + + result = dbi_conn_queryf(conn, "SELECT id,created,valid_until FROM SMS ORDER BY created LIMIT 1"); + if (!result) + return; + + if (next_row(result)) { + unsigned long long sms_id; + time_t created, validity_timestamp; + + sms_id = dbi_result_get_ulonglong(result, "id"); + created = dbi_result_get_datetime(result, "created"); + validity_timestamp = dbi_result_get_datetime(result, "valid_until"); + delete_expired_sms(sms_id, created, validity_timestamp); + } + + dbi_result_free(result); +} + int db_store_counter(struct osmo_counter *ctr) { dbi_result result; diff --git a/src/libmsc/sms_queue.c b/src/libmsc/sms_queue.c index 193d0230f..163d4c722 100644 --- a/src/libmsc/sms_queue.c +++ b/src/libmsc/sms_queue.c @@ -529,6 +529,9 @@ static int sms_sms_cb(unsigned int subsys, unsigned int signal, sig_sms->paging_result); } + /* While here, attempt to remove an expired SMS from the DB. */ + db_sms_delete_oldest_expired_message(); + return 0; } -- cgit v1.2.3