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();
}
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();
}
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());
}
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());
}
}
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) {
}
}
Aggregations