Search in sources :

Example 11 with GetResult

use of com.ctriposs.sdb.table.GetResult 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 12 with GetResult

use of com.ctriposs.sdb.table.GetResult 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 13 with GetResult

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

the class FCMapTableTest method testAppendAndGet.

@Test
public void testAppendAndGet() throws IOException, ClassNotFoundException {
    long createdTime = System.nanoTime();
    mapTable = new FCMapTable(testDir, 1, createdTime, 1000);
    assertTrue(mapTable.getLevel() == 1);
    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);
    mapTable.appendNew("key".getBytes(), "value".getBytes(), 500);
    assertTrue(mapTable.getLevel() == 1);
    assertTrue(mapTable.getCreatedTime() == createdTime);
    assertTrue(mapTable.getAppendedSize() == 1);
    assertFalse(mapTable.isEmpty());
    GetResult result = mapTable.get("key".getBytes());
    assertTrue(result.isFound());
    assertTrue(!result.isDeleted());
    assertTrue(!result.isExpired());
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    result = mapTable.get("key".getBytes());
    assertTrue(result.isFound());
    assertTrue(!result.isDeleted());
    assertTrue(result.isExpired());
    result = mapTable.get("key1".getBytes());
    assertFalse(result.isFound());
    assertFalse(mapTable.isUsable());
}
Also used : GetResult(com.ctriposs.sdb.table.GetResult) FCMapTable(com.ctriposs.sdb.table.FCMapTable) Test(org.junit.Test)

Example 14 with GetResult

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

the class HashMapTableTest method testMapOps.

@Test
public void testMapOps() 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);
    for (int i = 0; i < 100; i++) {
        mapTable.put(("key" + i).getBytes(), ("value" + i).getBytes(), AbstractMapTable.NO_TIMEOUT, System.currentTimeMillis());
    }
    for (int i = 0; i < 100; i++) {
        if (i % 2 == 0) {
            mapTable.delete(("key" + i).getBytes());
        }
    }
    mapTable.delete(("key" + 100).getBytes());
    for (int i = 0; i < 100; i++) {
        GetResult result = mapTable.get(("key" + i).getBytes());
        if (i % 2 == 0) {
            assertTrue(result.isFound() && result.isDeleted());
        } else {
            assertTrue(result.isFound() && !result.isDeleted() && !result.isExpired());
            assertTrue(Arrays.equals(("value" + i).getBytes(), result.getValue()));
        }
    }
    GetResult result = mapTable.get(("key" + 100).getBytes());
    assertTrue(result.isFound() && result.isDeleted());
    result = mapTable.get(("key" + 101).getBytes());
    assertTrue(!result.isFound() && !result.isDeleted());
    mapTable.close();
    // test expiration
    createdTime = System.nanoTime();
    mapTable = new HashMapTable(testDir, 0, createdTime);
    for (int i = 0; i < 100; i++) {
        mapTable.put(("key" + i).getBytes(), ("value" + i).getBytes(), 200, System.currentTimeMillis());
    }
    try {
        Thread.sleep(600);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    for (int i = 0; i < 100; i++) {
        result = mapTable.get(("key" + i).getBytes());
        assertTrue(result.isFound() && !result.isDeleted() && result.isExpired());
    }
}
Also used : GetResult(com.ctriposs.sdb.table.GetResult) HashMapTable(com.ctriposs.sdb.table.HashMapTable) Test(org.junit.Test)

Example 15 with GetResult

use of com.ctriposs.sdb.table.GetResult 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)

Aggregations

GetResult (com.ctriposs.sdb.table.GetResult)17 Test (org.junit.Test)16 HashMapTable (com.ctriposs.sdb.table.HashMapTable)8 MMFMapTable (com.ctriposs.sdb.table.MMFMapTable)7 ArrayList (java.util.ArrayList)7 IMapEntry (com.ctriposs.sdb.table.IMapEntry)6 FCMapTable (com.ctriposs.sdb.table.FCMapTable)5 LevelQueue (com.ctriposs.sdb.LevelQueue)4 Random (java.util.Random)4 IOException (java.io.IOException)2 AbstractMapTable (com.ctriposs.sdb.table.AbstractMapTable)1 ExecutionException (java.util.concurrent.ExecutionException)1 ExecutorService (java.util.concurrent.ExecutorService)1 Future (java.util.concurrent.Future)1