Hi,

I found following bug in  nginx-1.8.0:

if   aio is configured with threads support - sometime (one in  thousands
requests)  $bytes_sent contains only length of the header. I'm attaching my
nginx.conf, build params and simple python script I'm using the reproduce
this issue.

Here is the output of test script when the problem appears:
.
.
.
received: 101700000 from access_log : 101700000 on 26 iteration
127.0.0.1 - - [15/May/2015 17:27:45] "GET /test HTTP/1.0" 200 -
127.0.0.1 - - [15/May/2015 17:27:47] "GET /test HTTP/1.0" 200 -
received: 101700000 from access_log : 101700000 on 27 iteration
127.0.0.1 - - [15/May/2015 17:27:58] "GET /test HTTP/1.0" 200 -
127.0.0.1 - - [15/May/2015 17:28:00] "GET /test HTTP/1.0" 200 -
received: 101700000 from access_log : 101690000 on 28 iteration
test failed!!

also in access_log file"

.
.
.
10170 GET /test HTTP/1.1
10170 GET /test HTTP/1.1
10170 GET /test HTTP/1.1
170 GET /test HTTP/1.1
10170 GET /test HTTP/1.1
10170 GET /test HTTP/1.1
.
.


Best regards,

George

Attachment: nginx.conf
Description: Binary data

Attachment: my_configure
Description: Binary data

#!/usr/bin/env python

import os
import time
import urllib2
import threading
from BaseHTTPServer import BaseHTTPRequestHandler

ACCESS_LOG = './run_nginx-1.8.0/access_log'

class GetHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        # print "do_GET"
        resp = 'a' * 10000
        self.send_response(200)
        self.send_header('Cache-Control', 'max-age=1')
        self.send_header('Content-Type', 'text/html')
        self.send_header('Date', 'Thu, 24 Nov 2011 16:28:33 GMT')
        self.send_header('Content-Length', len(resp))
        self.end_headers()

        self.wfile.write(resp)



def main():
    from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 8081), GetHandler)

    thread = threading.Thread(target = server.serve_forever)
    thread.daemon = True
    thread.start()
    url = 'http://127.0.0.1:8080/test'

    num_tests = 0
    while True:

        open(ACCESS_LOG, 'w').close() # empty access log file

        received_total_bytes = 0
        for i in xrange(10000):
            try:
                request = urllib2.Request(url)
                request.add_header('Host', 'rp-test.com')
                response = urllib2.urlopen(request)
                data = response.read()

                received_total_bytes += len(data) + len(str(response.headers)) + 19


            except urllib2.HTTPError as e:
                print "error", e
                exit()

            if len(data) + len(str(response.headers)) + 19 != 10170:
                print len(data) + len(str(response.headers)) + 19, len(data), len(str(response.headers))
                #print response.headers

                #print "^^^^^^^^^^^^^^^^^^^^^^^^"
                exit(1)

        time.sleep(10) # wait some time to flush access_log

        access_log_total_bytes = 0
        f = open(ACCESS_LOG)
        for line in f.xreadlines():
            bytes_sent = int(line.split(' ')[0])

            access_log_total_bytes += bytes_sent

        f.close()

        num_tests += 1

        print 'received:', received_total_bytes, 'from access_log :', access_log_total_bytes, 'on', num_tests, 'iteration'
        if received_total_bytes != access_log_total_bytes:
            print 'test failed!!!'
            exit(1)


#        os.remove(ACCESS_LOG)

    return True


if __name__ == '__main__':
    main()
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to