From d98ea376bac24163571279c6598072af4fc6ed8b Mon Sep 17 00:00:00 2001 From: Gary Tully Date: Thu, 26 Feb 2009 17:32:37 +0000 Subject: [PATCH] resolve mem leak in kahadb - AMQ-2143 git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@748218 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/activemq/perf/KahaDBQueueTest.java | 54 +++++++++++++++++++ .../kahadb/journal/DataFileAppender.java | 6 ++- 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 activemq-core/src/test/java/org/apache/activemq/perf/KahaDBQueueTest.java diff --git a/activemq-core/src/test/java/org/apache/activemq/perf/KahaDBQueueTest.java b/activemq-core/src/test/java/org/apache/activemq/perf/KahaDBQueueTest.java new file mode 100644 index 0000000000..6e5146b75d --- /dev/null +++ b/activemq-core/src/test/java/org/apache/activemq/perf/KahaDBQueueTest.java @@ -0,0 +1,54 @@ +/** + * 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.activemq.perf; + +import java.io.File; + +import org.apache.activemq.broker.BrokerService; +import org.apache.activemq.store.kahadb.KahaDBStore; + +/** + * @version $Revision$ + */ +public class KahaDBQueueTest extends SimpleQueueTest { + + protected void configureBroker(BrokerService answer,String uri) throws Exception { + + File dataFileDir = new File("target/test-amq-data/perfTest/kahadb"); + + KahaDBStore kaha = new KahaDBStore(); + kaha.setDirectory(dataFileDir); + + // The setEnableJournalDiskSyncs(false) setting is a little dangerous right now, as I have not verified + // what happens if the index is updated but a journal update is lost. + // Index is going to be in consistent, but can it be repaired? + kaha.setEnableJournalDiskSyncs(false); + // Using a bigger journal file size makes he take fewer spikes as it is not switching files as often. + kaha.setJournalMaxFileLength(1024*100); + + // small batch means more frequent and smaller writes + kaha.setIndexWriteBatchSize(100); + // do the index write in a separate thread + kaha.setEnableIndexWriteAsync(true); + + answer.setPersistenceAdapter(kaha); + answer.addConnector(uri); + answer.setDeleteAllMessagesOnStartup(true); + + } + +} diff --git a/kahadb/src/main/java/org/apache/kahadb/journal/DataFileAppender.java b/kahadb/src/main/java/org/apache/kahadb/journal/DataFileAppender.java index e10da2c4a0..017d68030d 100644 --- a/kahadb/src/main/java/org/apache/kahadb/journal/DataFileAppender.java +++ b/kahadb/src/main/java/org/apache/kahadb/journal/DataFileAppender.java @@ -175,6 +175,9 @@ class DataFileAppender { // assigned // by the data manager (which is basically just appending) + if (!sync) { + inflightWrites.put(new WriteKey(location), write); + } synchronized (this) { batch = enqueue(write); } @@ -185,9 +188,8 @@ class DataFileAppender { } catch (InterruptedException e) { throw new InterruptedIOException(); } - } else { - inflightWrites.put(new WriteKey(location), write); } + return location; }