You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2013/01/23 22:22:16 UTC

svn commit: r1437740 - in /commons/proper/net/trunk/src: changes/changes.xml main/java/org/apache/commons/net/ftp/FTPClient.java

Author: sebb
Date: Wed Jan 23 21:22:15 2013
New Revision: 1437740

URL: http://svn.apache.org/viewvc?rev=1437740&view=rev
Log:
NET-465 FTPClient setSendBufferSize and setReceiveBufferSize on data socket
Reworked the original fix.

Modified:
    commons/proper/net/trunk/src/changes/changes.xml
    commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java

Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1437740&r1=1437739&r2=1437740&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml (original)
+++ commons/proper/net/trunk/src/changes/changes.xml Wed Jan 23 21:22:15 2013
@@ -64,6 +64,11 @@ The <action> type attribute can be add,u
     <body>
         <release version="3.3" date="TBA" description="
         ">
+            <action issue="NET-465" dev="sebb" type="fix">
+            FTPClient setSendBufferSize and setReceiveBufferSize on data socket.
+            The previous fix caused performance problems.
+            Added new getters and setters for the SO_SNDBUF and SO_RCVBUF values to be used on the data socket.
+            </action>
             <action issue="NET-496" dev="sebb" type="add">
             Util copyReader/copyStream classes should use default buffer size for non-positive buffer size parameters.
             </action>

Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java?rev=1437740&r1=1437739&r2=1437740&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java (original)
+++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java Wed Jan 23 21:22:15 2013
@@ -361,7 +361,9 @@ implements Configurable
     private boolean __remoteVerificationEnabled;
     private long __restartOffset;
     private FTPFileEntryParserFactory __parserFactory;
-    private int __bufferSize;
+    private int __bufferSize; // buffersize for buffered data streams
+    private int __sendDataSocketBufferSize;
+    private int __receiveDataSocketBufferSize;
     private boolean __listHiddenFiles;
     private boolean __useEPSVwithIPv4; // whether to attempt EPSV with an IPv4 connection
 
@@ -478,7 +480,7 @@ implements Configurable
         __systemName         = null;
         __entryParser        = null;
         __entryParserKey    = "";
-        __bufferSize         = Util.DEFAULT_COPY_BUFFER_SIZE;
+        __bufferSize         = 0;
         __featuresMap = null;
     }
 
@@ -826,6 +828,12 @@ implements Configurable
                 if (__dataTimeout >= 0) {
                     socket.setSoTimeout(__dataTimeout);
                 }
+                if (__receiveDataSocketBufferSize > 0) {
+                    socket.setReceiveBufferSize(__receiveDataSocketBufferSize);
+                }
+                if (__sendDataSocketBufferSize > 0) {
+                    socket.setSendBufferSize(__sendDataSocketBufferSize);
+                }
             } finally {
                 server.close();
             }
@@ -858,6 +866,12 @@ implements Configurable
             }
 
             socket = _socketFactory_.createSocket();
+            if (__receiveDataSocketBufferSize > 0) {
+                socket.setReceiveBufferSize(__receiveDataSocketBufferSize);
+            }
+            if (__sendDataSocketBufferSize > 0) {
+                socket.setSendBufferSize(__sendDataSocketBufferSize);
+            }
             if (__passiveLocalHost != null) {
                 socket.bind(new InetSocketAddress(__passiveLocalHost, 0));
             }
@@ -893,11 +907,6 @@ implements Configurable
                     " is not same as server " + getRemoteAddress().getHostAddress());
         }
 
-        if ( __bufferSize > 0 ) {
-            socket.setReceiveBufferSize(__bufferSize);
-            socket.setSendBufferSize(__bufferSize);
-        }
-
         return socket;
     }
 
@@ -3435,6 +3444,42 @@ implements Configurable
     }
 
     /**
+     * Sets the value to be used for the data socket SO_SNDBUF option.
+     * If the value is positive, the option will be set when the data socket has been created.
+     *
+     * @param bufSize The size of the buffer, zero or negative means the value is ignored.
+     */
+    public void setSendDataSocketBufferSize(int bufSize) {
+        __sendDataSocketBufferSize = bufSize;
+    }
+
+    /**
+     * Retrieve the value to be used for the data socket SO_SNDBUF option.
+     * @return The current buffer size.
+     */
+    public int getSendDataSocketBufferSize() {
+        return __sendDataSocketBufferSize;
+    }
+
+    /**
+     * Sets the value to be used for the data socket SO_RCVBUF option.
+     * If the value is positive, the option will be set when the data socket has been created.
+     *
+     * @param bufSize The size of the buffer, zero or negative means the value is ignored.
+     */
+    public void setReceieveDataSocketBufferSize(int bufSize) {
+        __receiveDataSocketBufferSize = bufSize;
+    }
+
+    /**
+     * Retrieve the value to be used for the data socket SO_RCVBUF option.
+     * @return The current buffer size.
+     */
+    public int getReceiveDataSocketBufferSize() {
+        return __receiveDataSocketBufferSize;
+    }
+
+    /**
      * Implementation of the {@link Configurable Configurable} interface.
      * In the case of this class, configuring merely makes the config object available for the
      * factory methods that construct parsers.