Update of /cvsroot/freenet/freenet/src/freenet
In directory sc8-pr-cvs1:/tmp/cvs-serv20709/src/freenet

Modified Files:
        ConnectionHandler.java PeerHandler.java PeerPacket.java 
        PeerPacketMessage.java Version.java 
Log Message:
6222: some major bugfixes, and logging. Probably introduces some major bugs too, but 
probably not as major as the ones it eliminates. Will work more on this tomorrow!


Index: ConnectionHandler.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/ConnectionHandler.java,v
retrieving revision 1.166
retrieving revision 1.167
diff -u -r1.166 -r1.167
--- ConnectionHandler.java      4 Oct 2003 22:29:34 -0000       1.166
+++ ConnectionHandler.java      7 Oct 2003 00:47:30 -0000       1.167
@@ -962,7 +962,11 @@
                Core.logger.log(this, "Partial notification: "+size+" bytes written 
successfully on "+
                                                this, Logger.DEBUG);
                lastSizeDone = size;
-               sentPacket.jobDone(false, size, peer);
+               if(sentPacket == null)
+                       Core.logger.log(this, "sentPacket NULL in jobPartDone! for 
"+this,
+                                                       Logger.ERROR);
+               else
+                       sentPacket.jobDone(false, size, peer, null);
 //             if(sentMessages.size() > 0) {
 //                     synchronized(sendLock) { // avoid deadlock
 //                             synchronized(sentMessages) {
