Forum Discussion
Lerna_Ekmekciog
Nimbostratus
Sep 15, 2006iControl Server Thread Safe ?
I am load testing my custom SOAP service which is a java app that sends SOAP queries to iControl SOAP server. As part of this test I send concurrent requests to iControl server. An example of this is sending n concurrent requests for getting a pool and all its fields, meaning lb method, monitor, member, from the device. However I only get one response from iControl server with the pool and all its fields correctly populated in the SOAP message. All the rest of responses contain fields with no values. That is n-1 empty responses.
When I do ssldump on the communication between the server and my app I can see that the server only sees one request to get lb method and one request to get monitor association as opposed to n requests where n is the number of concurrent requests.
I'm trying to figure out where these n requests are being multiplexed.
Is the iControl SOAP server thread safe ?
Lerna
- Our iControl server is implemented as a singleton with a single FIFO queue as an accessor. You can make parallel requests to the administration web server but it will buffer requests to only allow one at a time.
- Vladimir_Budilo
Nimbostratus
I'm encountering this issue as well. There are some inconsistencies with the f5 web service. I created a GUI that can invoke "disable/enable PoolMember" methods asynchronously and simultaneously on multiple pool members (using AJAX). I made the application completely thread-safe, but "bulk" disabling and enabling doesn't work the way it should. I receive absolutely no exceptions, but even though the code executes, and a response is received from the f5 web service, but the changes are not committed. (enabling or disabling one pool member at a time always works without any issues). - For bulk objects, the code in the server implementation essentially repeats the same task for each object. If an error occurs during that process, an OperationFailed exception is returned the the corresponding error code. It's hard for me to guess what could be causing your changes to not be taking hold. Have you tested the method running directly at the BIG-IP and then immediately looked at the GUI to see if it took hold. If you find a case where you make a call and then the GUI doesn't reflect those changes, then this is likely a bug that you'll have to submit to support. But, I've honestly never heard of this happening so I'd love to find a way to try to reproduce it.
- Vladimir_Budilo
Nimbostratus
When I say bulk, I simply mean that there are multiple calls to the F5 web service at the same time (even same millisecond). So, let's say, I call disablePoolMember 10 times within the same millisecond (therefore, there are 10 threads running simultaneously on the application server side, where the SOAP calls are made). - Ok, I get you know. iControl is implemented with FastCGI in a single connection configuration that essentially implements a first-in-first-out (FIFO) queue. The process will accept a request and then process one after another in sequential order.
http://devcentral.f5.com/Default.aspx?tabid=53&forumid=1&postid=16431&view=topic
- Vladimir_Budilo
Nimbostratus
Joe, thanks for the reply. - Vladimir, I was planning on building an app that will create 10000 pool members, spin up 100 threads and have them each loop over 100 pool members each sending 100 successive disable commands. Then I'll poll all the pool members to look for any that are still in the enabled state. I'll then repeat by enabling them all and checking the state again. I'll repeat this process until I find a discrepancy. If I don't see any issues, I'll look at increasing the numbers and duration. I'm working on a site upgrade today but will try to get to this later this week. I'll update you with what I find.
- Vladimir_Budilo
Nimbostratus
Joe, here is what's probably going to happen -- out of the 100 disable requests, the first one will fail, while the second......100th request might actually be successful, therefore you won't see the error. - Vladimir_Budilo
Nimbostratus
An even better way to test this is to "toggle" to pool member state: have 4 threads send simultaneous "disable" requests (and check the status after each disable request), then send 4 simultaneous "enable" requests (and check the status after each request). Repeating this 100 times is much better then just sending 100 disable requests at the same time. - Maybe I didn't make it clear. I was going to have 100 threads sending simultaneous "disable" requests. Each thread would send 100 consecutive requests. I figured that way there would be a much higher chance of a collision. I think that's the same thing you are suggesting. Once the 10000 requests are made, I'll poll all the pool members and if any of them are not in the state I was expecting, then something went wrong. I didn't want to tie in a query (get) in the set logic due to the fact it might lessen the possibility of requesting at the same millisecond.
Recent Discussions
Related Content
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects