[hornetq-commits] JBoss hornetq SVN: r8873 - trunk/tests/src/org/hornetq/tests/integration/journal.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Feb 15 06:07:59 EST 2010


Author: timfox
Date: 2010-02-15 06:07:59 -0500 (Mon, 15 Feb 2010)
New Revision: 8873

Added:
   trunk/tests/src/org/hornetq/tests/integration/journal/JournalPerfTuneTest.java
Log:
PerfTuneTest

Added: trunk/tests/src/org/hornetq/tests/integration/journal/JournalPerfTuneTest.java
===================================================================
--- trunk/tests/src/org/hornetq/tests/integration/journal/JournalPerfTuneTest.java	                        (rev 0)
+++ trunk/tests/src/org/hornetq/tests/integration/journal/JournalPerfTuneTest.java	2010-02-15 11:07:59 UTC (rev 8873)
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ * Red Hat 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.hornetq.tests.integration.journal;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicLong;
+
+import junit.framework.TestSuite;
+
+import org.hornetq.api.core.HornetQBuffer;
+import org.hornetq.core.journal.EncodingSupport;
+import org.hornetq.core.journal.IOCompletion;
+import org.hornetq.core.journal.Journal;
+import org.hornetq.core.journal.LoaderCallback;
+import org.hornetq.core.journal.PreparedTransactionInfo;
+import org.hornetq.core.journal.RecordInfo;
+import org.hornetq.core.journal.SequentialFileFactory;
+import org.hornetq.core.journal.impl.AIOSequentialFileFactory;
+import org.hornetq.core.journal.impl.JournalImpl;
+import org.hornetq.core.logging.Logger;
+import org.hornetq.tests.integration.cluster.failover.LargeMessageFailoverTest;
+import org.hornetq.tests.util.UnitTestCase;
+import org.hornetq.utils.DataConstants;
+
+/**
+ * A JournalPerfTuneTest
+ *
+ * @author tim
+ *
+ *
+ */
+public class JournalPerfTuneTest extends UnitTestCase
+{
+   private static final Logger log = Logger.getLogger(JournalPerfTuneTest.class);
+
+   private Journal journal;
+
+   public static TestSuite suite()
+   {
+      TestSuite suite = new TestSuite();
+      return suite;
+   }
+
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+
+      final int fileSize = 1024 * 1024 * 10;
+      final int minFiles = 10;
+      final int compactMinFiles = 20;
+      final int compactPercentage = 30;
+      final String filePrefix = "data";
+      final String extension = "hq";
+      final int maxIO = 500;
+
+      final String journalDir = "/jbm-data/journal-test";
+      final int bufferSize = 490 * 1024;
+      final int bufferTimeout = (int)(1000000000d / 2000);
+      final boolean logRates = true;
+
+      super.recreateDirectory(journalDir);
+
+      SequentialFileFactory fileFactory = new AIOSequentialFileFactory(journalDir, bufferSize, bufferTimeout, logRates);
+
+      journal = new JournalImpl(fileSize,
+                                minFiles,
+                                compactMinFiles,
+                                compactPercentage,
+                                fileFactory,
+                                filePrefix,
+                                extension,
+                                maxIO);
+
+      journal.start();
+
+      class LoaderCB implements LoaderCallback
+      {
+
+         public void addPreparedTransaction(PreparedTransactionInfo preparedTransaction)
+         {
+            // TODO Auto-generated method stub
+
+         }
+
+         public void addRecord(RecordInfo info)
+         {
+            // TODO Auto-generated method stub
+
+         }
+
+         public void deleteRecord(long id)
+         {
+            // TODO Auto-generated method stub
+
+         }
+
+         public void updateRecord(RecordInfo info)
+         {
+            // TODO Auto-generated method stub
+
+         }
+
+         public void failedTransaction(long transactionID, List<RecordInfo> records, List<RecordInfo> recordsToDelete)
+         {
+            // TODO Auto-generated method stub
+
+         }
+
+      }
+
+      journal.load(new LoaderCB());
+   }
+
+   class TestCallback implements IOCompletion
+   {
+      private CountDownLatch latch;
+
+      TestCallback(final int counts)
+      {
+         this.latch = new CountDownLatch(counts);
+      }
+
+      public void await() throws Exception
+      {
+         latch.await();
+      }
+
+      public void storeLineUp()
+      {
+      }
+
+      public void done()
+      {
+         latch.countDown();
+      }
+
+      public void onError(int errorCode, String errorMessage)
+      {
+      }
+
+   }
+
+   protected void tearDown() throws Exception
+   {
+      journal.stop();
+
+      super.tearDown();
+
+   }
+
+   public void test1() throws Exception
+   {
+      final int itersPerThread = 10000000;
+
+      final int numThreads = 1;
+
+      this.callback = new TestCallback(2 * itersPerThread * numThreads);
+
+      Worker[] workers = new Worker[numThreads];
+
+      for (int i = 0; i < numThreads; i++)
+      {
+         workers[i] = new Worker(itersPerThread);
+
+         workers[i].start();
+      }
+
+      for (int i = 0; i < numThreads; i++)
+      {
+         workers[i].join();
+      }
+
+      callback.await();
+   }
+
+   private AtomicLong idGen = new AtomicLong(0);
+
+   private TestCallback callback;
+
+   class Worker extends Thread
+   {
+      final int iters;
+
+      Worker(final int iters)
+      {
+         this.iters = iters;
+      }
+
+      public void run()
+      {
+         try
+         {
+            Record record = new Record(new byte[256]);
+
+            for (int i = 0; i < iters; i++)
+            {
+               long id = idGen.getAndIncrement();
+
+               journal.appendAddRecord(id, (byte)0, record, true, callback);
+
+               journal.appendDeleteRecord(id, true, callback);
+
+               // log.info("did " + i);
+            }
+         }
+         catch (Exception e)
+         {
+            log.error("Failed", e);
+         }
+      }
+   }
+
+   static class Record implements EncodingSupport
+   {
+      private byte[] bytes;
+
+      Record(byte[] bytes)
+      {
+         this.bytes = bytes;
+      }
+
+      public void decode(HornetQBuffer buffer)
+      {
+         int length = buffer.readInt();
+
+         bytes = new byte[length];
+
+         buffer.readBytes(bytes);
+      }
+
+      public void encode(HornetQBuffer buffer)
+      {
+         buffer.writeInt(bytes.length);
+
+         buffer.writeBytes(bytes);
+      }
+
+      public int getEncodeSize()
+      {
+         return DataConstants.SIZE_INT + bytes.length;
+      }
+
+   }
+}



More information about the hornetq-commits mailing list