Re: [OpenSIPS-Devel] [OpenSIPS-Users] Asynchronous processing in OpenSIPS 1.12

2014-09-03 Thread Bogdan-Andrei Iancu

Brett,

The timeout for the async ops will be control by the reactor (like 
triggering the timouts) and set by the module starting the op - like the 
rest_client module will set the timeout for the HTTP rest queries.


The processes are not suspended, just the context of an execution. So at 
the end is just about memory - of course there should be a safety net to 
limit the number of suspended async I/Os per type of I/O. Each type of 
I/O op will have a priority in relation to other I/O ops (like timer 
jobs higher than aysnc resume, async resume higher than reading from 
network).


An async I/O is done during handling a SIP message, so it does not 
interfere with TM timers (which are activated only when sending the 
traffic out). otherwise the dialogs and transactions (with their 
eco-system) are not affected at all.


Regards,

Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
http://www.opensips-solutions.com

On 02.09.2014 19:53, Brett Nemeroff wrote:

I'm curious what the failure cases look like here..
What happens when your long running db query is excessively long? Is 
there a timeout? What happens if you have 1000s of backed up 
processes. Would love to see some sort of fifo command somehow 
quantify the effectiveness of it being async. Not sure how to say this 
right. But I'd like to be able to query a value that says either bg 
tasks are being handled in a timely fashion or bg tasks are so slow 
it's starting to affect performance


Of course, these are not normal cases... wondering how graceful we 
can allow it to be broken. I assume that the context saving will take 
X memory and eventually it will fill up? Where is that memory stored? 
How is it allocated? How much memory do you need for each backgrounded 
task?


Another thought..  how are dialog/transaction variables handled? 
AVPs? vars? How are dialogs handled across such an operation? What 
about standard (SIP) timer operations? What about dialog fr_timer and 
fr_inv_timer, do they continue to run?


Thanks, really looking forward to async!
-Brett



On Tue, Sep 2, 2014 at 11:26 AM, Răzvan Crainea raz...@opensips.org 
mailto:raz...@opensips.org wrote:


Hi all,

Among the last discussion of the last IRC meeting[1] was related
to Asynchronous processing in OpenSIPS script - we want to add a
new mechanism that allows you to perform asynchronous operations
(such as DB , REST or exec operations) directly from the script.
Using this feature will increase the throughput of OpenSIPS, since
the SIP processes will no longer be stuck waiting for I/O responses.

When reaching an asynchronous operation, the SIP message
processing will be stopped, and resumed in a different script
route. In the script, this should be reflected something like this:

route {
...
# other non I/O operations
async(my_resume_route) {
avp_db_query(SELECT setid from subscribers where username
= '$fU', $avp(setid));
}
# we never get here.
exit;
}

route[my_resume_route] {
xlog(The set used by the callee is $avp(setid)\n);
# continue message processing
}

Only the functions that are used in an async block will be ran
asynchronously. If the function does not support async processing,
it will block waiting for the response and resume in the route
indicated by the async block - so the scripting experience will
be the same even if the async OP could not be done.
In order to resume the processing in a different route, we need to
store a context of the message. This will be done using the
transaction module[2]. If this module is not used, the
asynchronous mechanism will not work.

lirakis suggested to have different processes that waits for the
asynchronous I/O responses and continues the processing. However,
we think having the SIP worker processes resume the operations
will behave better, since we'll have fewer processes and we won't
loose time with context switches.

How do you see this feature? How would you like to use it? Feel
free to contribute with any input you find suitable!

[1] http://www.opensips.org/Community/IRCmeeting20140827
[2] http://www.opensips.org/html/docs/modules/1.12.x/tm

Best regards,

-- 
Răzvan Crainea

OpenSIPS Solutions
www.opensips-solutions.com http://www.opensips-solutions.com


___
Users mailing list
us...@lists.opensips.org mailto:us...@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users




___
Users mailing list
us...@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users


___
Devel mailing list
Devel@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel


Re: [OpenSIPS-Devel] [OpenSIPS-Users] Asynchronous processing in OpenSIPS 1.12

2014-09-03 Thread Bogdan-Andrei Iancu

On 03.09.2014 12:06, Saúl Ibarra Corretgé wrote:

On 02 Sep 2014, at 18:26, Răzvan Crainea raz...@opensips.org wrote:


Hi all,

Among the last discussion of the last IRC meeting[1] was related to 
Asynchronous processing in OpenSIPS script - we want to add a new mechanism 
that allows you to perform asynchronous operations (such as DB , REST or exec 
operations) directly from the script. Using this feature will increase the 
throughput of OpenSIPS, since the SIP processes will no longer be stuck waiting 
for I/O responses.

When reaching an asynchronous operation, the SIP message processing will be 
stopped, and resumed in a different script route. In the script, this should be 
reflected something like this:

route {
...
# other non I/O operations
async(my_resume_route) {
avp_db_query(SELECT setid from subscribers where username = '$fU', 
$avp(setid));
}
# we never get here.
exit;
}

route[my_resume_route] {
xlog(The set used by the callee is $avp(setid)\n);
# continue message processing
}

