You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2015/01/29 16:18:01 UTC

svn commit: r1655702 - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src: main/java/org/apache/chemistry/opencmis/server/impl/webservices/ test/java/org/apache/chemistry/opencmis/server/impl/

Author: fmui
Date: Thu Jan 29 15:18:01 2015
New Revision: 1655702

URL: http://svn.apache.org/r1655702
Log:
Server: Web Services: reduced memory footprint

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/ProtectionRequestWrapper.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/CheckServletInputStreamTest.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/ProtectionRequestWrapper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/ProtectionRequestWrapper.java?rev=1655702&r1=1655701&r2=1655702&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/ProtectionRequestWrapper.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/main/java/org/apache/chemistry/opencmis/server/impl/webservices/ProtectionRequestWrapper.java Thu Jan 29 15:18:01 2015
@@ -86,7 +86,7 @@ public class ProtectionRequestWrapper ex
 
         public CheckServletInputStream() {
             streamMax = messageMax + 2 * (boundary.length + 6);
-            linebuffer = new byte[64 * 1024];
+            linebuffer = new byte[32 * 1024];
             pos = 0;
             count = 0;
             boundariesFound = 0;
@@ -160,29 +160,38 @@ public class ProtectionRequestWrapper ex
         }
 
         private void checkBoundary(int startPos) {
-            int lastStartPos = 0;
+            int lastLineFeed = -1;
             for (int i = startPos; i < pos; i++) {
                 if (linebuffer[i] == LF) {
-                    if (countBoundaries(lastStartPos, i)) {
+                    if (countBoundaries(i)) {
                         return;
                     }
-
-                    lastStartPos = i + 1;
+                    lastLineFeed = i;
                 }
             }
 
-            if (lastStartPos > 0) {
-                if (lastStartPos == pos) {
+            if (lastLineFeed == -1) {
+                if (pos > boundary.length + 3) {
+                    // buffer is bigger than the boundary and doesn't contain a
+                    // LF -> only keep the length of the boundary plus three
+                    // characters (two dashes and a CR)
+                    System.arraycopy(linebuffer, pos - (boundary.length + 3), linebuffer, 0, boundary.length + 3);
+                    pos = boundary.length + 3;
+                }
+            } else {
+                if (lastLineFeed == pos - 1) {
+                    // last byte is a LF -> discard the whole buffer
                     pos = 0;
                 } else {
-                    System.arraycopy(linebuffer, lastStartPos, linebuffer, 0, pos - lastStartPos);
-                    pos = pos - lastStartPos;
+                    // only keep bytes after the last LF
+                    System.arraycopy(linebuffer, lastLineFeed + 1, linebuffer, 0, pos - (lastLineFeed + 1));
+                    pos = pos - (lastLineFeed + 1);
                 }
             }
         }
 
-        private boolean countBoundaries(int startPos, int newLinePos) {
-            if (isBoundary(startPos, newLinePos)) {
+        private boolean countBoundaries(int lineFeedPos) {
+            if (isBoundary(lineFeedPos)) {
                 boundariesFound++;
 
                 if (boundariesFound == 2) {
@@ -195,12 +204,14 @@ public class ProtectionRequestWrapper ex
             return boundariesFound > 1;
         }
 
-        private boolean isBoundary(int startPos, int newLinePos) {
+        private boolean isBoundary(int lineFeedPos) {
             // a boundary consists of two dashes, the boundary and a CR
             // -> boundary line length == boundary length + three characters
-            if (newLinePos - startPos == boundary.length + 3) {
+            int startPos = lineFeedPos - (boundary.length + 3);
+
+            if (startPos >= 0) {
                 if (linebuffer[startPos] == DASH && linebuffer[startPos + 1] == DASH
-                        && linebuffer[startPos + boundary.length + 2] == CR) {
+                        && linebuffer[lineFeedPos - 1] == CR) {
 
                     for (int i = 0; i < boundary.length; i++) {
                         if (linebuffer[startPos + i + 2] != boundary[i]) {
@@ -270,7 +281,7 @@ public class ProtectionRequestWrapper ex
                 throw new IOException("SOAP message too big!");
             }
 
-            int expand = (len < 64 * 1024 ? 64 * 1024 : len);
+            int expand = (len < 32 * 1024 ? 32 * 1024 : len);
             byte[] newBuffer = new byte[linebuffer.length + expand];
             System.arraycopy(linebuffer, 0, newBuffer, 0, pos);
             linebuffer = newBuffer;

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/CheckServletInputStreamTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/CheckServletInputStreamTest.java?rev=1655702&r1=1655701&r2=1655702&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/CheckServletInputStreamTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-bindings/src/test/java/org/apache/chemistry/opencmis/server/impl/CheckServletInputStreamTest.java Thu Jan 29 15:18:01 2015
@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
+import java.util.Random;
 
 import org.apache.chemistry.opencmis.server.impl.webservices.ProtectionRequestWrapper;
 import org.junit.Test;
@@ -76,6 +77,45 @@ public class CheckServletInputStreamTest
         baseTest(100 * 1024, 80 * 1024, 79 * 1024, 1234, true);
     }
 
+    @Test
+    public void testStream10() {
+        baseTest(900 * 1024, 1 * 1024 * 1024, 900 * 1024, 8 * 1024, true);
+    }
+
+    @Test
+    public void testStream11() {
+        baseTest(900 * 1024, 512 * 1024, 900 * 1024, 8 * 1024, false);
+    }
+
+    @Test
+    public void testStream12() {
+        baseTest(900 * 1024, 1 * 1024 * 1024, 700 * 1024, 2345, true);
+    }
+
+    @Test
+    public void testStream13() {
+        baseTest(900 * 1024, 1 * 1024 * 1024, 700, 2345, true);
+    }
+
+    @Test
+    public void testStream14() {
+        baseTest(900 * 1024, 1 * 1024 * 1024, 2048, 2345, true);
+    }
+
+    @Test
+    public void testStreamRandom() {
+        int bufferSize = 1 * 1024 * 1024;
+        Random rnd = new Random(1234567890);
+
+        for (int i = 0; i < 100; i++) {
+            int max = rnd.nextInt(bufferSize);
+            int soap = rnd.nextInt(bufferSize);
+            int readBufferSize = rnd.nextInt(64 * 1024);
+
+            baseTest(bufferSize, max, soap, readBufferSize, soap <= max);
+        }
+    }
+
     private void baseTest(int bufferSize, int max, int soap, int readBufferSize, boolean success) {
 
         byte[] boundaryBytes = ("\r\n--" + BOUNDARY + "\r\n").getBytes();