# HG changeset patch
# User cli
# Date 1261752166 -3600
# Node ID dd05c3f2fa24cdaf391f4a46d367a27fe0376e49
# Parent  2ff819fa5be1dff181c126cc2a32ed73bf32765e
Fix for too early disconnects on slow client connections. (#563)

diff -r 2ff819fa5be1 -r dd05c3f2fa24 org/sonews/daemon/ChannelLineBuffers.java
--- a/org/sonews/daemon/ChannelLineBuffers.java	Wed Aug 26 17:04:04 2009 +0200
+++ b/org/sonews/daemon/ChannelLineBuffers.java	Fri Dec 25 15:42:46 2009 +0100
@@ -124,6 +124,18 @@
       }
     }
   }
+
+  /**
+   * @return false if there are output buffers pending to be written to the
+   * client.
+   */
+  boolean isOutputBufferEmpty()
+  {
+    synchronized(outputBuffers)
+    {
+      return outputBuffers.isEmpty();
+    }
+  }
   
   /**
    * Goes through the input buffer of the given channel and searches
diff -r 2ff819fa5be1 -r dd05c3f2fa24 org/sonews/daemon/ChannelWriter.java
--- a/org/sonews/daemon/ChannelWriter.java	Wed Aug 26 17:04:04 2009 +0200
+++ b/org/sonews/daemon/ChannelWriter.java	Fri Dec 25 15:42:46 2009 +0100
@@ -169,6 +169,9 @@
           // events until we have something to write to the socket channel
           //selKey.cancel();
           selKey.interestOps(0);
+          // Update activity timestamp to prevent too early disconnects
+          // on slow client connections
+          connection.setLastActivity(System.currentTimeMillis());
           return;
         }
  
diff -r 2ff819fa5be1 -r dd05c3f2fa24 org/sonews/daemon/Connections.java
--- a/org/sonews/daemon/Connections.java	Wed Aug 26 17:04:04 2009 +0200
+++ b/org/sonews/daemon/Connections.java	Fri Dec 25 15:42:46 2009 +0100
@@ -134,7 +134,8 @@
         while (iter.hasNext())
         {
           conn = iter.next();
-          if((System.currentTimeMillis() - conn.getLastActivity()) > timeoutMillis)
+          if((System.currentTimeMillis() - conn.getLastActivity()) > timeoutMillis
+              && conn.getBuffers().isOutputBufferEmpty())
           {
             // A connection timeout has occurred so purge the connection
             iter.remove();
diff -r 2ff819fa5be1 -r dd05c3f2fa24 org/sonews/daemon/NNTPConnection.java
--- a/org/sonews/daemon/NNTPConnection.java	Wed Aug 26 17:04:04 2009 +0200
+++ b/org/sonews/daemon/NNTPConnection.java	Fri Dec 25 15:42:46 2009 +0100
@@ -18,7 +18,6 @@
 
 package org.sonews.daemon;
 
-import org.sonews.util.Log;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.net.SocketException;
@@ -34,6 +33,7 @@
 import org.sonews.daemon.command.Command;
 import org.sonews.storage.Article;
 import org.sonews.storage.Channel;
+import org.sonews.util.Log;
 import org.sonews.util.Stats;
 
 /**
@@ -408,5 +408,10 @@
   {
     this.charset = charset;
   }
+
+  void setLastActivity(long timestamp)
+  {
+    this.lastActivity = timestamp;
+  }
   
 }
diff -r 2ff819fa5be1 -r dd05c3f2fa24 org/sonews/storage/impl/JDBCDatabase.java
--- a/org/sonews/storage/impl/JDBCDatabase.java	Wed Aug 26 17:04:04 2009 +0200
+++ b/org/sonews/storage/impl/JDBCDatabase.java	Fri Dec 25 15:42:46 2009 +0100
@@ -1752,6 +1752,7 @@
     // INSERT INTO headers ...
 
     // SELECT * FROM postings WHERE article_id = ? AND group_id = ?
+    return false;
   }
 
   /**