[OpenSER-Devel] concurrency issues in lcr
Dan Pascu
dan at ag-projects.com
Fri May 16 07:51:20 CEST 2008
This line in reload_gws() is not atomic:
(*lcrs_ws_reload_counter)++;
An atomic counter should be used for that, otherwise the value of
lcrs_ws_reload_counter may end up with the wrong value if 2 concurrent
processes modify it in a narrow time window.
The same is true for the lines above that:
if (*lcrs == lcrs_1) {
lcrs_2[i].end_record = 1;
*lcrs = lcrs_2;
} else {
lcrs_1[i].end_record = 1;
*lcrs = lcrs_1;
}
and the similar lines for gateways:
if (*gws == gws_1) {
gws_2[i].ip_addr = 0;
*gws = gws_2;
} else {
gws_1[i].ip_addr = 0;
*gws = gws_1;
}
Without locking the wrong table pointer could end up in lcrs and gws, or
even worse, mixed lcr and gw table pointers. The whole lcr reload
mechanism is very fragile in this regard if concurrent lcr_reload
commands arrive in narrow time intervals, even though it appears to make
provisions to be able to do 2 reloads in a narrow time window.
IMO all 3 operations presented above should be done together under a lock.
Even better a more robust reload mechanism should be implemented, because
it's very difficult to prevent a provisioning system from issuing the
reload lcr command multiple times when the provisioning interface allows
concurrent access to its resources.
--
Dan
More information about the Devel
mailing list