From 339e15563e4b9fd9573e06dd5a2269fee0f6a077 Mon Sep 17 00:00:00 2001 From: Stephen Atherton Date: Fri, 4 Jan 2019 18:34:16 -0800 Subject: [PATCH] Bug fix in blobstore request loop where zero-content requests (i.e. not uploads) could cause mismatches between requests and responses. Added HTTPRequest debug event. --- fdbclient/BlobStore.actor.cpp | 2 +- fdbclient/HTTP.actor.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fdbclient/BlobStore.actor.cpp b/fdbclient/BlobStore.actor.cpp index 32d0864f70..d222491695 100644 --- a/fdbclient/BlobStore.actor.cpp +++ b/fdbclient/BlobStore.actor.cpp @@ -511,8 +511,8 @@ ACTOR Future> doRequest_impl(Reference frconn = bstore->connect(); // Make a shallow copy of the queue by calling addref() on each buffer in the chain and then prepending that chain to contentCopy + contentCopy.discardAll(); if(pContent != nullptr) { - contentCopy.discardAll(); PacketBuffer *pFirst = pContent->getUnsent(); PacketBuffer *pLast = nullptr; for(PacketBuffer *p = pFirst; p != nullptr; p = p->nextPacketBuffer()) { diff --git a/fdbclient/HTTP.actor.cpp b/fdbclient/HTTP.actor.cpp index 7b763abe4a..3bfca52b6e 100644 --- a/fdbclient/HTTP.actor.cpp +++ b/fdbclient/HTTP.actor.cpp @@ -294,6 +294,8 @@ namespace HTTP { // and be destroyed by the caller // TODO: pSent is very hackish, do something better. ACTOR Future> doRequest(Reference conn, std::string verb, std::string resource, HTTP::Headers headers, UnsentPacketQueue *pContent, int contentLen, Reference sendRate, int64_t *pSent, Reference recvRate) { + state TraceEvent event(SevDebug, "HTTPRequest"); + state UnsentPacketQueue empty; if(pContent == NULL) pContent = ∅ @@ -301,6 +303,12 @@ namespace HTTP { state bool earlyResponse = false; state int total_sent = 0; + event.detail("DebugID", conn->getDebugID()); + event.detail("RemoteAddress", conn->getPeerAddress()); + event.detail("Verb", verb); + event.detail("Resource", resource); + event.detail("RequestContentLen", contentLen); + try { // Write headers to a packet buffer chain PacketBuffer *pFirst = new PacketBuffer(); @@ -347,8 +355,11 @@ namespace HTTP { } Void _ = wait(responseReading); + event.detail("ResponseCode", r->code); + event.detail("ResponseContentLen", r->contentLen); double elapsed = timer() - send_start; + event.detail("Elapsed", elapsed); if(CLIENT_KNOBS->HTTP_VERBOSE_LEVEL > 0) printf("[%s] HTTP code=%d early=%d, time=%fs %s %s contentLen=%d [%d out, response content len %d]\n", conn->getDebugID().toString().c_str(), r->code, earlyResponse, elapsed, verb.c_str(), resource.c_str(), contentLen, total_sent, (int)r->contentLen);