This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Keith Whyte gerrit-no-reply at lists.osmocom.orgHello Jenkins Builder,
I'd like you to reexamine a change. Please visit
https://gerrit.osmocom.org/3910
to look at the new patch set (#5).
libmsc: db_subscriber_alloc_exten() remove infinite loop
This patch prevents entering an infinite loop in the
case that you actually have exhasuted all available
extensions.
FIXME: How best to check for free extensions in the pool.
TODO: If there is no extension available, then do not
create the subscriber.
Change-Id: Icf0f1e5a7f360bc27592a55890f74a9a12bc9f42
---
M openbsc/src/libmsc/db.c
1 file changed, 43 insertions(+), 5 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/openbsc refs/changes/10/3910/5
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c
index 4ba12ca..7439313 100644
--- a/openbsc/src/libmsc/db.c
+++ b/openbsc/src/libmsc/db.c
@@ -1407,19 +1407,49 @@
return 0;
}
+uint64_t extension_alloc(uint64_t smin, uint64_t smax) {
+ return smin + (rand() % (smax - smin));
+}
+
int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber, uint64_t smin,
uint64_t smax)
{
dbi_result result = NULL;
- uint64_t try;
+ uint64_t try = NULL;
+ unsigned long long total;
+ int i;
+ int available;
- for (;;) {
- try = (rand() % (smax - smin + 1) + smin);
+ result = dbi_conn_query(conn,
+ "SELECT count(*) AS total FROM Subscriber "
+ "WHERE extension IS NOT NULL");
+
+ if (!result) {
+ LOGP(DDB, LOGL_ERROR, "Failed to get subscriber count "
+ "while allocating new extension.\n");
+ return 1;
+ }
+
+ dbi_result_next_row(result);
+ total = dbi_result_get_ulonglong(result, "total");
+ available = smax - smin - total;
+
+ if (available < 0) {
+ LOGP(DDB, LOGL_ERROR, "Only %d/%llu extensions available\n", available, total);
+ return 1;
+ }
+
+ for (i = 0; i < (smax - smin)*2; i++) {
+
+ if (!(i % 100) || try > smax) {
+ try = extension_alloc(smin, smax);
+ }
+
result = dbi_conn_queryf(conn,
"SELECT * FROM Subscriber "
"WHERE extension = %"PRIu64,
- try
- );
+ try);
+
if (!result) {
LOGP(DDB, LOGL_ERROR, "Failed to query Subscriber "
"while allocating new extension.\n");
@@ -1427,6 +1457,7 @@
}
if (dbi_result_get_numrows(result)){
dbi_result_free(result);
+ try++;
continue;
}
if (!dbi_result_next_row(result)) {
@@ -1435,6 +1466,13 @@
}
dbi_result_free(result);
}
+
+ if (i > (smax - smin)*2 ) {
+ DEBUGP(DDB, "Out of Loop, no extension available for IMSI %s.\n",
+ subscriber->imsi);
+ return 1;
+ }
+
sprintf(subscriber->extension, "%"PRIu64, try);
DEBUGP(DDB, "Allocated extension %"PRIu64 " for IMSI %s.\n", try, subscriber->imsi);
return db_sync_subscriber(subscriber);
--
To view, visit https://gerrit.osmocom.org/3910
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Icf0f1e5a7f360bc27592a55890f74a9a12bc9f42
Gerrit-PatchSet: 5
Gerrit-Project: openbsc
Gerrit-Branch: master
Gerrit-Owner: Keith Whyte <keith at rhizomatica.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Keith Whyte <keith at rhizomatica.org>
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Pablo Neira Ayuso <pablo at gnumonks.org>