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).

If someone can provide me answers to these problems, I'll be very happy.

Thank you.

Nicolas.

                                          

Reply via email to