Repository navigation
Expand file tree
/
Copy pathStoreDirectFreeSpaceTest.java
More file actions
133 lines (104 loc) · 3.31 KB
/
Copy pathStoreDirectFreeSpaceTest.java
File metadata and controls
133 lines (104 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package org.mapdb;
import org.junit.Test;
import java.util.*;
import static org.junit.Assert.*;
public class StoreDirectFreeSpaceTest {
final long max = 100000;
final Map<Long,Deque<Long>> longStacks = new TreeMap <Long,Deque<Long>>();
/** mock longStacks so their page allocations wont mess up tests */
StoreDirect stub = new StoreDirect(Volume.memoryFactory(false,max, false),false,false,5,false,max,false,false,null, false){
{
structuralLock.lock();
}
private Deque<Long> stackList(long ioList) {
if(longStacks.get(ioList)==null) longStacks.put(ioList, new LinkedList<Long>());
return longStacks.get(ioList);
}
@Override
protected long longStackTake(long ioList, boolean recursive) {
Long r = stackList(ioList).pollLast();
return r!=null?r:0;
}
@Override
protected void longStackPut(long ioList, long offset, boolean recursive) {
maxUsedIoList = Math.max(maxUsedIoList, ioList);
stackList(ioList).add(offset);
}
};
void fill(long... n){
for(int i=0;i<n.length;i+=2){
stub.longStackPut(n[i],n[i+1],false);
}
}
void check( long... n){
long[] a = stub.physAllocate((int) n[0],true,false);
long[] b = new long[n.length];
for(int i=0;i<a.length;i++){
long size = a[i]>>>48; //size
b[i*2+1] = size;
b[0]+=size - (i==a.length-1 ? 0: 8);
b[i*2+2] = a[i] & StoreDirect.MASK_OFFSET; //offset
}
assertArrayEquals(n, b);
}
long size(long i){
return StoreDirect.size2ListIoRecid(i);
}
@Test
public void simpleTake(){
fill(1,2);
assertEquals(2, stub.longStackTake(1,false));
}
@Test
public void simpleSpaceAlloc(){
long ioList = size(16);
fill(ioList,32);
check(16, 16,32);
}
@Test
public void simpleGrow(){
check(32,32,16);
check(16,16,48);
}
@Test
public void largeGrow(){
int size = StoreDirect.MAX_REC_SIZE+100;
check(size, StoreDirect.MAX_REC_SIZE, 16, 108, 16+StoreDirect.MAX_REC_SIZE+1);
}
@Test public void reuse_after_full(){
stub.physSize = max;
fill(size(1600),320);
check(1600,1600,320);
}
@Test public void split_after_full(){
stub.physSize = max;
fill(size(3200),320);
check(1600,1600,320);
check(1600,1600,320+1600);
assertLongStacksEmpty();
}
void assertLongStacksEmpty() {
for(Deque d:longStacks.values()){
if(!d.isEmpty()) fail();
}
}
@Test public void multi_linked(){
int size = 16000+16000;
fill(size(16000),100000, size(16000),200000);
//TODO
}
@Test public void in_memory_compact(){
for(DB d: Arrays.asList(DBMaker.newMemoryDB().cacheDisable().make(),
DBMaker.newMemoryDB().transactionDisable().cacheDisable().make())){
Map m = d.getTreeMap("aa");
for(Integer i=0;i<10000;i++){
m.put(i,i*10);
}
d.commit();
d.compact();
for(Integer i=0;i<10000;i++){
assertEquals(i*10, m.get(i));
}
}
}
}