[sr-dev] git:5.2:75fdcec6: dispatcher: sync on load management operations
Henning Westerholt
hw at skalatan.de
Sun Jun 7 11:21:51 CEST 2020
Module: kamailio
Branch: 5.2
Commit: 75fdcec6241fc4439805f7781114d1f44cbe2528
URL: https://github.com/kamailio/kamailio/commit/75fdcec6241fc4439805f7781114d1f44cbe2528
Author: Henning Westerholt <hw at skalatan.de>
Committer: Henning Westerholt <hw at skalatan.de>
Date: 2020-06-07T09:16:04Z
dispatcher: sync on load management operations
- use locks to increment/decrement call load and get least loaded dst
- GH #2322
- manual backport of d14833d9d1a
---
Modified: src/modules/dispatcher/dispatch.c
---
Diff: https://github.com/kamailio/kamailio/commit/75fdcec6241fc4439805f7781114d1f44cbe2528.diff
Patch: https://github.com/kamailio/kamailio/commit/75fdcec6241fc4439805f7781114d1f44cbe2528.patch
---
diff --git a/src/modules/dispatcher/dispatch.c b/src/modules/dispatcher/dispatch.c
index 71bbb6239f..4561649ebc 100644
--- a/src/modules/dispatcher/dispatch.c
+++ b/src/modules/dispatcher/dispatch.c
@@ -79,6 +79,22 @@
#define DS_ALG_RELWEIGHT 11
#define DS_ALG_PARALLEL 12
+/* increment call load */
+#define DS_LOAD_INC(dgrp, didx) do { \
+ lock_get(&(dgrp)->lock); \
+ (dgrp)->dlist[didx].dload++; \
+ lock_release(&(dgrp)->lock); \
+ } while(0)
+
+/* decrement call load */
+#define DS_LOAD_DEC(dgrp, didx) do { \
+ lock_get(&(dgrp)->lock); \
+ if(likely((dgrp)->dlist[didx].dload > 0)) { \
+ (dgrp)->dlist[didx].dload--; \
+ } \
+ lock_release(&(dgrp)->lock); \
+ } while(0)
+
static int _ds_table_version = DS_TABLE_VERSION;
static ds_ht_t *_dsht_load = NULL;
@@ -1484,6 +1500,7 @@ int ds_get_leastloaded(ds_set_t *dset)
k = -1;
t = 0x7fffffff; /* high load */
+ lock_get(&dset->lock); \
for(j = 0; j < dset->nr; j++) {
if(!ds_skip_dst(dset->dlist[j].flags)
&& (dset->dlist[j].attrs.maxload == 0
@@ -1495,6 +1512,7 @@ int ds_get_leastloaded(ds_set_t *dset)
}
}
}
+ lock_release(&dset->lock); \
return k;
}
@@ -1516,7 +1534,7 @@ int ds_load_add(struct sip_msg *msg, ds_set_t *dset, int setid, int dst)
msg->callid->body.s);
return -1;
}
- dset->dlist[dst].dload++;
+ DS_LOAD_INC(dset, dst);
return 0;
}
@@ -1584,8 +1602,7 @@ int ds_load_replace(struct sip_msg *msg, str *duid)
ds_unlock_cell(_dsht_load, &msg->callid->body);
ds_del_cell(_dsht_load, &msg->callid->body);
- if(idx->dlist[olddst].dload > 0)
- idx->dlist[olddst].dload--;
+ DS_LOAD_DEC(idx, olddst);
if(ds_load_add(msg, idx, set, newdst) < 0) {
LM_ERR("unable to replace destination load [%.*s / %.*s]\n", duid->len,
@@ -1673,8 +1690,7 @@ int ds_load_remove_byid(int set, str *duid)
return -1;
}
- if(idx->dlist[olddst].dload > 0)
- idx->dlist[olddst].dload--;
+ DS_LOAD_DEC(idx, olddst);
return 0;
}
More information about the sr-dev
mailing list