Oh my.  Not a nice defect in Avalon at all.  Why don't they use an object
pool for that class of object?  And if they can invalidate when replacing,
they ought to be able to remove invalid job entries, and return them to the
pool.  You should probably reply to me off-list with that response, rather
than bother everyone else (of course, others are free to say that this is
not off-topic).

        --- Noel

-----Original Message-----
From: Shilpa Dalmia [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, May 21, 2002 13:31
To: 'James Developers List'
Subject: RE: SMTPHandler connection timeout


Hi,
        The reason I raised this question was that we've had some memory
leak issues in this section of the code. I posted messages on the avalon
mailing list & they acknowledged it as a problem with this kind of usage.
Here's a brief description of the problem -
        The addTrigger call creates a job entry in the queue. The
resetTrigger call reschedules the job, invalidating the old entry & adding a
new one. There's a monitor thread which wakes up when the first entry in the
queue is ready to be scheduled & at that time removes the invalidated
entries. So if the connection timeout is say 5 mins.  and there is constant
SMTP activity, I estimate that this could lead to 15,000 or more invalid
timer entries in the queue.  (10 message per second * 5 SMTP commands per
message * 300 seconds), potentially raising an "out of memory" exception.
        A fix has been suggested on the avalon mailing list for this, but I
wanted see if we could use an alternate timeout mechanism in james. But if
this mechanism is required, we should fix the avalon problem.

Shilpa

-----Original Message-----
From: Noel J. Bergman [mailto:[EMAIL PROTECTED]]
Sent: Monday, May 20, 2002 6:40 PM
To: James Developers List
Subject: RE: SMTPHandler connection timeout


> In SMTPHandler::handleConnection() method, why do we use the avalon
> scheduler & trigger mechanism to handle a connection timeout?
> Instead why don't we use the java.net.Socket.setSoTimeout(timeout) method,

Please consider the code:

  final PeriodicTimeTrigger trigger = new PeriodicTimeTrigger(
timeout, -1 );
  scheduler.addTrigger( this.toString(), trigger, this );
  while  (parseCommand(in.readLine()))
scheduler.resetTrigger(this.toString());
  socket.close();
  scheduler.removeTrigger(this.toString());

Note that the trigger protects more than just socket I/O.  It covers the
processing of the command (parseCommand does a lot more than just parse).

        --- Noel


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to