Package net.timewalker.ffmq3.test.storage.data.impl

Source Code of net.timewalker.ffmq3.test.storage.data.impl.BlockBasedDataStoreTest

package net.timewalker.ffmq3.test.storage.data.impl;

import java.io.File;

import junit.framework.TestCase;
import net.timewalker.ffmq3.management.destination.definition.QueueDefinition;
import net.timewalker.ffmq3.storage.data.DataStoreException;
import net.timewalker.ffmq3.storage.data.LinkedDataStore;
import net.timewalker.ffmq3.storage.data.impl.BlockBasedDataStore;
import net.timewalker.ffmq3.storage.data.impl.BlockBasedDataStoreTools;
import net.timewalker.ffmq3.utils.Settings;
import net.timewalker.ffmq3.utils.StringTools;
import net.timewalker.ffmq3.utils.id.UUIDProvider;

/**
* BlockBasedDataStoreTest
*/
public class BlockBasedDataStoreTest extends TestCase
{
  /*
   * (non-Javadoc)
   *
   * @see junit.framework.TestCase#setUp()
   */
  protected void setUp() throws Exception
  {
    super.setUp();
    File dataDir = new File("target/test");
    dataDir.mkdir();
   
    System.setProperty("ffmq.dataStore.safeMode", "true");
  }
 
  public void testLongevity() throws Exception
  {
    String storeId = UUIDProvider.getInstance().getUUID();

    String msgBase = StringTools.rightPad("DATA-", 1000, 'X');
    byte[] data = msgBase.getBytes();
   
    BlockBasedDataStoreTools.create(storeId, new File("target/test"), 200, 512, true);
    LinkedDataStore store = createStore(storeId, new File("target/test"));
   
    for (int i = 0; i < 500; i++)
    {
      for (int j = 0; j < 10; j++)
      {
        int previous = store.first();
        previous = store.store(data, previous);
        if (previous == -1)
                  throw new IllegalStateException("No space left !");
      }
      store.commitChanges();
      for (int j = 0; j < 10; j++)
      {
        store.delete(store.first());
      }
      store.commitChanges();
    }
   
    store.close();
  }
 
  public void testLongevityNoCommit() throws Exception
  {
    String storeId = UUIDProvider.getInstance().getUUID();

    String msgBase = StringTools.rightPad("DATA-", 1000, 'X');
    byte[] data = msgBase.getBytes();
   
    BlockBasedDataStoreTools.create(storeId, new File("target/test"), 200, 512, true);
    LinkedDataStore store = createStore(storeId, new File("target/test"));
   
    for (int i = 0; i < 500; i++)
    {
      for (int j = 0; j < 10; j++)
      {
        int previous = store.first();
        previous = store.store(data, previous);
        if (previous == -1)
                  throw new IllegalStateException("No space left !");
      }
      //store.commitChanges();
      for (int j = 0; j < 10; j++)
      {
        store.delete(store.first());
      }
      //store.commitChanges();
    }
   
    store.close();
  }
 
  public void testFragmented() throws Exception
  {
    System.out.println("--------- Fragmented test ---------");
    doTest(512, 1000, 500, 1000);
  }

  public void testNonFragmented() throws Exception
  {
    System.out.println("--------- Non fragmented test ---------");
    doTest(1024, 1000, 1000, 1000);
  }

    protected LinkedDataStore createStore(String baseName, File dataFolder) throws DataStoreException
    {
        Settings settings = new Settings();
        settings.setStringProperty("name", baseName);
        settings.setStringProperty("persistentStore.dataFolder", dataFolder.getAbsolutePath());
        settings.setIntProperty("persistentStore.maxBlockCount", 10000);
        settings.setIntProperty("persistentStore.autoExtendAmount", 500);
        settings.setBooleanProperty("persistentStore.useJournal", false);       
        QueueDefinition queueDef = new QueueDefinition(settings);
       
      LinkedDataStore dataStore = new BlockBasedDataStore(queueDef);
        dataStore.init();
       
    return dataStore;
    }

