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