Queue the specific SMS, Don't just run the queue on SMS_SUBMITED

Running the queue is not good enough, as only some few SMS for unattached subs will stop
the db routine from reaching the new message.
This commit is contained in:
Keith Whyte 2022-06-11 02:34:21 +01:00
parent 52d3935d46
commit f4bbd22912
3 changed files with 48 additions and 3 deletions

View File

@ -86,4 +86,6 @@ struct sms_signal_data {
struct gsm_sms *sms;
/* true when paging was successful */
bool paging_result;
/* the id of the last inserted SMS */
unsigned long long id;
};

View File

@ -301,6 +301,8 @@ int handle_smpp_submit(struct osmo_esme *esme, struct submit_sm_t *submit,
case 1: /* datagram */
case 3: /* store-and-forward */
rc = db_sms_store(sms);
memset(&sig, 0, sizeof(sig));
sig.id = sms->id;
sms_free(sms);
sms = NULL;
if (rc < 0) {
@ -312,7 +314,10 @@ int handle_smpp_submit(struct osmo_esme *esme, struct submit_sm_t *submit,
strcpy((char *)submit_r->message_id, "msg_id_not_implemented");
LOGP(DLSMS, LOGL_INFO, "SMPP SUBMIT-SM: Stored in DB\n");
memset(&sig, 0, sizeof(sig));
/* We have stored the new SMS in the db, so now we signal the
* queue to run, but this is not good enough, as the queue may well
* not pick up this new SMS on the next run, if there are sufficient
* older messages in the queue. */
osmo_signal_dispatch(SS_SMS, S_SMS_SUBMITTED, &sig);
rc = 0;
break;

View File

@ -585,10 +585,48 @@ static int sms_sms_cb(unsigned int subsys, unsigned int signal,
struct sms_signal_data *sig_sms = signal_data;
struct gsm_sms_pending *pending;
struct vlr_subscr *vsub;
struct gsm_sms *sms;
/* We got a new SMS and maybe should launch the queue again. */
if (signal == S_SMS_SUBMITTED || signal == S_SMS_SMMA) {
/* TODO: For SMMA we might want to re-use the radio connection. */
if (signal == S_SMS_SUBMITTED) {
if (sig_sms->id) {
LOGP(DLSMS, LOGL_INFO, "Got Signal for new Sms Submitted with id [%llu]\n",
sig_sms->id);
sms = db_sms_get(network, sig_sms->id);
if (!sms)
return -1;
if (!sms->receiver || !sms->receiver->lu_complete) {
LOGP(DLSMS, LOGL_DEBUG,
"Subscriber %s%s is not attached, skipping SMS.\n",
sms->receiver ? "" : "MSISDN-",
sms->receiver ? vlr_subscr_msisdn_or_name(sms->receiver) : sms->dst.addr);
return -1;
}
/* Check somehow it's not already in the pending list */
if (sms_queue_sms_is_pending(smq, sms->id)) {
sms_free(sms);
return 0;
}
/* Or that this sub is not already pending */
if (sms_subscriber_is_pending(smq, sms->receiver)) {
sms_free(sms);
return 0;
}
/* Now add this SMS to the Queue for immediate sending. */
pending = sms_pending_from(smq, sms);
sms_free(sms);
/* Schedule the timer to send this SMS */
sms_pending_resend(pending);
return 0;
}
}
if (signal == S_SMS_SMMA) {
/* TODO: For SMMA we might want to re-use the radio connection.
* Here, also, we really want to queue specifically for this MS, because
* just running the queue may not pick up its messages. */
sms_queue_trigger(smq);
return 0;
}