  private void doTest(int blockSize, int blockCount, int msgCount, int msgSize) throws Exception
  {
    String storeId = UUIDProvider.getInstance().getUUID();

    String msgBase = StringTools.rightPad("DATA-", msgSize, 'X');

    BlockBasedDataStoreTools.create(storeId, new File("target/test"),
                                    200, blockSize, true);
    LinkedDataStore store = createStore(storeId, new File("target/test"));

    // -------------------------------------------------------------------
    // Insert some messages

    long startTime = System.currentTimeMillis();
    int previous = -1;
    for (int n = 0; n < msgCount; n++)
    {
      byte[] data = (msgBase + n).getBytes();
      previous = store.store(data, previous);
      if (previous == -1)
          throw new IllegalStateException("No space left !");
      // System.out.println(store);
    }
    store.commitChanges();
    long endTime = System.currentTimeMillis();
    System.out.println("Insertion time " + (endTime - startTime) + " ms");

    //System.out.println(store);
    store.close();

    // -------------------------------------------------------------------
    // Reload store

    store = createStore(storeId, new File("target/test"));

    //System.out.println(store);
    int count = 0;
    int current = store.first();
    while (current != -1)
    {
      store.retrieve(current);
      current = store.next(current);
      count++;
    }
    // System.out.println(store);
    assertEquals(msgCount, count);
    assertEquals(msgCount, store.size());
    // System.out.println(store);

    // -------------------------------------------------------------------
    // Delete half the messages

    count = 0;
    current = store.first();
    while (current != -1)
    {
      int next = store.next(current);
      if (next != -1)
        next = store.next(next);

      store.delete(current);
      count++;

      current = next;
    }
    store.commitChanges();
    assertEquals(msgCount - count, store.size());
    // System.out.println(store);
    store.close();

    // -------------------------------------------------------------------
    // Reload store
    store = createStore(storeId, new File("target/test"));
    assertEquals(msgCount - count, store.size());
    //System.out.println(store);

    // -------------------------------------------------------------------
    // Add back some messages

    int pos = -1;
    for (int n = 0; n < count; n++)
    {
      byte[] data = (msgBase + n).getBytes();
      previous = store.store(data, pos);
      if (previous == -1)
                throw new IllegalStateException("No space left !");
     
      pos = store.next(previous);
      if (pos != -1)
        pos = store.next(pos);
      // pos+=2+data.length/BLOCK_SIZE;
    }
    store.commitChanges();
    assertEquals(msgCount, store.size());
    System.out.println(store);

    store.close();

    // -------------------------------------------------------------------
    // Reload store

    store = createStore(storeId, new File("target/test"));
    assertEquals(msgCount, store.size());

    System.out.println(store);
   
    count = 0;
    current = store.first();
    while (current != -1)
    {
      store.retrieve(current);
      current = store.next(current);
      count++;
    }
    assertEquals(msgCount, count);
    assertEquals(msgCount, store.size());

    store.close();

    // -------------------------------------------------------------------
    // Delete everything

    store = createStore(storeId, new File("target/test"));
    assertEquals(msgCount, store.size());

    count = 0;
    startTime = System.currentTimeMillis();
    current = store.first();
    while (current != -1)
    {
      int next = store.next(current);
      store.delete(current);
      current = next;
      count++;
    }
    store.commitChanges();
    endTime = System.currentTimeMillis();
    System.out.println("Deletion time " + (endTime - startTime) + " ms");
    assertEquals(msgCount, count);
    assertEquals(0, store.size());
    assertEquals(-1, store.first());

    store.close();

    // -------------------------------------------------------------------
    // Reload store

    store = createStore(storeId, new File("target/test"));
    assertEquals(0, store.size());
    assertEquals(-1, store.first());

    store.close();
  }
}
TOP

Related Classes of net.timewalker.ffmq3.test.storage.data.impl.BlockBasedDataStoreTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.