Skip to content

Commit c24a834

Browse files
committed
Refactored page store to support other page stores
1 parent 16c431b commit c24a834

File tree

16 files changed

+432
-319
lines changed

16 files changed

+432
-319
lines changed

cloudata-server-shared/src/main/java/com/cloudata/btree/BranchPage.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ public class BranchPage extends Page {
2121

2222
Mutable mutable;
2323

24-
public BranchPage(Page parent, int pageNumber, ByteBuffer buffer) {
25-
super(parent, pageNumber, buffer);
24+
public BranchPage(Btree btree, Page parent, int pageNumber, ByteBuffer buffer) {
25+
super(btree, parent, pageNumber, buffer);
2626
}
2727

2828
static class Mutable {
@@ -144,7 +144,7 @@ public boolean walk(Transaction txn, ByteBuffer from, EntryListener listener) {
144144

145145
int pageNumber = entry.pageNumber;
146146

147-
Page childPage = txn.getPage(page, pageNumber);
147+
Page childPage = txn.getPage(page.btree, page, pageNumber);
148148

149149
boolean keepGoing = childPage.walk(txn, from, listener);
150150
if (!keepGoing) {
@@ -166,7 +166,7 @@ public void updateLbound(Transaction txn, int pageNumber) {
166166
}
167167

168168
ByteBuffer oldKey = entry.key;
169-
Page childPage = txn.getPage(page, pageNumber);
169+
Page childPage = txn.getPage(page.btree, page, pageNumber);
170170

171171
ByteBuffer newKey = childPage.getKeyLbound();
172172
entries.set(i, new Entry(newKey, pageNumber));
@@ -363,7 +363,7 @@ public boolean walk(Transaction txn, ByteBuffer from, EntryListener listener) {
363363
while (pos < n) {
364364
int pageNumber = getPageNumber(pos);
365365

366-
Page page = txn.getPage(this, pageNumber);
366+
Page page = txn.getPage(btree, this, pageNumber);
367367
boolean keepGoing = page.walk(txn, from, listener);
368368
if (!keepGoing) {
369369
return false;
@@ -421,7 +421,7 @@ public <V> void doAction(Transaction txn, ByteBuffer key, RowOperation<V> operat
421421

422422
int pageNumber = getPageNumber(pos);
423423

424-
Page childPage = txn.getPage(this, pageNumber);
424+
Page childPage = txn.getPage(btree, this, pageNumber);
425425

426426
ByteBuffer oldLbound = childPage.getKeyLbound();
427427

@@ -491,12 +491,12 @@ public void dump(PrintStream os) {
491491
}
492492
}
493493

494-
public static BranchPage createNew(Page parent, int pageNumber, Page childPage) {
494+
public static BranchPage createNew(Btree btree, Page parent, int pageNumber, Page childPage) {
495495
ByteBuffer empty = ByteBuffer.allocate(6);
496496
empty.putShort((short) 0);
497497
empty.flip();
498498

499-
BranchPage page = new BranchPage(parent, pageNumber, empty);
499+
BranchPage page = new BranchPage(btree, parent, pageNumber, empty);
500500
page.getMutable().setChildren(childPage);
501501

502502
return page;

cloudata-server-shared/src/main/java/com/cloudata/btree/Btree.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,24 @@
99
public class Btree {
1010
private static final Logger log = LoggerFactory.getLogger(Btree.class);
1111

12-
final PageStore pageStore;
12+
final Database db;
1313
final boolean uniqueKeys;
1414

1515
final Lock writeLock = new ReentrantLock();
1616

17-
public Btree(PageStore pageStore, boolean uniqueKeys) {
18-
this.pageStore = pageStore;
17+
public Btree(Database db, boolean uniqueKeys) {
18+
this.db = db;
1919
this.uniqueKeys = uniqueKeys;
2020
}
2121

2222
public WriteTransaction beginReadWrite() {
2323
writeLock.lock();
24-
WriteTransaction txn = pageStore.beginReadWriteTransaction(writeLock);
24+
WriteTransaction txn = db.transactionTracker.beginReadWriteTransaction(writeLock);
2525
return txn;
2626
}
2727

2828
public ReadOnlyTransaction beginReadOnly() {
29-
ReadOnlyTransaction txn = pageStore.beginReadOnlyTransaction();
29+
ReadOnlyTransaction txn = db.transactionTracker.beginReadOnlyTransaction();
3030
return txn;
3131
}
3232

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.cloudata.btree;
2+
3+
public class Database {
4+
final PageStore pageStore;
5+
final TransactionTracker transactionTracker;
6+
7+
Database(PageStore pageStore) {
8+
this.pageStore = pageStore;
9+
10+
MasterPage latest = pageStore.findLatestMasterPage();
11+
this.transactionTracker = new TransactionTracker(this, latest);
12+
}
13+
14+
}

cloudata-server-shared/src/main/java/com/cloudata/btree/LeafPage.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ public class LeafPage extends Page {
4444

4545
final boolean uniqueKeys;
4646

47-
public LeafPage(Page parent, int pageNumber, ByteBuffer buffer, boolean uniqueKeys) {
48-
super(parent, pageNumber, buffer);
49-
this.uniqueKeys = uniqueKeys;
47+
public LeafPage(Btree btree, Page parent, int pageNumber, ByteBuffer buffer) {
48+
super(btree, parent, pageNumber, buffer);
49+
this.uniqueKeys = btree.isUniqueKeys();
5050
}
5151

5252
static class Mutable {
@@ -57,6 +57,8 @@ static class Mutable {
5757
int totalKeySize;
5858
int totalValueSize;
5959

60+
final Btree btree;
61+
6062
int firstGTE(ByteBuffer find) {
6163
int n = getEntryCount();
6264
int pos;
@@ -146,6 +148,7 @@ <V> void doAction(ByteBuffer key, RowOperation<V> operation) {
146148
}
147149

148150
Mutable(LeafPage page) {
151+
this.btree = page.btree;
149152
this.uniqueKeys = page.uniqueKeys;
150153
int n = page.getEntryCount();
151154

@@ -189,7 +192,7 @@ List<Page> split(WriteTransaction transaction, LeafPage original) {
189192
target = original;
190193
} else {
191194
int pageNumber = transaction.assignPageNumber();
192-
target = LeafPage.createNew(original.parent, pageNumber, uniqueKeys);
195+
target = LeafPage.createNew(btree, original.parent, pageNumber);
193196
extraPages.add(target);
194197
}
195198

@@ -517,7 +520,7 @@ public byte getPageType() {
517520
return PAGE_TYPE;
518521
}
519522

520-
public static LeafPage createNew(Page parent, int pageNumber, boolean uniqueKeys) {
523+
public static LeafPage createNew(Btree btree, Page parent, int pageNumber) {
521524
// TODO: Reuse a shared buffer?
522525
ByteBuffer empty = ByteBuffer.allocate(6);
523526
empty.putShort((short) 0);
@@ -526,7 +529,7 @@ public static LeafPage createNew(Page parent, int pageNumber, boolean uniqueKeys
526529

527530
empty.flip();
528531

529-
return new LeafPage(parent, pageNumber, empty, uniqueKeys);
532+
return new LeafPage(btree, parent, pageNumber, empty);
530533
}
531534

532535
@Override

0 commit comments

Comments
 (0)