[OpenSIPS-Users] [NEW] OpenSIPS script locks

Ovidiu Sas osas at voipembedded.com
Wed Nov 28 16:59:18 CET 2012


Hello Liviu,

Thank you for this new feature!

Regards,
Ovidiu Sas

On Wed, Nov 28, 2012 at 10:02 AM, Liviu Chircu <liviu at opensips.org> wrote:
>
> The cfgutils module now provides the possibility of defining atomic
> test-and-set operations in the OpenSIPS script.
> Such need is a result of complex mixing in script of various
> functionality / functions from different modules. Like testing
> is done based on ratelimit module and the setting is done in
> dialog module.
>
> Modules do provide internal locking and synchronization for their
> own functionalities, but cannot cover a more complex and various
> scenarios of test-and-set scripting scenarios.
>
> Example of scenarios which require atomic test-and-set functionalities:
>
> ###########
> # Example 1: Counting active outgoing calls with dialog
> # The F-URIs of the SIP messages are the same
> #
> # Suppose there are 0 active calls
>
> get_profile_size("caller", "$fu", "$avp(size)");
>
> if ($avp(size) < 1) {
>     xlog("Call allowed!\n");
>     set_dlg_profile("caller", "$fu");
>     ...
> } else {
>     xlog("Too many calls!\n");
>     ...
> }
>
> Possible correct result (profile will have size 1):
> Call allowed!
> Too many calls!
>
> Possible bad result (profile will have size 2):
> Call allowed!
> Call allowed!
>
>
> If two or more processes read the same value from get_profile_size(),
> results may be incorrect. By using dynamic script locks, the problem is
> solved:
>
> get_dynamic_lock("$fu");
>
> get_profile_size("caller", "$fu", "$avp(size)");
>
> if ($avp(size) < 10) {
>     xlog("Call allowed!\n");
>     set_dlg_profile("caller", "$fu");
>     ...
> } else {
>     xlog("Too many calls!\n");
>     ...
> }
>
> release_dynamic_lock("$fu");
>
> ###########
> # Example 2: Counting registered users using cachedb_local
> # In this educational example, two users register at the same time
> #
> # Suppose there are 10 registered users
>
> cache_counter_fetch("local", "registered_users", "$avp(reg_users)");
> $avp(reg_users) = $avp(reg_users) + 1;
> cache_store("local", "registered_users", "$avp(reg_users)", 1200);
>
> xlog("System has $avp(reg_users) registered users!\n");
>
>
> Possible correct result:
> System has 11 registered users!
> System has 12 registered users!
>
> Possible bad result:
> System has 11 registered users!
> System has 11 registered users!
>
>
> The same thing as above. A sequence of two operations which should not
> be atomic from an internal point of view, but from a logical perspective
> it should. In order for the code to work properly, we can use static locks:
>
> get_static_lock("reg_users");
>
> cache_counter_fetch("local", "registered_users", "$avp(reg_users)");
> $avp(reg_users) = $avp(reg_users) + 1;
> cache_store("local", "registered_users", "$avp(reg_users)", 1200);
>
> release_static_lock("reg_users");
>
> xlog("System has $avp(reg_users) registered users!\n");
>
> --
> Liviu Chircu
> OpenSIPS Dev
> http://www.opensips-solutions.com
>
>
>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users



-- 
VoIP Embedded, Inc.
http://www.voipembedded.com



More information about the Users mailing list