This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push: new 8ed94f7 Merge BufferPool15Impl into BufferPool 8ed94f7 is described below commit 8ed94f7a33f62315b1fd490ce2845a05660ffd35 Author: remm <r...@apache.org> AuthorDate: Wed Apr 29 14:20:31 2020 +0200 Merge BufferPool15Impl into BufferPool Also add (!!) a system property to configure the static buffer pool size, since it was fixed to 100MB. This static pool may not be beneficial anymore and could be reviewed. --- java/org/apache/catalina/tribes/io/BufferPool.java | 81 ++++++++++++---------- .../catalina/tribes/io/BufferPool15Impl.java | 67 ------------------ webapps/docs/changelog.xml | 9 +++ webapps/docs/config/systemprops.xml | 6 ++ 4 files changed, 59 insertions(+), 104 deletions(-) diff --git a/java/org/apache/catalina/tribes/io/BufferPool.java b/java/org/apache/catalina/tribes/io/BufferPool.java index a44a1da..4c77c20 100644 --- a/java/org/apache/catalina/tribes/io/BufferPool.java +++ b/java/org/apache/catalina/tribes/io/BufferPool.java @@ -17,68 +17,75 @@ package org.apache.catalina.tribes.io; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + import org.apache.catalina.tribes.util.StringManager; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; -/** - * - * - * @version 1.0 - */ public class BufferPool { private static final Log log = LogFactory.getLog(BufferPool.class); - public static final int DEFAULT_POOL_SIZE = 100*1024*1024; //100MB + public static final int DEFAULT_POOL_SIZE = + Integer.getInteger("org.apache.catalina.tribes.io.BufferPool.DEFAULT_POOL_SIZE", 100*1024*1024); //100MB protected static final StringManager sm = StringManager.getManager(BufferPool.class); - - protected static volatile BufferPool instance = null; - protected final BufferPoolAPI pool; - - private BufferPool(BufferPoolAPI pool) { - this.pool = pool; - } - - public XByteBuffer getBuffer(int minSize, boolean discard) { - if ( pool != null ) return pool.getBuffer(minSize, discard); - else return new XByteBuffer(minSize,discard); - } - - public void returnBuffer(XByteBuffer buffer) { - if ( pool != null ) pool.returnBuffer(buffer); - } - - public void clear() { - if ( pool != null ) pool.clear(); - } - public static BufferPool getBufferPool() { if (instance == null) { synchronized (BufferPool.class) { if (instance == null) { - BufferPoolAPI pool = new BufferPool15Impl(); - pool.setMaxSize(DEFAULT_POOL_SIZE); - log.info(sm.getString("bufferPool.created", - Integer.toString(DEFAULT_POOL_SIZE), pool.getClass().getName())); - instance = new BufferPool(pool); + BufferPool pool = new BufferPool(); + pool.setMaxSize(DEFAULT_POOL_SIZE); + log.info(sm.getString("bufferPool.created", + Integer.toString(DEFAULT_POOL_SIZE), + pool.getClass().getName())); + instance = pool; } } } return instance; } + private BufferPool() { + } - public static interface BufferPoolAPI { - public void setMaxSize(int bytes); + public XByteBuffer getBuffer(int minSize, boolean discard) { + XByteBuffer buffer = queue.poll(); + if ( buffer != null ) size.addAndGet(-buffer.getCapacity()); + if ( buffer == null ) buffer = new XByteBuffer(minSize,discard); + else if ( buffer.getCapacity() <= minSize ) buffer.expand(minSize); + buffer.setDiscard(discard); + buffer.reset(); + return buffer; + } - public XByteBuffer getBuffer(int minSize, boolean discard); + public void returnBuffer(XByteBuffer buffer) { + if ( (size.get() + buffer.getCapacity()) <= maxSize ) { + size.addAndGet(buffer.getCapacity()); + queue.offer(buffer); + } + } + + public void clear() { + queue.clear(); + size.set(0); + } - public void returnBuffer(XByteBuffer buffer); + protected int maxSize; + protected final AtomicInteger size = new AtomicInteger(0); + protected final ConcurrentLinkedQueue<XByteBuffer> queue = + new ConcurrentLinkedQueue<>(); - public void clear(); + public void setMaxSize(int bytes) { + this.maxSize = bytes; } + + public int getMaxSize() { + return maxSize; + } + } diff --git a/java/org/apache/catalina/tribes/io/BufferPool15Impl.java b/java/org/apache/catalina/tribes/io/BufferPool15Impl.java deleted file mode 100644 index 57bc227..0000000 --- a/java/org/apache/catalina/tribes/io/BufferPool15Impl.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.catalina.tribes.io; - -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * - * @version 1.0 - */ -class BufferPool15Impl implements BufferPool.BufferPoolAPI { - protected int maxSize; - protected final AtomicInteger size = new AtomicInteger(0); - protected final ConcurrentLinkedQueue<XByteBuffer> queue = - new ConcurrentLinkedQueue<>(); - - @Override - public void setMaxSize(int bytes) { - this.maxSize = bytes; - } - - - @Override - public XByteBuffer getBuffer(int minSize, boolean discard) { - XByteBuffer buffer = queue.poll(); - if ( buffer != null ) size.addAndGet(-buffer.getCapacity()); - if ( buffer == null ) buffer = new XByteBuffer(minSize,discard); - else if ( buffer.getCapacity() <= minSize ) buffer.expand(minSize); - buffer.setDiscard(discard); - buffer.reset(); - return buffer; - } - - @Override - public void returnBuffer(XByteBuffer buffer) { - if ( (size.get() + buffer.getCapacity()) <= maxSize ) { - size.addAndGet(buffer.getCapacity()); - queue.offer(buffer); - } - } - - @Override - public void clear() { - queue.clear(); - size.set(0); - } - - public int getMaxSize() { - return maxSize; - } - -} diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 18f1325..5991a50 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -147,6 +147,15 @@ </fix> </changelog> </subsection> + <subsection name="Cluster"> + <changelog> + <update> + Refactor Tribes BufferPool and add the + <code>org.apache.catalina.tribes.io.BufferPool.DEFAULT_POOL_SIZE</code> + system property to configure its size. (remm) + </update> + </changelog> + </subsection> <subsection name="Web applications"> <changelog> <fix> diff --git a/webapps/docs/config/systemprops.xml b/webapps/docs/config/systemprops.xml index 2a15d9d..0b00c60 100644 --- a/webapps/docs/config/systemprops.xml +++ b/webapps/docs/config/systemprops.xml @@ -407,6 +407,12 @@ <p>If not specified, the default value of <code>3</code> will be used.</p> </property> + <property name="org.apache.catalina.tribes.io. BufferPool.DEFAULT_POOL_SIZE"> + <p>The size of the buffer pool which is used by Tribes in bytes.</p> + <p>If not specified, the default value of <code>100*1024*1024</code> + (100MB) will be used.</p> + </property> + </properties> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org