Return-Path: Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: (qmail 62643 invoked from network); 20 Jan 2010 12:34:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 20 Jan 2010 12:34:47 -0000 Received: (qmail 70013 invoked by uid 500); 20 Jan 2010 12:34:47 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 69986 invoked by uid 500); 20 Jan 2010 12:34:47 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 69977 invoked by uid 99); 20 Jan 2010 12:34:47 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 20 Jan 2010 12:34:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 20 Jan 2010 12:34:46 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id A10D123889CB; Wed, 20 Jan 2010 12:34:26 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r901165 - /db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java Date: Wed, 20 Jan 2010 12:34:26 -0000 To: derby-commits@db.apache.org From: kristwaa@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100120123426.A10D123889CB@eris.apache.org> Author: kristwaa Date: Wed Jan 20 12:34:26 2010 New Revision: 901165 URL: http://svn.apache.org/viewvc?rev=901165&view=rev Log: DERBY-4519: Infinite loop in StreamFileContainer.writeColumn Fixed two issues; - swapped offset and length arguments (removed them for the read-case) - bounded the transfer buffer size, becuause InputStream.available() can return both zero and a very high value. Size bounded by [64, 8192]. Patch file: derby-4519-2a-infinite_loop_fixes.diff Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java?rev=901165&r1=901164&r2=901165&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/StreamFileContainer.java Wed Jan 20 12:34:26 2010 @@ -731,16 +731,24 @@ if (column instanceof InputStream) { InputStream inColumn = (InputStream) column; - int bufferLen = inColumn.available(); + // Set a reasonable buffer size. + // To avoid extremely inefficient reads, and an infinite loop when + // InputStream.available() returns zero, a lower limit is set on + // the buffer size. To avoid using too much memory (especially in + // multi-user environments) an upper limit is set as well. + // The limits can be tuned, but note that using a too high default + // or lower limit can put unnecessary pressure on the memory sub- + // system and the GC process. + int bufferLen = Math.min(Math.max(inColumn.available(), 64), 8192); byte[] bufData = new byte[bufferLen]; do { - int lenRead = inColumn.read(bufData, bufferLen, 0); + int lenRead = inColumn.read(bufData); if (lenRead != -1) { fieldDataLength += lenRead; - out.write(bufData, lenRead, 0); + out.write(bufData, 0, lenRead); } else {