Only the functions that are used in an async block will be ran asynchronously. If the 
function does not support async processing, it will block waiting for the response and resume in 
the route indicated by the async block - so the scripting experience will be the same 
even if the async OP could not be done.

I find this quite problematic. How does John Doe know a function supports async 
or not? Maybe the configuration checker can know this and not let OpenSIPS 
start if you are doing it wrong? Alternatively, blocking functions could be ran 
in a thread pool thus giving the illusion of them being async.
First of all, the function will be documented as supporting Async and 
the script parser may check it (we will export some extra flags for the 
function to say it can do async).


Secondly, the script will allow you to use any combination of functions 
and script macro - I mean the script will allow you to use an async 
function in a non-async way (and the function will act as sync) or to 
use a non-async function in an async way (the function will act as async 
and with a jump to resume route).


Regards,
Bogdan

___
Devel mailing list
Devel@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel


Re: [OpenSIPS-Devel] [OpenSIPS-Users] Asynchronous processing in OpenSIPS 1.12

2014-09-03 Thread Saúl Ibarra Corretgé

On 03 Sep 2014, at 11:59, Bogdan-Andrei Iancu bog...@opensips.org wrote:

 On 03.09.2014 12:06, Saúl Ibarra Corretgé wrote:
 On 02 Sep 2014, at 18:26, Răzvan Crainea raz...@opensips.org wrote:
 
 Hi all,
 
 Among the last discussion of the last IRC meeting[1] was related to 
 Asynchronous processing in OpenSIPS script - we want to add a new mechanism 
 that allows you to perform asynchronous operations (such as DB , REST or 
 exec operations) directly from the script. Using this feature will increase 
 the throughput of OpenSIPS, since the SIP processes will no longer be stuck 
 waiting for I/O responses.
 
 When reaching an asynchronous operation, the SIP message processing will be 
 stopped, and resumed in a different script route. In the script, this 
 should be reflected something like this:
 
 route {
...
# other non I/O operations
async(my_resume_route) {
avp_db_query(SELECT setid from subscribers where username = '$fU', 
 $avp(setid));
}
# we never get here.
exit;
 }
 
 route[my_resume_route] {
xlog(The set used by the callee is $avp(setid)\n);
# continue message processing
 }
 
 Only the functions that are used in an async block will be ran 
 asynchronously. If the function does not support async processing, it will 
 block waiting for the response and resume in the route indicated by the 
 async block - so the scripting experience will be the same even if the 
 async OP could not be done.
 I find this quite problematic. How does John Doe know a function supports 
 async or not? Maybe the configuration checker can know this and not let 
 OpenSIPS start if you are doing it wrong? Alternatively, blocking functions 
 could be ran in a thread pool thus giving the illusion of them being async.
 First of all, the function will be documented as supporting Async and the 
 script parser may check it (we will export some extra flags for the function 
 to say it can do async).
 
 Secondly, the script will allow you to use any combination of functions and 
 script macro - I mean the script will allow you to use an async function in a 
 non-async way (and the function will act as sync) or to use a non-async 
 function in an async way (the function will act as async and with a jump to 
 resume route).
 

My concern is with that last part: if a function which doesn’t support async is 
called within an async block it will block but then make the jump thus 
deceiving the user into believing it was async when it isn’t. We need to fail 
loudly and tell users they are doing it wrong, iMHO.


Regards,

--
Saúl Ibarra Corretgé
AG Projects





signature.asc
Description: Message signed with OpenPGP using GPGMail
___
Devel mailing list
Devel@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel


Re: [OpenSIPS-Devel] [OpenSIPS-Users] Asynchronous processing in OpenSIPS 1.12

2014-09-03 Thread Saúl Ibarra Corretgé
 
 My concern is with that last part: if a function which doesn’t support async 
 is called within an async block it will block but then make the jump thus 
 deceiving the user into believing it was async when it isn’t. We need to 
 fail loudly and tell users they are doing it wrong, iMHO.
 Of course, we can detect that at script parsing and decide how to handle it:
- ignore and do it blocking
- warning and do it blocking
- error and do not start.
 

I’d say we shouldn’t start :-)


Regards,

--
Saúl Ibarra Corretgé
AG Projects





signature.asc
Description: Message signed with OpenPGP using GPGMail
___
Devel mailing list
Devel@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel


Re: [OpenSIPS-Devel] [OpenSIPS-Users] Asynchronous processing in OpenSIPS 1.12

2014-09-03 Thread Bogdan-Andrei Iancu

On 03.09.2014 14:43, Saúl Ibarra Corretgé wrote:

My concern is with that last part: if a function which doesn’t support async is 
called within an async block it will block but then make the jump thus 
deceiving the user into believing it was async when it isn’t. We need to fail 
loudly and tell users they are doing it wrong, iMHO.

Of course, we can detect that at script parsing and decide how to handle it:
- ignore and do it blocking
- warning and do it blocking
- error and do not start.


I’d say we shouldn’t start :-)

I will keep that in mind ;)

___
Devel mailing list
Devel@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/devel