Joe Orton wrote:
On Fri, Aug 19, 2005 at 12:07:37AM -0700, Stas Bekman wrote:

Joe Orton wrote:

On Thu, Aug 18, 2005 at 06:25:23PM -0700, Stas Bekman wrote:


when reading from most bucket types you want to read all the data. This is not the case with socket buckets, since the amount of data on the socket can be anything. At the moment the code hardcodes 8K of data is to be read. What do I do if I want to control how much data is read from the socket?


Why do you need to do that?  You shouldn't really care.

We do care, because we write a throttling filter for the smtp module, so we want to slow down the spammers, reading 8K defeats the purpose of the throttling filter (we read like 32B and then sleep), since most spam messages will be consumed by the server side. that filter will be available on CPAN once completed.


Hmmm, tricky. I would suspect it would be better to achieve this using socket options, though I'm not sure how feasible that is; e.g. try setting SO_RCVBUF to 32. You really want to prevent the TCP stack from buffering and ACKing the data as well if you want to throttle the sender from the word go.

But that still won't prevent from the bucket socket read function to read more than 32, if while it cleans the buffer the OS level keeps on reading the data in, is that correct? or is it absolutely sure that the smaller buffer size will make sure that the socket buffer will never read more than that?

Also while we are at it, do you remember why 8000 was chosen as the size of the buffer (I remember why it wasn't 8K, but I wonder why not 2k or 4k?) is it because it perfectly fits the memory page? but how do you ensure that it always starts at the page boundary and not hanging over the end of the previous page?

Otherwise, I guess what you could do here is implement a new bucket type, which is a clone of SOCKET, except it stores a length parameter which is used in the place of APR_BUCKET_BUFF_SIZE on each ->read() invocation; allowing the caller to change the length as necessary using an accessor function.

Right I could do that. But I'll also need to replace the core_in filter, since it will use the current socket bucket functionality.

You can't change the apr_bucket_read() interface itself so I'm not sure exactly what you were trying to do with the changes you mention.

I wasn't trying to, I was just hoping for a quick hack before a clean solution is introduced. But never mind, I'll just work on the clean solution when we will have time for that.

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

Reply via email to