Asio, SSL, and scalability
konradzemek.com
konradzemek.com
> A look at engine::perform implementation in engine.ipp quickly shows us that... everything is fine.
Here's the beginning of perform():
::ERR_clear_error();
int result = (this->*op)(data, length);
int ssl_error = ::SSL_get_error(ssl_, result);
int sys_error = static_cast<int>(::ERR_get_error());
So the lock contention is in SSL_get_error / ERR_get_error? I see a big problem here - stop checking them on success! int result = (this->*op)(data, length);
int ssl_error = SSL_ERROR_NONE;
int sys_error = 0;
if (result != 1) {
ssl_error = ::SSL_get_error(ssl_, result);
sys_error = static_cast<int>(::ERR_get_error());
::ERR_clear_error();
}
The move of the error clearing to right after they're retrieved, may not be completely right so the rest of the code needs to be checked. But the general idea should eliminate the lock contention completely. (unless they deal with mostly connection errors)If I were a sysadmin in charge of just keeping in-house applications running, I'd really hate it if some SSL layer bug meant I had to figure out how to recompile some custom application - especially one using boost! - not to mention figuring out how to update certificates and that sort of thing.
https://developer.apple.com/library/mac/documentation/Develo...
Which for some features it just a fancy UI on top of dtrace, but still a good way to get started with these kinds of things.