@@ -1041,16 +1045,11 @@
                lastActiveTime = System.currentTimeMillis();
                if(logDEBUG)logDEBUG("CH.jobDone("+size+","+status+") for "+this+
                                                         " trailingPresent 
"+trailingPresent);
-               // Open new conn if necessary
-               
-               if(identity != null &&
-                  ocm.needsConnection(identity))
-                       Main.node.scheduleConnectionOpener(identity);
-               //this is an overkill
-               //shouldn't it also happen _after_ reducing the counters? --zab
                
                //we should check the status if terminate() is called from elsewhere 
                if (!status) {
+                       if(logDEBUG)
+                               logDEBUG("jobDone failed");
                        //tell everybody they failed 
                        //this is where the PeerHandler will really help
                        // Locking!
@@ -1059,12 +1058,15 @@
                                if(sentPacket == null)
                                        Core.logger.log(this, "sentPacket NULL! for 
"+this,
                                                                        new 
Exception("debug"), Logger.ERROR);
-                               else
-                                       sentPacket.jobDone(true, size, peer);
+                               else {
+                                       sentPacket.jobDone(true, size, peer, null);
+                               }
+                               return;
                        }
-                       return;
                }
                if (sendingTrailerChunk) {
+                       if(logDEBUG)
+                               logDEBUG("jobDone sending chunk");
                        if(size == sendingTrailerChunkBytes) {
                                synchronized(trailerSendLock) {
                                        trailerSentBytes += size;
@@ -1092,12 +1094,52 @@
                                if(twcb != null) twcb.closed();
                                return; // closed conn, don't need another packet
                        }
-               } else if(sentPacket != null) {
-                       sentPacket.jobDone(true, size, peer);
+               } else {
+                       if(logDEBUG) logDEBUG("still here - not sending trailer 
chunk");
+                       TrailerWriter tw = null;
+                       PeerPacket packet = null;
+                       synchronized(sentPacketLock) {
+                               if(logDEBUG)
+                                       logDEBUG("synchronized");
+                               if(sentPacket != null) {
+                                       packet = sentPacket;
+                                       if(logDEBUG)
+                                               logDEBUG("sentPacket != null");
+                                       sentPacket = null;
+                                       if(logDEBUG)
+                                               logDEBUG("Set sentPacket to null");
+                               }
+                       }
+                       if(packet != null) {
+                               if(logDEBUG)
+                                       logDEBUG("Packet not null");
+                               if(packet.hasTrailer()) {
+                                       if(logDEBUG)
+                                               logDEBUG("packet has trailer");
+                                       int sendId;
+                                       synchronized(trailerSendIDCounterLock) {
+                                               trailerSendIDCounter++;
+                                               if(trailerSendIDCounter < 0)
+                                                       trailerSendIDCounter = 0;
+                                               sendId = trailerSendIDCounter;
+                                       }
+                                       synchronized(trailerSendLock) {
+                                               trailerSendID = sendId;
+                                               trailerSendLength = 
packet.trailerLength();
+                                               trailerSentBytes = 0;
+                                       }
+                                       tw = new MyTrailerWriter(sendId);
+                               }
+                               if(packet != null)
+                                       packet.jobDone(true, size, peer, tw);
+                       }
                }
                boolean needTerminate = false; // don't terminate while holding locks!
                if(sendClosed.state() && !sendingCloseMessage) return;
+               if(logDEBUG)
+                       logDEBUG("Trying to send a packet...");
                synchronized(sentPacketLock) {
+                       logDEBUG("synchronized...");
                        if(sendingCloseMessage) {
                                Message  cm  = p.getCloseMessage();
                                if(cm != null) {
@@ -2102,7 +2144,7 @@
                if(sendClosed.state()) {
                        Core.logger.log(this, "sendPacket("+packet+","+prio+
                                                        ") when already closed: 
"+this, Logger.NORMAL);
-                       packet.jobDone(true, 0, peer);
+                       packet.jobDone(true, 0, peer, null);
                        return;
                }
                synchronized(sentPacketLock) {
@@ -2133,7 +2175,7 @@
                                sendClosed.change(true);
                                sendLock.notifyAll();
                        }
-                       sentPacket.jobDone(true, 0, peer);
+                       sentPacket.jobDone(true, 0, peer, null);
                } catch (Throwable t) {
                        Core.logger.log(this, "Caught "+t+ " trying to send packet "+
                                                        sentPacket, t, Logger.ERROR);
@@ -2141,7 +2183,7 @@
                                sendClosed.change(true);
                                sendLock.notifyAll();
                        }
-                       sentPacket.jobDone(true, 0, peer);
+                       sentPacket.jobDone(true, 0, peer, null);
                }
        }
        

Index: PeerHandler.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/PeerHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- PeerHandler.java    4 Oct 2003 22:35:45 -0000       1.4
+++ PeerHandler.java    7 Oct 2003 00:47:30 -0000       1.5
@@ -35,7 +35,7 @@
     public static final int NORMAL = 1;
     
        public String toString() {
-               return super.toString() + " ("+id+")";
+               return super.toString() + " ("+id+","+ref+")";
        }
        
        /**
@@ -90,22 +90,39 @@
         * identity (see *Routing).
         */
     public boolean needsConnection() {
+               if(Core.logger.shouldLog(Logger.DEBUG, this))
+                       Core.logger.log(this, "needsConnection(): "+
+                                                       this+": 
"+connectionHandlers.size(),
+                                                       Logger.DEBUG);
                if(messages.isEmpty() &&
                   (id == null || (!(node.rt.references(id))))) return false;
                // FIXME: layering
                
+               int closedCount = 0;
+               int sendingCount = 0;
                synchronized(connectionHandlers) {
                        for(Iterator e = connectionHandlers.listIterator(0);
                                e.hasNext();) {
                                ConnectionHandler ch = (ConnectionHandler)(e.next());
-                               if(!ch.isOpen()) continue;
-                               if(ch.sending()) continue;
+                               if(!ch.isOpen()) {
+                                       closedCount++;
+                                       continue;
+                               }
+                               if(ch.sending()) {
+                                       sendingCount++;
+                                       continue;
+                               }
                                // If it is sending a trailer, it is not available
 //                             if(ch.isSendingPacket()) continue;
                                // But if it is sending only packets, it *IS* available
                                return false;
                        }
                }
+               if(Core.logger.shouldLog(Logger.DEBUG, this))
+                       Core.logger.log(this, "needsConnection(): "+
+                                                       this+": 
"+connectionHandlers.size()+
+                                                       " closed "+closedCount+", 
sending "+
+                                                       sendingCount, Logger.DEBUG);
                return true;
     }
     
@@ -157,14 +174,14 @@
      * Start an asynchronous message send
      * Call the callback provided when it is finished
      */
-    public synchronized void sendMessageAsync(Message r, MessageSendCallback cb,
+    public void sendMessageAsync(Message r, MessageSendCallback cb,
                                                                                       
   int msgPrio)
                throws SendFailedException {
                PeerPacketMessage pm = new PeerPacketMessage(id, r, cb, msgPrio);
                innerSendMessageAsync(pm);
        }
        
-       protected synchronized void innerSendMessageAsync(PeerPacketMessage pm) {
+       protected void innerSendMessageAsync(PeerPacketMessage pm) {
                /* Possibilities:
                 *
                 * 1. No ConnectionHandlers (without trailing fields) open.
@@ -330,9 +347,12 @@
                        new MyMessageSendCallback();
                PeerPacketMessage pm = new PeerPacketMessage(id, r, cb, msgPrio);
                innerSendMessageAsync(pm);
+               Core.logger.log(this, "Sent "+pm+" async", Logger.DEBUG);
                long timeoutAt = System.currentTimeMillis() + timeout;
                synchronized(cb) {
+                       Core.logger.log(this, "Synced", Logger.DEBUG);
                        while(!cb.finished) {
+                               Core.logger.log(this, "Waiting...", Logger.DEBUG);
                                try {
                                        long waitTime;
                                        if(timeout > 0) {
@@ -344,6 +364,7 @@
                        }
                }
                if(!cb.finished) {
+                       Core.logger.log(this, "Not finished", Logger.DEBUG);
                        // Couldn't send message
                        unsendMessage(pm);
                        throw new SendFailedException(null, // FIXME?
@@ -375,6 +396,9 @@
                Exception e = null;
                TrailerWriter trailer = null;
                public void succeeded() {
+                       Core.logger.log(this, "Succeeded "+this,
+                                                       new Exception("debug"),
+                                                       Logger.DEBUG);
                        finished = true;
                        synchronized(this) {
                                this.notify();
@@ -382,14 +406,19 @@
                }
                
                public void thrown(Exception e) {
+                       Core.logger.log(this, "Failed: "+e+" ("+this+")",
+                                                       new Exception("debug"),
+                                                       Logger.DEBUG);
                        this.e = e;
                        finished = true;
                        synchronized(this) {
                                this.notify();
                        }
                }
-       
+               
                public void setTrailerWriter(TrailerWriter tw) {
+                       Core.logger.log(this, "setTrailerWriter("+tw+")",
+                                                       new Exception("debug"), 
Logger.DEBUG);
                        trailer = tw;
                }
     }

Index: PeerPacket.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/PeerPacket.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- PeerPacket.java     4 Oct 2003 22:29:34 -0000       1.4
+++ PeerPacket.java     7 Oct 2003 00:47:30 -0000       1.5
@@ -8,6 +8,7 @@
     PeerPacketMessage[] messages;
     byte[] encryptedData; // plaintext. Encrypt at send time.
     int sentBytes;
+    boolean hasTrailer = false;
     
     /**
      * Create a PeerPacket
@@ -22,8 +23,11 @@
            PeerPacketMessage m = msgs[i];
            m.resolve(p);
            totalLength += m.getLength();
-           if((i != (msgs.length-1)) && m.hasTrailer())
-               throw new IllegalArgumentException("trailers can only be attached to 
the LAST message!");
+           if(m.hasTrailer()) {
+               if(i != (msgs.length-1))
+                   throw new IllegalArgumentException("trailers can only be attached 
to the LAST message!");
+               hasTrailer = true;
+           }
        }
        encryptedData = new byte[totalLength];
        int x = 0;
@@ -46,6 +50,14 @@
        return encryptedData;
     }
     
+    public boolean hasTrailer() {
+       return hasTrailer;
+    }
+    
+    public long trailerLength() {
+       return messages[messages.length-1].trailerLength();
+    }
+    
     public int countMessages() {
        return messages.length;
     }
@@ -55,10 +67,11 @@
      * @param finished whether the packet has finished sending. If false,
      * we are still sending it.
      * @param successfullySentBytes the number of bytes successfully sent.
+     * @param tw the TrailerWriter attached to the final message, if necessary
      * Can be zero. Bytes after this number might have been sent, but we got
      * an error and can't be sure.
      */
-    public void jobDone(boolean finished, int successfullySentBytes, Peer sentTo) {
+    public void jobDone(boolean finished, int successfullySentBytes, Peer sentTo, 
TrailerWriter tw) {
        int msgStartOffset = 0;
        // Could unfold this a bit by keeping the offset in the array on the object
        PeerPacketMessage prev = null;
@@ -85,7 +98,7 @@
                int diff = successfullySentBytes - msgStartOffset;
                if(finished || diff >= prevLen) {
                    if(diff >= prevLen) {
-                       prev.notifySuccess();
+                       prev.notifySuccess(tw);
                    } else {
                        String excuse = "Sent "+
                            (diff>=0 ? diff : 0) +
@@ -106,7 +119,7 @@
            boolean success = (successfullySentBytes == encryptedData.length);
            if(finished || success) {
                if(success)
-                   prev.notifySuccess();
+                   prev.notifySuccess(tw);
                else {
                    int diff = successfullySentBytes - msgStartOffset;
                    String excuse = "Sent "+

Index: PeerPacketMessage.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/PeerPacketMessage.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PeerPacketMessage.java      4 Oct 2003 01:16:56 -0000       1.2
+++ PeerPacketMessage.java      7 Oct 2003 00:47:30 -0000       1.3
@@ -92,7 +92,7 @@
     /**
      * Notify the callback that we successfully sent the message.
      */
-    public void notifySuccess() {
+    public void notifySuccess(TrailerWriter tw) {
        if(finished) {
            Core.logger.log(this, "notifySuccess on "+this+" already finished!",
                            Logger.ERROR);
@@ -101,6 +101,7 @@
        finished = true;
        if(cb == null) return;
        try {
+           if(tw != null) cb.setTrailerWriter(tw);
            cb.succeeded();
        } catch (Throwable t) {
            Core.logger.log(this, toString()+".notifySuccess() caught "+t,

Index: Version.java
===================================================================
RCS file: /cvsroot/freenet/freenet/src/freenet/Version.java,v
retrieving revision 1.414
retrieving revision 1.415
diff -u -r1.414 -r1.415
--- Version.java        6 Oct 2003 15:20:53 -0000       1.414
+++ Version.java        7 Oct 2003 00:47:30 -0000       1.415
@@ -18,7 +18,7 @@
     public static String protocolVersion = "1.46";
     
     /** The build number of the current revision */
-    public static final int buildNumber = 6221;
+    public static final int buildNumber = 6222;
     // 6028: may 3; ARK retrieval fix
 
     public static final int ignoreBuildsAfter = 6500;

_______________________________________________
cvs mailing list
[EMAIL PROTECTED]
http://dodo.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to