Jersey can use either the JDK's http client or Apache HttpClient, which are you using?
I know that the Apache HttpClient will resubmit requests under some conditions (and you can disable it). http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e281 The default retry handler assumes PUT is idempotent but this is not true for CouchDB. For it to be true, we would have to send an identical response to the 2nd attempt as we did to the first, which, as you can see, we don't. CouchDB is behaving correctly, your client is the problem. Sent from my iPhone On 26 May 2012, at 12:34, Johannes Schneider <[email protected]> wrote: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi guys, I have a big problem here. Very often my unit tests fail. I have asked about this problem some time ago - but couldn't find that thread anymore... I have upgrade couchdb to 1.2.0 and run Wireshark to locate the problem. Ok. I am uploading my design documents before each unit tests. Sometimes (about 1 in 100) I get an 409 from couchdb. The problem is, that there are two PUTs instead of just one. Of course the second one fails with a 409. But my client is *not* aware that it is sending the request twice. Here is the relevant part of the couchdb.log: [Sat, 26 May 2012 09:52:59 GMT] [info] [<0.23835.0>] 127.0.0.1 - - GET /collustra_test$attachments/_design/rating 404 [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23835.0>] httpd 404 error response: {"error":"not_found","reason":"missing"} [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23813.0>] 'PUT' /collustra_test$attachments/_design/rating {1,1} from "127.0.0.1" Headers: [{'Accept',"text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"}, {'Connection',"keep-alive"}, {'Content-Length',"4910"}, {'Content-Type',"text/plain"}, {'Host',"localhost:5984"}, {"Millis","1338025979060"}, {'User-Agent',"Java/1.6.0_26"}] [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23813.0>] OAuth Params: [] [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23836.0>] 'PUT' /collustra_test$attachments/_design/rating {1,1} from "127.0.0.1" Headers: [{'Accept',"text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"}, {'Connection',"keep-alive"}, {'Content-Length',"4910"}, {'Content-Type',"text/plain"}, {'Host',"localhost:5984"}, {"Millis","1338025979060"}, {'User-Agent',"Java/1.6.0_26"}] [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23836.0>] OAuth Params: [] [Sat, 26 May 2012 09:52:59 GMT] [info] [<0.23813.0>] 127.0.0.1 - - PUT /collustra_test$attachments/_design/rating 201 [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23836.0>] Minor error in HTTP request: conflict [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23836.0>] Stacktrace: [{couch_db,update_doc,4, [{file, "/tmp/a/build-couchdb/dependencies/couchdb/src/couchdb/couch_db.erl"}, {line,429}]}, {couch_httpd_db,update_doc,6, [{file, "/tmp/a/build-couchdb/dependencies/couchdb/src/couchdb/couch_httpd_db.erl"}, {line,931}]}, {couch_httpd_db,do_db_req,2, [{file, "/tmp/a/build-couchdb/dependencies/couchdb/src/couchdb/couch_httpd_db.erl"}, {line,230}]}, {couch_httpd,handle_request_int,5, [{file, "/tmp/a/build-couchdb/dependencies/couchdb/src/couchdb/couch_httpd.erl"}, {line,317}]}, {mochiweb_http,headers,5, [{file, "/tmp/a/build-couchdb/dependencies/couchdb/src/mochiweb/mochiweb_http.erl"}, {line,136}]}, {proc_lib,init_p_do_apply,3, [{file,"proc_lib.erl"},{line,227}]}] [Sat, 26 May 2012 09:52:59 GMT] [info] [<0.23836.0>] 127.0.0.1 - - PUT /collustra_test$attachments/_design/rating 409 [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23836.0>] httpd 409 error response: {"error":"conflict","reason":"Document update conflict."} [Sat, 26 May 2012 09:52:59 GMT] [debug] [<0.23837.0>] 'GET' /collustra_test$attachments {1,1} from "127.0.0.1" Headers: [{'Accept',"text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"}, {'Connection',"keep-alive"}, {'Host',"localhost:5984"}, {'User-Agent',"Java/1.6.0_26"}] Now that seems to be very obvious... But: On the client side I see just *1* PUT. I am using Jersey Client API (Java). Wiresharks shows that there are - in fact - two PUT. But there is *no* response on the first PUT. Instead there are several TCP errors (RST, ACK). http://pastebin.com/17jV8MnA So I have: Client (Jersey): PUT Wireshark: PUT, Errors but no response, PUT, response CouchdB: PUT, (No Response?), PUT, Response So I think the problem is, that the response to the first PUT is lost somewhere - but executed successfully. And my client resends the request and gets the 409... So my question is basically: Does anybody have an idea how/why the response is lost? Thanks, Johannes - -- Johannes Schneider - blog.cedarsoft.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAEBAgAGBQJPwL+iAAoJEAytD9R7Qv6d7c0IAMesCF/DZC91QA/uqm1v3rec a8+npFGbvi0IhvMngJUKJtdCcAixn4FNQOoHeqY8HZf0BW5aHLtryk2/YzVzT4kg 5WG3FqdSqCCen92xfq0or+L5kRiC4D5U/jN1ZwFH5+LpyXyW6OQJ0N8kref8oDCh WTJsvJVj1QKM5XQo6HcnCDKdQVRHgUNhgsoMPGp/ZJvcr7Ezh2j0vQkO99OQNyVb VlFBKrwaFw+TV+x4jxabUPNW9GT5/g60zg8gwGWrO6bf3zCceUQA6Lk6zXxB5M/T DBNieowdjAPJOpHn8xgvvJ3Z2wUavqk1KJhetQze+7iTEPxvDwgUW/yhXDLh8cQ= =eUe/ -----END PGP SIGNATURE-----
