aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Sperling <ssperling@sysmocom.de>2018-01-22 17:31:20 +0100
committerHarald Welte <laforge@gnumonks.org>2018-01-25 20:30:40 +0000
commit14e051776fe07cbc7f9c5775ea62f04fe79bd357 (patch)
tree571c87eeb7957b28018a67fd713898758423e86c
parent1e67fea7ba5c6336066b78f98a28ab33b05c36c4 (diff)
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
-rw-r--r--include/osmocom/msc/db.h1
-rw-r--r--src/libmsc/db.c58
-rw-r--r--src/libmsc/sms_queue.c3
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;
}