aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whyte <keith@rhizomatica.org>2022-06-18 03:22:18 +0100
committerKeith Whyte <keith@rhizomatica.org>2023-11-23 21:02:20 +0000
commit4e15ba1d9f966638be1a565645a7d1499a711c5f (patch)
tree2fa97b4500b5dda4887c258092395492a1d7722b
parent37118e85d76d820d42fbc6bbe52746b7c23a28f6 (diff)
Add VTY command for SMS queue trigger holdoff
There are various places in the code that retrigger the SMS -> In Memory pending queue mechanism. The default was to trigger the queue in one second, which could result in running the queue every second. This parameter can ease the queue run interval in case one second is causing too much load. Sms _SHOULD_ be delivered anyway without these queue runs, due to for example, MS becoming available or due to being notified by the call back of a new SMS. Change-Id: I43d88342436d654afd6d955e304e7f85fbc4840f
-rw-r--r--include/osmocom/msc/sms_queue.h1
-rw-r--r--src/libmsc/sms_queue.c19
-rw-r--r--src/libmsc/smsc_vty.c10
-rw-r--r--tests/test_nodes.vty1
4 files changed, 28 insertions, 3 deletions
diff --git a/include/osmocom/msc/sms_queue.h b/include/osmocom/msc/sms_queue.h
index e4b2a120d..9ada52571 100644
--- a/include/osmocom/msc/sms_queue.h
+++ b/include/osmocom/msc/sms_queue.h
@@ -32,6 +32,7 @@ struct sms_queue_config {
bool delete_expired; /* delete expired SMS from DB? */
unsigned int minimum_validity_mins; /* minimum validity period in minutes */
unsigned int default_validity_mins; /* default validity period in minutes */
+ unsigned int trigger_holdoff; /* How often can the queue be re-triggered? */
};
struct sms_queue_config *sms_queue_cfg_alloc(void *ctx);
diff --git a/src/libmsc/sms_queue.c b/src/libmsc/sms_queue.c
index d1edd3895..211b0bd2a 100644
--- a/src/libmsc/sms_queue.c
+++ b/src/libmsc/sms_queue.c
@@ -428,14 +428,26 @@ static void sms_send_next(struct vlr_subscr *vsub)
_gsm411_send_sms(smsq->network, sms->receiver, sms);
}
-/* Trigger a call to sms_submit_pending() in one second */
+/* Trigger a call to sms_submit_pending() in x seconds */
int sms_queue_trigger(struct gsm_sms_queue *smsq)
{
+ struct timeval tv;
+
LOGP(DLSMS, LOGL_DEBUG, "Triggering SMS queue\n");
- if (osmo_timer_pending(&smsq->push_queue))
+ if (osmo_timer_pending(&smsq->push_queue)) {
+ if (osmo_timer_remaining(&smsq->push_queue, NULL, &tv) == -1)
+ return 0;
+ if (tv.tv_sec > smsq->cfg->trigger_holdoff) {
+ /* Config has changed since last trigger, reschedule */
+ osmo_timer_schedule(&smsq->push_queue, smsq->cfg->trigger_holdoff, 0);
+ return 0;
+ }
+ LOGP(DLSMS, LOGL_INFO, "SMS queue already set to run in %lu seconds.\n",
+ tv.tv_sec);
return 0;
+ }
- osmo_timer_schedule(&smsq->push_queue, 1, 0);
+ osmo_timer_schedule(&smsq->push_queue, smsq->cfg->trigger_holdoff, 0);
return 0;
}
@@ -451,6 +463,7 @@ struct sms_queue_config *sms_queue_cfg_alloc(void *ctx)
sqcfg->delete_expired = true;
sqcfg->default_validity_mins = 7 * 24 * 60; /* 7 days */
sqcfg->minimum_validity_mins = 1;
+ sqcfg->trigger_holdoff = 1;
sqcfg->db_file_path = talloc_strdup(ctx, SMS_DEFAULT_DB_FILE_PATH);
return sqcfg;
diff --git a/src/libmsc/smsc_vty.c b/src/libmsc/smsc_vty.c
index f30907f4b..48ab3d59e 100644
--- a/src/libmsc/smsc_vty.c
+++ b/src/libmsc/smsc_vty.c
@@ -60,6 +60,14 @@ DEFUN(cfg_sms_database, cfg_sms_database_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_sms_trigger_holdoff, cfg_sms_trigger_holdoff_cmd,
+ "queue trigger-holdoff <1-600>",
+ "SMS Queue\n" "How often can the Queue be re-triggered.\n" "Seconds\n")
+{
+ smqcfg->trigger_holdoff = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_sms_queue_max, cfg_sms_queue_max_cmd,
"queue max-pending <1-500>",
"SMS Queue\n" "SMS to deliver in parallel\n" "Amount\n")
@@ -175,6 +183,7 @@ static int config_write_smsc(struct vty *vty)
if (smqcfg->db_file_path && strcmp(smqcfg->db_file_path, SMS_DEFAULT_DB_FILE_PATH))
vty_out(vty, " database %s%s", smqcfg->db_file_path, VTY_NEWLINE);
+ vty_out(vty, " queue trigger-holdoff %u%s", smqcfg->trigger_holdoff, VTY_NEWLINE);
vty_out(vty, " queue max-pending %u%s", smqcfg->max_pending, VTY_NEWLINE);
vty_out(vty, " queue max-failure %u%s", smqcfg->max_fail, VTY_NEWLINE);
@@ -197,6 +206,7 @@ void smsc_vty_init(struct gsm_network *msc_network)
install_element(CONFIG_NODE, &cfg_smsc_cmd);
install_node(&smsc_node, config_write_smsc);
install_element(SMSC_NODE, &cfg_sms_database_cmd);
+ install_element(SMSC_NODE, &cfg_sms_trigger_holdoff_cmd);
install_element(SMSC_NODE, &cfg_sms_queue_max_cmd);
install_element(SMSC_NODE, &cfg_sms_queue_fail_cmd);
install_element(SMSC_NODE, &cfg_sms_db_del_delivered_cmd);
diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty
index a1c443589..11f3921af 100644
--- a/tests/test_nodes.vty
+++ b/tests/test_nodes.vty
@@ -176,6 +176,7 @@ sgs
local-ip 0.0.0.0
vlr-name vlr.example.net
smsc
+ queue trigger-holdoff 1
queue max-pending 20
queue max-failure 1
database delete-delivered 1