diff options
author | Keith Whyte <keith@rhizomatica.org> | 2022-06-18 03:22:18 +0100 |
---|---|---|
committer | Keith Whyte <keith@rhizomatica.org> | 2023-11-23 21:02:20 +0000 |
commit | 4e15ba1d9f966638be1a565645a7d1499a711c5f (patch) | |
tree | 2fa97b4500b5dda4887c258092395492a1d7722b | |
parent | 37118e85d76d820d42fbc6bbe52746b7c23a28f6 (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.h | 1 | ||||
-rw-r--r-- | src/libmsc/sms_queue.c | 19 | ||||
-rw-r--r-- | src/libmsc/smsc_vty.c | 10 | ||||
-rw-r--r-- | tests/test_nodes.vty | 1 |
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 |