See <http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/195/changes>
Changes: [Alex Rousskov] Do not reuse persistent connections for PUTs to avoid ERR_ZERO_SIZE_OBJECT. A compliant proxy may retry PUTs, but Squid lacks the [rather complicated] code required to protect the PUT request body from being nibbled during the first try or [also tricky] code to send 100-continue expectation requiredto delay body sending. Thus, Squid cannot safely retry some PUTs today, and FwdState::checkRetriable() must return false for all PUTs, to avoid bogus ERR_ZERO_SIZE_OBJECT errors (especially for clients that did not reuse a pconn and, hence, may not be ready to handle/retry an error response). In theory, requests with safe or idempotent methods other than PUT might have bodies so we apply the same logic to them as well. This reopens Squid bug #3398, undoing trunk r11859 commit which attempted to close that bug. [Alex Rousskov] Do not chunk responses carrying a Content-Range header. When Squid forwards a response with a Content-Range header, ClientSocketContext::socketState() detects the end of the response range(s) and returns STREAM_*COMPLETE to ClientSocketContext::writeComplete(). The latter thinks that the writing of the response to the client must be over and calls keepaliveNextRequest() instead of writing the last-chunk (if any). If the to-client response was chunked, the client gets stuck waiting for that missing last-chunk. The multipart Range request case was already excluded from chunking (or it would probably suffer from the same problem). With this change, no Content-Range responses will be chunked. N.B. Some servers send Content-Range responses to basic GET requests without a Range header, so the problem affects more than just Range requests. TODO: A proper fix would be to rewrite ClientSocketContext::writeComplete() and other code so that it does not mix internal ClientStream completion with [possibly chunk-encoded] writing completion. This should probably be done along with fixing ClientSocketContext::socketState() and other state-checking code to ignore to-client persistence (flags.proxy_keepalive), which is not related to the internal ClientStream state. ------------------------------------------ [...truncated 7104 lines...] Testing ../../src/StoreMetaMD5.h ...Ok. Testing ../../src/gopher.h ...Ok. Testing ../../src/StoreIOState.h ...Ok. Testing ../../src/TimeOrTag.h ...Ok. Testing ../../src/DelayConfig.h ...Ok. Testing ../../src/hier_code.h ...Ok. Testing ../../src/fqdncache.h ...Ok. Testing ../../src/DelayUser.h ...Ok. Testing ../../src/HttpParser.h ...Ok. Testing ../../src/MemBlob.h ...Ok. Testing ../../src/icp_opcode.h ...Ok. Testing ../../src/HttpHdrContRange.h ...Ok. Testing ../../src/SquidDns.h ...Ok. Testing ../../src/cache_cf.h ...Ok. Testing ../../src/StoreMetaObjSize.h ...Ok. Testing ../../src/DelayVector.h ...Ok. Testing ../../src/http.h ...Ok. Testing ../../src/CompletionDispatcher.h ...Ok. Testing ../../src/HttpHdrScTarget.h ...Ok. Testing ../../src/StatCounters.h ...Ok. Testing ../../src/wccp2.h ...Ok. Testing ../../src/PingData.h ...Ok. Testing ../../src/Parsing.h ...Ok. Testing ../../src/HttpBody.h ...Ok. Testing ../../src/StoreMetaSTD.h ...Ok. Testing ../../src/event.h ...Ok. Testing ../../src/MemStore.h ...Ok. Testing ../../src/DescriptorSet.h ...Ok. Testing ../../src/store_key_md5.h ...Ok. Testing ../../src/comm.h ...Ok. Testing ../../src/ftp.h ...Ok. Testing ../../src/LoadableModules.h ...Ok. Testing ../../src/stmem.h ...Ok. Testing ../../src/CommRead.h ...Ok. Testing ../../src/CompositePoolNode.h ...Ok. Testing ../../src/Server.h ...Ok. Testing ../../src/wccp.h ...Ok. Testing ../../src/DelayTagged.h ...Ok. Testing ../../src/swap_log_op.h ...Ok. Testing ../../src/HierarchyLogEntry.h ...Ok. Testing ../../src/StoreClient.h ...Ok. Testing ../../src/structs.h ...Ok. Testing ../../src/client_side_reply.h ...Ok. Testing ../../src/StoreMetaSTDLFS.h ...Ok. Testing ../../src/defines.h ...Ok. Testing ../../src/HttpHeaderTools.h ...Ok. Testing ../../src/RemovalPolicy.h ...Ok. Testing ../../src/Packer.h ...Ok. Testing ../../src/DelaySpec.h ...Ok. Testing ../../src/AsyncEngine.h ...Ok. Testing ../../src/StoreSwapLogData.h ...Ok. Testing ../../src/HttpMsg.h ...Ok. Testing ../../src/ICP.h ...Ok. Testing ../../src/DnsLookupDetails.h ...Ok. Testing ../../src/peer_userhash.h ...Ok. Testing ../../src/Debug.h ...Ok. Testing ../../src/ExternalACLEntry.h ...Ok. Testing ../../src/DiskIO/ReadRequest.h ...Ok. Testing ../../src/DiskIO/DiskIOModule.h ...Ok. Testing ../../src/DiskIO/DiskIOStrategy.h ...Ok. Testing ../../src/DiskIO/DiskFile.h ...Ok. Testing ../../src/DiskIO/WriteRequest.h ...Ok. Testing ../../src/DiskIO/IORequestor.h ...Ok. Testing ../../src/DiskIO/Mmapped/MmappedFile.h ...Ok. Testing ../../src/DiskIO/Mmapped/MmappedDiskIOModule.h ...Ok. Testing ../../src/DiskIO/Mmapped/MmappedIOStrategy.h ...Ok. Testing ../../src/DiskIO/AIO/AIODiskFile.h ...Ok. Testing ../../src/DiskIO/AIO/async_io.h ...Ok. Testing ../../src/DiskIO/AIO/aio_win32.h ...Ok. Testing ../../src/DiskIO/AIO/AIODiskIOModule.h ...Ok. Testing ../../src/DiskIO/AIO/AIODiskIOStrategy.h ...Ok. Testing ../../src/DiskIO/DiskThreads/DiskThreadsDiskFile.h ...Ok. Testing ../../src/DiskIO/DiskThreads/CommIO.h ...Ok. Testing ../../src/DiskIO/DiskThreads/DiskThreads.h ...Ok. Testing ../../src/DiskIO/DiskThreads/DiskThreadsIOStrategy.h ...Ok. Testing ../../src/DiskIO/DiskThreads/DiskThreadsDiskIOModule.h ...Ok. Testing ../../src/DiskIO/IpcIo/IpcIoFile.h ...Ok. Testing ../../src/DiskIO/IpcIo/IpcIoDiskIOModule.h ...Ok. Testing ../../src/DiskIO/IpcIo/IpcIoIOStrategy.h ...Ok. Testing ../../src/DiskIO/DiskDaemon/DiskdFile.h ...Ok. Testing ../../src/DiskIO/DiskDaemon/diomsg.h ...Ok. Testing ../../src/DiskIO/DiskDaemon/DiskdIOStrategy.h ...Ok. Testing ../../src/DiskIO/DiskDaemon/DiskdAction.h ...Ok. Testing ../../src/DiskIO/DiskDaemon/DiskDaemonDiskIOModule.h ...Ok. Testing ../../src/DiskIO/Blocking/BlockingIOStrategy.h ...Ok. Testing ../../src/DiskIO/Blocking/BlockingFile.h ...Ok. Testing ../../src/DiskIO/Blocking/BlockingDiskIOModule.h ...Ok. .. OK (2) PASS: tests/testACLMaxUserIP . OK (1) PASS: tests/testBoilerplate .. OK (2) PASS: tests/testCacheManager . OK (1) PASS: tests/testDiskIO ..Actual Text: Last event to run: last event Operation \tNext Execution \tWeight\tCallback Valid? test event \t0.000 sec\t 0\t N/A test event2 \t0.000 sec\t 0\t N/A .... OK (6) PASS: tests/testEvent ... OK (3) PASS: tests/testEventLoop PASS: tests/test_http_range ..... OK (5) PASS: tests/testHttpParser .SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). OK (1) PASS: tests/testHttpReply ............. OK (13) PASS: tests/testHttpRequest ........SKIP: cache_cf.cc operator void* (not implemented). ... OK (11) PASS: tests/testStore .... OK (4) PASS: tests/testString stub time| persistent connection module initialized .......... OK (10) PASS: tests/testURL . OK (1) PASS: tests/testConfigParser ... OK (3) PASS: tests/testStatHist .SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: StatHist.cc enumInit (not implemented). SKIP: tools.cc UsingSmp (not implemented). SKIP: tools.cc InDaemonMode (not implemented). .SKIP: tools.cc UsingSmp (not implemented). SKIP: tools.cc InDaemonMode (not implemented). SKIP: cache_cf.cc operator void* (not implemented). SKIP: tools.cc UsingSmp (not implemented). SKIP: tools.cc InDaemonMode (not implemented). SKIP: tools.cc UsingSmp (not implemented). SKIP: stub_store_rebuild.cc storeRebuildComplete (not implemented). SKIP: tools.cc InDaemonMode (not implemented). FSKIP: StatHist.cc count (not implemented). SKIP: StatHist.cc count (not implemented). SKIP: StatHist.cc count (not implemented). SKIP: StatHist.cc count (not implemented). SKIP: StatHist.cc count (not implemented). SKIP: StatHist.cc count (not implemented). testRock.cc:234:Assertion Test name: testRock::testRockSwapOut assertion failed - Expression: pe->swap_status == SWAPOUT_WRITING Failures !!! Run: 2 Failure total: 1 Failures: 1 Errors: 0 FAIL: tests/testRock .SKIP: cache_cf.cc operator void* (not implemented). SKIP: stub_store_rebuild.cc storeRebuildComplete (not implemented). . OK (2) PASS: tests/testUfs PASS: testHeaders ================================================= 1 of 18 tests failed Please report to http://www.squid-cache.org/bugs/ ================================================= make[5]: *** [check-TESTS] Error 1 make[5]: Leaving directory `<http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/ws/btlayer-00-default/squid-3.HEAD-BZR/_build/src'> make[4]: *** [check-am] Error 2 make[4]: Leaving directory `<http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/ws/btlayer-00-default/squid-3.HEAD-BZR/_build/src'> make[3]: *** [check-recursive] Error 1 make[3]: Leaving directory `<http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/ws/btlayer-00-default/squid-3.HEAD-BZR/_build/src'> make[2]: *** [check] Error 2 make[2]: Leaving directory `<http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/ws/btlayer-00-default/squid-3.HEAD-BZR/_build/src'> make[1]: *** [check-recursive] Error 1 make[1]: Leaving directory `<http://build.squid-cache.org/job/3.HEAD-amd64-opensuse/ws/btlayer-00-default/squid-3.HEAD-BZR/_build'> make: *** [distcheck] Error 1 buildtest.sh result is 2 BUILD: .././test-suite/buildtests/layer-00-default.opts configure: BUILD LIBRARIES: configure: BUILD EXTRA LIBRARIES: -lm -lnsl -lresolv -lcap -lrt -ldl -ldl configure: BUILD OBJECTS: configure: BUILD EXTRA OBJECTS: configure: BUILD C FLAGS: -Wall -g -O2 configure: BUILD EXTRA C FLAGS: -Wall -Wpointer-arith -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wcomments -Werror -pipe -D_REENTRANT configure: BUILD C++ FLAGS: -g -O2 -std=c++0x configure: BUILD EXTRA C++ FLAGS: -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Werror -pipe -D_REENTRANT configure: BUILD LIBRARIES: configure: BUILD EXTRA LIBRARIES: -lm -lnsl -lresolv -lcap -lrt -ldl -ldl configure: BUILD OBJECTS: configure: BUILD EXTRA OBJECTS: configure: BUILD C FLAGS: -Wall -g -O2 configure: BUILD EXTRA C FLAGS: -Wall -Wpointer-arith -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations -Wcomments -Werror -pipe -D_REENTRANT configure: BUILD C++ FLAGS: -g -O2 -std=c++0x configure: BUILD EXTRA C++ FLAGS: -Wall -Wpointer-arith -Wwrite-strings -Wcomments -Werror -pipe -D_REENTRANT checking for egrep... .././test-suite/../configure: line 6880: echo: write error: Broken pipe checking for fgrep... .././test-suite/../configure: line 7778: echo: write error: Broken pipe checking for egrep... ../configure: line 6880: echo: write error: Broken pipe checking for fgrep... ../configure: line 7778: echo: write error: Broken pipe assertion failed FAIL: tests/testRock make[5]: *** [check-TESTS] Error 1 make[4]: *** [check-am] Error 2 make[3]: *** [check-recursive] Error 1 make[2]: *** [check] Error 2 make[1]: *** [check-recursive] Error 1 make: *** [distcheck] Error 1 Build FAILED. Build step 'Execute shell' marked build as failure
