Search in sources :

Example 6 with IMapEntry

use of com.ctriposs.sdb.table.IMapEntry in project sessdb by ppdai.

the class Level1MergerTest method testCase02.

@Test
public void testCase02() throws IOException, ClassNotFoundException {
    int maxSize = AbstractMapTable.INIT_INDEX_ITEMS_PER_TABLE * 4 * 4;
    //int maxSize = 1024;
    MMFMapTable[] sourceTables = new MMFMapTable[3];
    LevelQueue lq1 = new LevelQueue();
    for (int i = 0; i < 3; i++) {
        sourceTables[i] = new MMFMapTable(testDir, SDB.LEVEL1, System.nanoTime() + i, maxSize / 4, 4);
        lq1.addFirst(sourceTables[i]);
    }
    // delete
    MMFMapTable table3 = sourceTables[2];
    int start = 0;
    List<String> keyList = new ArrayList<String>();
    while (start < maxSize) {
        keyList.add(String.valueOf(start));
        start = start + 4;
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    for (String key : keyList) {
        table3.appendNew(key.getBytes(), Arrays.hashCode(key.getBytes()), key.getBytes(), AbstractMapTable.NO_TIMEOUT, System.currentTimeMillis(), true, false);
    }
    // expiration
    MMFMapTable table2 = sourceTables[1];
    start = 1;
    keyList = new ArrayList<String>();
    while (start < maxSize) {
        keyList.add(String.valueOf(start));
        start = start + 4;
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    for (String key : keyList) {
        table2.appendNew(key.getBytes(), Arrays.hashCode(key.getBytes()), key.getBytes(), 200, System.currentTimeMillis(), false, false);
    }
    // expire table2
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
    // ignore
    }
    // time to live 60 sec
    MMFMapTable table1 = sourceTables[0];
    start = 2;
    keyList = new ArrayList<String>();
    while (start < maxSize) {
        keyList.add(String.valueOf(start));
        start = start + 4;
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    for (String key : keyList) {
        table1.appendNew(key.getBytes(), Arrays.hashCode(key.getBytes()), key.getBytes(), 600 * 1000, System.currentTimeMillis(), false, false);
    }
    //int expectedInserts = (int)(table1.getAppendedSize() + table2.getAppendedSize() + table3.getAppendedSize());
    FCMapTable table4 = new FCMapTable(testDir, SDB.LEVEL2, System.nanoTime() + 3, maxSize);
    start = 0;
    keyList = new ArrayList<String>();
    while (start < maxSize) {
        keyList.add(String.valueOf(start));
        start = start + 1;
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    for (String key : keyList) {
        table4.appendNew(key.getBytes(), Arrays.hashCode(key.getBytes()), key.getBytes(), 1200 * 1000, System.currentTimeMillis(), false, false);
    }
    LevelQueue lq2 = new LevelQueue();
    lq2.add(table4);
    Level1Merger.mergeSort(lq1, lq2, 4, testDir, (short) 2);
    assertTrue(lq1.size() == 0);
    assertTrue(lq2.size() == 1);
    FCMapTable targetTable = (FCMapTable) lq2.poll();
    System.out.println(targetTable.getAppendedSize() + "==" + maxSize / 2);
    assertTrue(targetTable.getAppendedSize() == maxSize / 2);
    /*
		// validate delete
		start = 0;
		while(start < maxSize) {
			GetResult result = targetTable.get(String.valueOf(start).getBytes());
			assertFalse(result.isFound());
			start += 4;
		}
		
		// validate expiration
		start = 1;
		while(start < maxSize) {
			GetResult result = targetTable.get(String.valueOf(start).getBytes());
			assertFalse(result.isFound());
			start += 4;
		}
		
		// validate ttl 60s
		start = 2;
		while(start < maxSize) {
			GetResult result = targetTable.get(String.valueOf(start).getBytes());
			assertTrue(result.isFound());
			assertTrue(result.getTimeToLive() == 600 * 1000);
			start += 4;
		}
		
		// validate ttl 120s
		start = 3;
		while(start < maxSize) {
			GetResult result = targetTable.get(String.valueOf(start).getBytes());
			assertTrue(result.isFound());
			assertTrue(result.getTimeToLive() == 1200 * 1000);
			start += 4;
		}*/
    keyList = new ArrayList<String>();
    for (long i = 0; i < maxSize; i++) {
        if (i % 4 == 0 || i % 4 == 1)
            continue;
        keyList.add(String.valueOf(i));
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    int index = 0;
    for (int i = 0; i < maxSize; i++) {
        // ignore deleted & expired
        if (i % 4 == 0 || i % 4 == 1)
            continue;
        IMapEntry mapEntry = targetTable.getMapEntry(index);
        assertTrue(mapEntry.getIndex() == index);
        assertTrue(new String(mapEntry.getKey()).equals(keyList.get(index)));
        assertTrue(new String(mapEntry.getValue()).equals(keyList.get(index)));
        index++;
    }
    Random random = new Random();
    for (int i = 0; i < 1024; i++) {
        int key = random.nextInt(maxSize);
        // ignore deleted & expired
        if (key % 4 == 0 || key % 4 == 1)
            continue;
        GetResult result = targetTable.get(String.valueOf(key).getBytes());
        assertTrue(result.isFound());
    }
    targetTable.close();
    targetTable.delete();
}
Also used : MMFMapTable(com.ctriposs.sdb.table.MMFMapTable) GetResult(com.ctriposs.sdb.table.GetResult) IMapEntry(com.ctriposs.sdb.table.IMapEntry) ArrayList(java.util.ArrayList) LevelQueue(com.ctriposs.sdb.LevelQueue) FCMapTable(com.ctriposs.sdb.table.FCMapTable) Random(java.util.Random) Test(org.junit.Test)

Example 7 with IMapEntry

use of com.ctriposs.sdb.table.IMapEntry in project sessdb by ppdai.

the class Level1MergerTest method testCase01.

@Test
public void testCase01() throws IOException, ClassNotFoundException {
    int maxSize = AbstractMapTable.INIT_INDEX_ITEMS_PER_TABLE;
    String value = TestUtil.randomString(1024 * 3);
    MMFMapTable[] sourceTables = new MMFMapTable[4];
    LevelQueue lq1 = new LevelQueue();
    for (int i = 0; i < 4; i++) {
        sourceTables[i] = new MMFMapTable(testDir, SDB.LEVEL1, System.nanoTime() + i, maxSize, 4);
        lq1.addFirst(sourceTables[i]);
    }
    int totalCount = 0;
    for (int i = 0; i < 4; i++) {
        int start = i;
        MMFMapTable table = sourceTables[i];
        List<String> keyList = new ArrayList<String>();
        while (keyList.size() < maxSize) {
            keyList.add(String.valueOf(start));
            totalCount++;
            start = start + 4;
        }
        Collections.sort(keyList, new Comparator<String>() {

            @Override
            public int compare(String arg0, String arg1) {
                int hash0 = Arrays.hashCode(arg0.getBytes());
                int hash1 = Arrays.hashCode(arg1.getBytes());
                if (hash0 < hash1)
                    return -1;
                else if (hash0 > hash1)
                    return 1;
                else
                    return 0;
            }
        });
        for (String key : keyList) {
            table.appendNew(key.getBytes(), value.getBytes(), AbstractMapTable.NO_TIMEOUT);
        }
    }
    LevelQueue lq2 = new LevelQueue();
    long start = System.currentTimeMillis();
    Level1Merger.mergeSort(lq1, lq2, 4, testDir, (short) 3);
    long end = System.currentTimeMillis();
    System.out.println("Time spent to merge " + totalCount + " items in 4 ways  is " + (end - start) / 1000 + "s");
    assertTrue(lq1.size() == 0);
    assertTrue(lq2.size() == 1);
    FCMapTable targetTable = (FCMapTable) lq2.poll();
    assertTrue(targetTable.getLevel() == SDB.LEVEL2);
    assertTrue(targetTable.getAppendedSize() == totalCount);
    assertTrue(totalCount == maxSize * 4);
    List<String> keyList = new ArrayList<String>();
    for (long i = 0; i < totalCount; i++) {
        keyList.add(String.valueOf(i));
    }
    Collections.sort(keyList, new Comparator<String>() {

        @Override
        public int compare(String arg0, String arg1) {
            int hash0 = Arrays.hashCode(arg0.getBytes());
            int hash1 = Arrays.hashCode(arg1.getBytes());
            if (hash0 < hash1)
                return -1;
            else if (hash0 > hash1)
                return 1;
            else
                return 0;
        }
    });
    for (int i = 0; i < totalCount; i++) {
        IMapEntry mapEntry = targetTable.getMapEntry(i);
        assertTrue(mapEntry.getIndex() == i);
        assertTrue(new String(mapEntry.getKey()).equals(keyList.get(i)));
        assertTrue(new String(mapEntry.getValue()).equals(value));
    }
    start = System.currentTimeMillis();
    Random random = new Random();
    for (int i = 0; i < 1024; i++) {
        long key = random.nextInt(totalCount);
        GetResult result = targetTable.get(String.valueOf(key).getBytes());
        assertTrue(result.isFound());
    }
    end = System.currentTimeMillis();
    System.out.println("Time to lookup 1024 random key in the target table is " + (end - start) + "ms");
    targetTable.close();
    targetTable.delete();
}
Also used : MMFMapTable(com.ctriposs.sdb.table.MMFMapTable) GetResult(com.ctriposs.sdb.table.GetResult) IMapEntry(com.ctriposs.sdb.table.IMapEntry) ArrayList(java.util.ArrayList) LevelQueue(com.ctriposs.sdb.LevelQueue) FCMapTable(com.ctriposs.sdb.table.FCMapTable) Random(java.util.Random) Test(org.junit.Test)

Example 8 with IMapEntry

use of com.ctriposs.sdb.table.IMapEntry in project sessdb by ppdai.

the class HashMapTableTest method testLoop.

@Test
public void testLoop() throws IOException {
    long createdTime = System.nanoTime();
    mapTable = new HashMapTable(testDir, 0, createdTime);
    assertTrue(mapTable.getLevel() == 0);
    assertTrue(mapTable.getCreatedTime() == createdTime);
    assertTrue(mapTable.getAppendedSize() == 0);
    assertTrue(mapTable.isEmpty());
    assertTrue(mapTable.getBackFileSize() == HashMapTable.INIT_INDEX_FILE_SIZE + HashMapTable.INIT_DATA_FILE_SIZE + HashMapTable.INDEX_ITEM_LENGTH);
    int loop = 6 * 1024;
    for (int i = 0; i < loop; i++) {
        mapTable.appendNew(("key" + i).getBytes(), ("value" + i).getBytes(), -1, System.currentTimeMillis());
    }
    assertTrue(mapTable.getAppendedSize() == loop);
    for (int i = 0; i < loop; i++) {
        IMapEntry mapEntry = mapTable.getMapEntry(i);
        assertTrue(Arrays.equals(("key" + i).getBytes(), mapEntry.getKey()));
        assertTrue(Arrays.equals(("value" + i).getBytes(), mapEntry.getValue()));
        assertTrue(-1 == mapEntry.getTimeToLive());
        assertTrue(System.currentTimeMillis() >= mapEntry.getCreatedTime());
        assertFalse(mapEntry.isDeleted());
        assertTrue(mapEntry.isInUse());
    }
    for (int i = 0; i < loop; i++) {
        GetResult result = mapTable.get(("key" + i).getBytes());
        assertTrue(result.isFound());
        assertFalse(result.isDeleted() || result.isExpired());
        assertTrue(Arrays.equals(("value" + i).getBytes(), result.getValue()));
    }
    GetResult result = mapTable.get(("key" + loop).getBytes());
    assertFalse(result.isFound());
    assertFalse(result.isDeleted() || result.isExpired());
    try {
        mapTable.getMapEntry(loop);
    } catch (IllegalArgumentException iae) {
    }
}
Also used : GetResult(com.ctriposs.sdb.table.GetResult) IMapEntry(com.ctriposs.sdb.table.IMapEntry) HashMapTable(com.ctriposs.sdb.table.HashMapTable) Test(org.junit.Test)

Example 9 with IMapEntry

use of com.ctriposs.sdb.table.IMapEntry in project sessdb by ppdai.

the class HashMapTableTest method testAppendConcurrency.

@Test
public void testAppendConcurrency() throws IOException, InterruptedException, ExecutionException {
    ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    long createdTime = System.nanoTime();
    mapTable = new HashMapTable(testDir, 1, createdTime);
    List<Future<?>> futures = new ArrayList<Future<?>>();
    int N_THREADS = 128;
    final int LOOP = 512;
    final AtomicInteger failedCount = new AtomicInteger(0);
    for (int t = 0; t < N_THREADS; t++) {
        final int finalT = t;
        futures.add(es.submit(new Runnable() {

            @Override
            public void run() {
                for (int i = 0; i < LOOP; i++) {
                    try {
                        mapTable.appendNew(("" + finalT).getBytes(), ("" + i).getBytes(), -1, System.currentTimeMillis());
                    } catch (IOException e) {
                        e.printStackTrace();
                        failedCount.incrementAndGet();
                    }
                }
            }
        }));
    }
    for (Future<?> future : futures) {
        future.get();
    }
    assertTrue(failedCount.get() == 0);
    assertTrue(mapTable.getAppendedSize() == N_THREADS * LOOP);
    Map<Integer, Set<Integer>> resultMap = new HashMap<Integer, Set<Integer>>();
    for (int i = 0; i < mapTable.getAppendedSize(); i++) {
        IMapEntry mapEntry = mapTable.getMapEntry(i);
        String key = new String(mapEntry.getKey());
        String value = new String(mapEntry.getValue());
        if (!resultMap.containsKey(Integer.parseInt(key))) {
            resultMap.put(Integer.parseInt(key), new HashSet<Integer>());
        }
        resultMap.get(Integer.parseInt(key)).add(Integer.parseInt(value));
    }
    assertTrue(resultMap.size() == N_THREADS);
    Set<Integer> keySet = resultMap.keySet();
    for (int t = 0; t < N_THREADS; t++) {
        keySet.contains(t);
    }
    for (Integer key : keySet) {
        Set<Integer> valueSet = resultMap.get(key);
        assertTrue(valueSet.size() == LOOP);
        for (int l = 0; l < LOOP; l++) {
            valueSet.contains(l);
        }
    }
    es.shutdown();
}
Also used : Set(java.util.Set) HashSet(java.util.HashSet) HashMap(java.util.HashMap) IMapEntry(com.ctriposs.sdb.table.IMapEntry) ArrayList(java.util.ArrayList) IOException(java.io.IOException) HashMapTable(com.ctriposs.sdb.table.HashMapTable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ExecutorService(java.util.concurrent.ExecutorService) Future(java.util.concurrent.Future) Test(org.junit.Test)

Example 10 with IMapEntry

use of com.ctriposs.sdb.table.IMapEntry in project sessdb by ppdai.

the class HashMapTableTest method testReOpen.

@Test
public void testReOpen() throws IOException {
    long createdTime = System.nanoTime();
    mapTable = new HashMapTable(testDir, 0, createdTime);
    assertTrue(mapTable.getLevel() == 0);
    assertTrue(mapTable.getCreatedTime() == createdTime);
    assertTrue(mapTable.getAppendedSize() == 0);
    assertTrue(mapTable.isEmpty());
    assertTrue(mapTable.getBackFileSize() == HashMapTable.INIT_INDEX_FILE_SIZE + HashMapTable.INIT_DATA_FILE_SIZE + HashMapTable.INDEX_ITEM_LENGTH);
    int loop = 1024;
    for (int i = 0; i < loop; i++) {
        mapTable.appendNew(("key" + i).getBytes(), ("value" + i).getBytes(), -1, System.currentTimeMillis());
    }
    assertTrue(mapTable.getAppendedSize() == loop);
    mapTable.close();
    mapTable = new HashMapTable(testDir, 0, createdTime);
    for (int i = 0; i < loop; i++) {
        IMapEntry mapEntry = mapTable.getMapEntry(i);
        assertTrue(Arrays.equals(("key" + i).getBytes(), mapEntry.getKey()));
        assertTrue(Arrays.equals(("value" + i).getBytes(), mapEntry.getValue()));
        assertTrue(-1 == mapEntry.getTimeToLive());
        assertTrue(System.currentTimeMillis() >= mapEntry.getCreatedTime());
        assertFalse(mapEntry.isDeleted());
        assertTrue(mapEntry.isInUse());
    }
    try {
        mapTable.getMapEntry(loop);
    } catch (IllegalArgumentException iae) {
    }
    for (int i = 0; i < loop; i++) {
        GetResult result = mapTable.get(("key" + i).getBytes());
        assertTrue(result.isFound());
        assertFalse(result.isDeleted() || result.isExpired());
        assertTrue(Arrays.equals(("value" + i).getBytes(), result.getValue()));
    }
    GetResult result = mapTable.get(("key" + loop).getBytes());
    assertFalse(result.isFound());
    assertFalse(result.isDeleted() || result.isExpired());
}
Also used : GetResult(com.ctriposs.sdb.table.GetResult) IMapEntry(com.ctriposs.sdb.table.IMapEntry) HashMapTable(com.ctriposs.sdb.table.HashMapTable) Test(org.junit.Test)

Aggregations

IMapEntry (com.ctriposs.sdb.table.IMapEntry)10 Test (org.junit.Test)8 HashMapTable (com.ctriposs.sdb.table.HashMapTable)7 ArrayList (java.util.ArrayList)7 GetResult (com.ctriposs.sdb.table.GetResult)6 MMFMapTable (com.ctriposs.sdb.table.MMFMapTable)5 LevelQueue (com.ctriposs.sdb.LevelQueue)4 Random (java.util.Random)4 FCMapTable (com.ctriposs.sdb.table.FCMapTable)3 AbstractMapTable (com.ctriposs.sdb.table.AbstractMapTable)2 IOException (java.io.IOException)2 PriorityQueue (java.util.PriorityQueue)2 AbstractSortedMapTable (com.ctriposs.sdb.table.AbstractSortedMapTable)1 ByteArrayWrapper (com.ctriposs.sdb.table.ByteArrayWrapper)1 InMemIndex (com.ctriposs.sdb.table.InMemIndex)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1