summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2010-01-12 15:27:01 -0500
committerNat Goodspeed <nat@lindenlab.com>2010-01-12 15:27:01 -0500
commit7b03037cacc99c975624c44eef3c9071198adeed (patch)
tree8212dd626860174558885bddc06e75b72316ca74
parent3b2697cb93e6b8a1f1281aeab0e960bc6704d8c4 (diff)
EXT-4193: Use different reply pumps for SRV and XMLRPC requests.
This eliminates the timing hole (introduced by EXT-3934 fix) in which a belated SRV response could confuse the XMLRPC response code. Extend unit tests to positively drive the bug and validate the fix.
-rw-r--r--indra/viewer_components/login/lllogin.cpp16
-rw-r--r--indra/viewer_components/login/tests/lllogin_test.cpp12
2 files changed, 19 insertions, 9 deletions
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index f5bda71846..b9f61ca7e1 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -143,7 +143,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
<< " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL;
// Arriving in SRVRequest state
- LLEventStream replyPump("reply", true);
+ LLEventStream replyPump("SRVreply", true);
// Should be an array of one or more uri strings.
LLSD rewrittenURIs;
{
@@ -181,6 +181,10 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
} // we no longer need the filter
LLEventPump& xmlrpcPump(LLEventPumps::instance().obtain("LLXMLRPCTransaction"));
+ // EXT-4193: use a DIFFERENT reply pump than for the SRV request. We used
+ // to share them -- but the EXT-3934 fix made it possible for an abandoned
+ // SRV response to arrive just as we were expecting the XMLRPC response.
+ LLEventStream loginReplyPump("loginreply", true);
// Loop through the rewrittenURIs, counting attempts along the way.
// Because of possible redirect responses, we may make more than one
@@ -191,7 +195,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
urit != urend; ++urit)
{
LLSD request(credentials);
- request["reply"] = replyPump.getName();
+ request["reply"] = loginReplyPump.getName();
request["uri"] = *urit;
std::string status;
@@ -216,11 +220,11 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// possible for the reply to arrive before the post() call
// returns. Subsequent responses, of course, must be awaited
// without posting again.
- for (mAuthResponse = validateResponse(replyPump.getName(),
- postAndWait(self, request, xmlrpcPump, replyPump, "reply"));
+ for (mAuthResponse = validateResponse(loginReplyPump.getName(),
+ postAndWait(self, request, xmlrpcPump, loginReplyPump, "reply"));
mAuthResponse["status"].asString() == "Downloading";
- mAuthResponse = validateResponse(replyPump.getName(),
- waitForEventOn(self, replyPump)))
+ mAuthResponse = validateResponse(loginReplyPump.getName(),
+ waitForEventOn(self, loginReplyPump)))
{
// Still Downloading -- send progress update.
sendProgressEvent("offline", "downloading");
diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp
index 8463e6d2ca..51f5cd0692 100644
--- a/indra/viewer_components/login/tests/lllogin_test.cpp
+++ b/indra/viewer_components/login/tests/lllogin_test.cpp
@@ -441,8 +441,8 @@ namespace tut
// Testing normal login procedure.
LLEventStream llaresPump("LLAres"); // Dummy LLAres pump.
- // LLAresListener dummyLLAres("dummy_llares");
- // dummyLLAres.listenTo(llaresPump);
+ LLAresListener dummyLLAres("dummy_llares");
+ dummyLLAres.listenTo(llaresPump);
LLLogin login;
LoginListener listener("test_ear");
@@ -470,6 +470,12 @@ namespace tut
// the original URI.
ensure_equals("Auth state", listener.lastEvent()["change"].asString(), "authenticating");
ensure_equals("Attempt", listener.lastEvent()["data"]["attempt"].asInteger(), 1);
- ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com");
+ ensure_equals("URI", listener.lastEvent()["data"]["request"]["uri"].asString(), "login.bar.com");
+
+ // EXT-4193: if the SRV reply isn't lost but merely late, and if it
+ // arrives just at the moment we're expecting the XMLRPC reply, the
+ // original code got confused and crashed. Drive that case here. We
+ // observe that without the fix, this call DOES repro.
+ dummyLLAres.sendReply();
}
}