On Thu, Mar 31, 2011 at 14:32, Niko Goutte <ngou...@hotmail.com> wrote: > > Hello, > > I developped an apache module which send small data coming from file. > A client request from file through a Get request and data are sent with block > size equals to 100KB. > One 100KB buffer is allocated in the pool, then each buffer are used to create > one bucket that will be sent just after being inserted into the brigade. > To sum up: > ---------------------------------------------------------------------------------------------------------------------------- > apr_bucket_brigade *bb; > apr_bucket* b; > > bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); > Buf = apr_palloc(r->pool,100KB); > > while(lastBufferToSend==false) > { > Processing(Buf); > > b = apr_bucket_pool_create(Buf ,size, r->pool, r->connection->bucket_alloc) ; > > APR_BRIGADE_INSERT_TAIL(bb, b); > APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_flush_create(bb->bucket_alloc)); > > if(lastBufferToSend) > { > APR_BRIGADE_INSERT_TAIL(bb,apr_bucket_eos_create(bb->bucket_alloc)); > } > > rv = ap_pass_brigade(r->output_filters, bb); > if (rv != APR_SUCCESS) > { > return HTTP_INTERNAL_SERVER_ERROR; > } > > apr_brigade_cleanup(bb); > } > > apr_brigade_destroy(bb); > ---------------------------------------------------------------------------------------------------------------------------- > > > I want to call ap_pass_brigade for each buffer because I want the module to > send immediatly 100KB. > > Clients don't have to wait for the complete processing of the file more than > 2GB. They receive small blocks until the end. > > -------------------------------------------------------------------------------------------------------------------------- > > > Apache Server is in prefork mode. > <IfModule prefork.c> > StartServers 8 > MinSpareServers 5 > MaxSpareServers 20 > ServerLimit 256 > MaxClients 256 > MaxRequestsPerChild 4000 > </IfModule> > > In worker mode, everything is excepted 10 bytes that are send in addition > including value > "\n256\r\n" : it is very strange because the sum of every chunk corrsesponds > exactly to the expected size. > <IfModule worker.c> > StartServers 2 > MinSpareThreads 25 > MaxSpareThreads 75 > ThreadPerChild 64 > MaxClients 1024 > MaxRequestsPerChild 0 > </IfModule> > > -------------------------------------------------------------------------------------------------------------------------- > > MY PROBLEMS: > > In prefork mode, the first 8 client requests (which corresponds to the > StartServers = 8) are well processed. My client received all data, everything > is fine. > But the 9th freezes the module in ap_pass_brigade function. httpd is freezed > with 100% cpu on this process. > > In worker mode, it is ok excepted the 10 bytes added. It seems that it is > linked with apr_brigade_destroy or apr_bucket_delete(b).
Are you sure that the value of lastBufferToSend changes in your while-loop? Can you post your exact code to see how you add the 10 bytes? Sorin