]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Partial bug #2964 fix: writer stuck in a "waiting for preview answer" state.
authorAlex Rousskov <rousskov@measurement-factory.com>
Mon, 13 Sep 2010 00:34:44 +0000 (18:34 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Mon, 13 Sep 2010 00:34:44 +0000 (18:34 -0600)
At the end of preview, do not go into the writingPaused state if we already
received the final response from the ICAP server. Instead, stop writing so
that we do not get stuck waiting for the response that has already come.

May also handle header-only (zero-size) ieof Preview better.

src/adaptation/icap/ModXact.cc
src/adaptation/icap/ModXact.h

index f08abdf32812d56983dddcd2283032acf23fd956..abb3b413298eb6289e33c281da2b014b94677e83 100644 (file)
@@ -160,11 +160,14 @@ void Adaptation::Icap::ModXact::handleCommWroteHeaders()
     Must(state.writing == State::writingHeaders);
 
     // determine next step
-    if (preview.enabled())
-        state.writing = preview.done() ? State::writingPaused : State::writingPreview;
-    else if (virginBody.expected())
+    if (preview.enabled()) {
+        if (preview.done())
+            decideWritingAfterPreview("zero-size");
+        else
+            state.writing = State::writingPreview;
+    } else if (virginBody.expected()) {
         state.writing = State::writingPrime;
-    else {
+    else {
         stopWriting(true);
         return;
     }
@@ -223,14 +226,23 @@ void Adaptation::Icap::ModXact::writePreviewBody()
 
     // change state once preview is written
 
-    if (preview.done()) {
-        debugs(93, 7, HERE << "wrote entire Preview body" << status());
+    if (preview.done())
+        decideWritingAfterPreview("body");
+}
 
-        if (preview.ieof())
-            stopWriting(true);
-        else
-            state.writing = State::writingPaused;
-    }
+/// determine state.writing after we wrote the entire preview
+void Adaptation::Icap::ModXact::decideWritingAfterPreview(const char *kind)
+{
+    if (preview.ieof()) // nothing more to write
+        stopWriting(true);
+    else
+    if (state.parsing == State::psIcapHeader) // did not get a reply yet
+        state.writing = State::writingPaused; // wait for the ICAP server reply
+    else
+        stopWriting(true); // ICAP server reply implies no post-preview writing
+
+    debugs(93, 6, HERE << "decided on writing after " << kind << " preview" <<
+        status());
 }
 
 void Adaptation::Icap::ModXact::writePrimeBody()
index 0cad76a905764116e288a39e50f419bd3342da9b..fb08d02e55ab259a82cd4523ddd50d6d5cd99833 100644 (file)
@@ -184,6 +184,7 @@ private:
     void writePreviewBody();
     void writePrimeBody();
     void writeSomeBody(const char *label, size_t size);
+    void decideWritingAfterPreview(const char *previewKind);
 
     void startReading();
     void readMore();