On Sat, Dec 30, 2000 at 07:31:50PM -0800, Dev Random wrote:
> I took a quick look at the memory situation, and there is a leak there.  The
> problem is that the Message class keeps a pointer to the ConnectionHandler.
> Subclasses of Message are kept in the Node in messageMemories.

It has to do that to function.

> For every ConnectionHandler that is leaked, there are 128KB of buffer space, so
> the leak is pretty fast.

Every ConnectionHandler is also a thread, so it will live regardless of
whether there are references to it. If we have tons of MessageMemories
lying around long after there connections are dead, then we have a
problem right there.

> I've attached a proposed fix.  It works for me, but someone should review it
> before I check it in.  In the patch I have the ConnectionHandler null-out
> its members when closed.  Another approach would be to have the Message
> null-out the ConnectionHandler, but I'm not sure where in the code that
> should be done.

Nulling out the variables when you close won't do any harm. You would need
a reference back to the message to tell it forget the ConnectionHandler.

And I still don't see where all these messages are coming from - the only
time I can think of when a message is stored in the MM is between the
StoreData is received and when it is sent. And once it is sent the MM is
killed.

> (BTW, the flags I've used are '-verbosegc' and '-Xrunhprof'.  SIGQUIT causes the
> latter to dump a snapshot to java.hprof.txt.  Look for "SITES BEGIN" in that
> file and then under the 'live objects' column.)
> 
> -- 
> Dev Random
> Fingerprint: 3ABC FCEF 1BCE 4528 E4FD  15EB 173A 76D2 6959 DAF1

> Index: ConnectionHandler.java
> ===================================================================
> RCS file: /cvsroot/freenet/Freenet/ConnectionHandler.java,v
> retrieving revision 1.70
> diff -u -r1.70 ConnectionHandler.java
> --- ConnectionHandler.java    2000/12/05 09:57:29     1.70
> +++ ConnectionHandler.java    2000/12/31 03:17:24
> @@ -80,12 +80,17 @@
>               Core.logger.log(this,"Failed to initialize connection: " + e,
>                               Logger.MINOR);
>               closed = true;
> +             synchronized (c.initLock) {
> +                 c.initLock.notifyAll();
> +             }
>               forceClose();
>               return;
>           } finally {
>               sendLock.notifyAll();
> -             synchronized (c.initLock) {
> -                 c.initLock.notifyAll();
> +             if (c != null) {
> +                 synchronized (c.initLock) {
> +                     c.initLock.notifyAll();
> +                 }
>               }
>               synchronized (initLock) {
>                   initLock.notifyAll();
> @@ -206,7 +211,7 @@
>           lastActiveTime = System.currentTimeMillis();
>       } while (!closed);
>  
> -     if (c.out != null) {
> +     if (c != null && c.out != null) {
>           Core.logger.log(this,"Finished with connection - closing",
>                           Logger.DEBUGGING);
>           forceClose();
> @@ -233,7 +238,7 @@
>       */
>      public void sendMessage(Message m, MessageObject mo) 
>       throws SendFailedException {
> -     while (!c.ready() && !closed) {
> +     while (!closed && !c.ready()) {
>           synchronized(initLock) {
>               try {
>                   initLock.wait();
> @@ -241,7 +246,8 @@
>           }
>       }
>  
> -     if (closed) throw new SendFailedException(c.getPeerAddress());
> +     if (closed)
> +         throw new SendFailedException((c == null) ? null : c.getPeerAddress());
>  
>       synchronized(sendLock) {
>           unlockedSend(m, mo);
> @@ -320,6 +326,9 @@
>      public void forceClose() {
>       closed = true;
>       c.close();
> +     c = null;
> +     t = null;
> +     mh = null;
>       exec_instance.interrupt();
>      }
>  




-- 
'DeCSS would be fine. Where is it?'
'Here,' Montag touched his head.
'Ah,' Granger smiled and nodded.

Oskar Sandberg
[EMAIL PROTECTED]

_______________________________________________
Freenet-dev mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/mailman/listinfo/freenet-dev

Reply via email to