On 30/06/15 12:50, Charlie Smurthwaite wrote:

Hi Willy,

Please find attached a tgz containing the following:

* Output from "strace -o log -tts 16384 -p $(haproxy_pid)"
* Full packet capture of all port-80 traffic (client is on 10.0.2.82)
* Log output from client identifying corrupt file
* Modified config file used in this test

For this test, only IPv4 was used. Client side MSS is forced to 1300 by an intermediate firewall.

Please let me know if any further information would be useful.

Charlie
Looking at the strace, the following jumps out as being odd:

A partial write succeeds, writing the remaining data fails with EAGAIN. The send is then retried with what looks like a corrupt buffer.

12:37:57.028283 sendto(3, "HTTP/1.1 200 OK\r\nServer: nginx/1.8.0\r\nDate: Tue, 30 Jun 2015 11:37:57 GMT\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\nStatus: 200 OK\r\nlast-modified: Wed, 03 Jun 2015 07:04:33 GMT\r\netag: \"1//activeresource/test/cases/finder_test.rb\"\r\naccept-ranges: bytes\r\nCache-Control: private, max-age=604800\r\nX-Rack-Cache: miss\r\n\r\nf4b\r\nrequire 'abstract_unit'\nrequire \"fixtures/person\"\nrequire \"fixtures/customer\"\nrequire \"fixtures/street_address\"\nrequire \"fixtures/beast\"\nrequire \"fixtures/proxy\"\nrequire 'active_support/core_ext/hash/conversions'\n\nclass FinderTest < Test::Unit::TestCase\n def setup\n setup_response # find me in abstract_unit\n end\n\n def test_find_by_id\n matz = Person.find(1)\n assert_kind_of Person, matz\n assert_equal \"Matz\", matz.name\n assert matz.name?\n end\n\n def test_find_by_id_with_custom_prefix\n addy = StreetAddress.find(1, :params => { :person_id => 1 })\n assert_kind_of StreetAddress, addy\n assert_equal '12345 Street', addy.street\n end\n\n def test_find_all\n all = Person.find(:all)\n assert_equal 2, all.size\n assert_kind_of Person, all.first\n assert_equal \"Matz\", all.first.name\n assert_equal \"David\", all.last.name\n end\n\n def test_all\n all = Person.all\n assert_equal 2, all.size\n assert_kind_of Person, all.first\n assert_equal \"Matz\", all.first.name\n assert_equal \"David\", all.last.name\n end\n\n def test_all_with_params\n all = StreetAddress.all(:params => { :person_id => 1 })\n assert_equal 1, all.size\n assert_kind_of StreetAddress, all.first\n end\n\n def test_find_first\n matz = Person.find(:first)\n assert_kind_of Person, matz\n assert_equal \"Matz\", matz.name\n end\n\n def test_first\n matz = Person.first\n assert_kind_of Person, matz\n assert_equal \"Matz\", matz.name\n end\n\n def test_first_with_params\n addy = StreetAddress.first(:params => { :person_id => 1 })\n assert_kind_of StreetAddress, addy\n assert_equal '12345 Street', addy.street\n end\n\n def test_find_last\n david = Person.find(:last)\n assert_kind_of Person, david\n assert_equal 'David', david.name\n end\n\n def test_last\n david = Person.last\n assert_kind_of Person, david\n assert_equal 'David', david.name\n end\n\n def test_last_with_params\n addy = StreetAddress.last(:params => { :person_id => 1 })\n assert_kind_of StreetAddress, addy\n assert_equal '12345 Street', addy.street\n end\n\n def test_find_by_id_not_found\n assert_raise(ActiveResource::ResourceNotFound) { Person.find(99) }\n assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(99, :params => {:person_id => 1}) }\n end\n\n def test_find_all_sub_objects\n all = StreetAddress.find(:all, :params => { :person_id => 1 })\n assert_equal 1, all.size\n assert_kind_of StreetAddress, all.first\n end\n\n def test_find_all_sub_objects_not_found\n assert_nothing_raised do\n addys = StreetAddress.find(:all, :params => { :person_id => 2 })\n end\n end\n\n def test_find_all_by_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/people.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => \"/companies/1/people.xml\")\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_all_by_from_with_options\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/people.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => \"/companies/1/people.xml\")\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_all_by_symbol_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/people/managers.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => :managers)\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_single_by_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/manager.xml\", {}, @david }\n\n david = Person.find(:one, :from => \"/companies/1/manager.xml\")\n assert_equal \"David\", david.name\n end\n\n def test_find_single_by_symbol_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/people/leader.xml\", {}, @david }\n\n david = Person.find(:one, :from => :leader)\n assert_equal \"David\", david.name\n end\nend\n\r\n0\r\n\r\n", 4255, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = 1288 12:37:57.028924 sendto(3, "l.first\n assert_equal \"Matz\", all.first.name\n assert_equal \"David\", all.last.name\n end\n\n def test_all_with_params\n all = StreetAddress.all(:params => { :person_id => 1 })\n assert_equal 1, all.size\n assert_kind_of StreetAddress, all.first\n end\n\n def test_find_first\n matz = Person.find(:first)\n assert_kind_of Person, matz\n assert_equal \"Matz\", matz.name\n end\n\n def test_first\n matz = Person.first\n assert_kind_of Person, matz\n assert_equal \"Matz\", matz.name\n end\n\n def test_first_with_params\n addy = StreetAddress.first(:params => { :person_id => 1 })\n assert_kind_of StreetAddress, addy\n assert_equal '12345 Street', addy.street\n end\n\n def test_find_last\n david = Person.find(:last)\n assert_kind_of Person, david\n assert_equal 'David', david.name\n end\n\n def test_last\n david = Person.last\n assert_kind_of Person, david\n assert_equal 'David', david.name\n end\n\n def test_last_with_params\n addy = StreetAddress.last(:params => { :person_id => 1 })\n assert_kind_of StreetAddress, addy\n assert_equal '12345 Street', addy.street\n end\n\n def test_find_by_id_not_found\n assert_raise(ActiveResource::ResourceNotFound) { Person.find(99) }\n assert_raise(ActiveResource::ResourceNotFound) { StreetAddress.find(99, :params => {:person_id => 1}) }\n end\n\n def test_find_all_sub_objects\n all = StreetAddress.find(:all, :params => { :person_id => 1 })\n assert_equal 1, all.size\n assert_kind_of StreetAddress, all.first\n end\n\n def test_find_all_sub_objects_not_found\n assert_nothing_raised do\n addys = StreetAddress.find(:all, :params => { :person_id => 2 })\n end\n end\n\n def test_find_all_by_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/people.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => \"/companies/1/people.xml\")\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_all_by_from_with_options\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/people.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => \"/companies/1/people.xml\")\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_all_by_symbol_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/people/managers.xml\", {}, @people_david }\n\n people = Person.find(:all, :from => :managers)\n assert_equal 1, people.size\n assert_equal \"David\", people.first.name\n end\n\n def test_find_single_by_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/companies/1/manager.xml\", {}, @david }\n\n david = Person.find(:one, :from => \"/companies/1/manager.xml\")\n assert_equal \"David\", david.name\n end\n\n def test_find_single_by_symbol_from\n ActiveResource::HttpMock.respond_to { |m| m.get \"/people/leader.xml\", {}, @david }\n\n david = Person.find(:one, :from => :leader)\n assert_equal \"David\", david.name\n end\nend\n\r\n0\r\n\r\n", 2967, MSG_DONTWAIT|MSG_NOSIGNAL, NULL, 0) = -1 EAGAIN (Resource temporarily unavailable) 12:37:57.056999 sendto(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 2967, MSG_DONTWAIT|MSG_NOSIGNAL|MSG_MORE, NULL, 0) = 2967



Reply via email to