From b41e7f93bd3a721cdfcbb897c9eb80a076ff898b Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Fri, 25 Sep 2015 19:01:44 -0700 Subject: [PATCH 01/10] simple LRU --- .../java/me/doubledutch/pikadb/PageFile.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 6651318..3b8d28f 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -10,6 +10,8 @@ public class PageFile{ private FileChannel pageFileChannel; private String filename; private WriteAheadLog wal=null; + public static int LRU_SIZE = 50; + private Deque pageLRU; public PageFile(String filename) throws IOException{ this.filename=filename; @@ -22,15 +24,27 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } + this.pageLRU = new LinkedList(); } private void recoverTransaction(){ // Replay everything in the write ahead log } + protected void trimPageSet(int id){ + if (!pageMap.containsKey(id)) { + return; + } - private void trimPageSet(int id){ - + if (pageLRU.size() >= LRU_SIZE) { + Page evict=pageLRU.removeLast(); + evict.unloadRawData(); + } + Page page=pageMap.get(id); + if (pageLRU.contains(page)) { + pageLRU.remove(page); + } + pageLRU.add(page); } public Page getPage(int id) throws IOException{ @@ -71,7 +85,7 @@ public void saveChanges(boolean sort) throws IOException{ page.flatten(); Column.sort(page); } - page.commitChanges(wal); + page.commitChanges(wal); } wal.closeTransaction(); // Write to page file From 59bcf60200c06702d29fb559a4f42ddb2177c5fe Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Fri, 25 Sep 2015 22:58:32 -0700 Subject: [PATCH 02/10] stab at SLRU --- .../java/me/doubledutch/pikadb/PageFile.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 3b8d28f..53a0e2c 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -10,8 +10,9 @@ public class PageFile{ private FileChannel pageFileChannel; private String filename; private WriteAheadLog wal=null; - public static int LRU_SIZE = 50; + public static int LRU_SIZE = 10; private Deque pageLRU; + private Deque pageSecondLRU; public PageFile(String filename) throws IOException{ this.filename=filename; @@ -25,6 +26,7 @@ public PageFile(String filename) throws IOException{ wal=null; } this.pageLRU = new LinkedList(); + this.pageSecondLRU = new LinkedList(); } private void recoverTransaction(){ @@ -36,6 +38,42 @@ protected void trimPageSet(int id){ return; } + // -- SLRU -- + // If the page exists in L1 + // If L2 at size, move end to back of L2 + // Else, move it to L2 + Page page=pageMap.get(id); + if (pageLRU.contains(page)) { + pageLRU.remove(page); + pageSecondLRU.addLast(page); + //System.out.println("L2 addition"); + if (pageSecondLRU.size() > LRU_SIZE) { + Page toOne=pageSecondLRU.removeLast(); + pageLRU.addFirst(toOne); + //System.out.println("L2 eviction"); + } + return; + } + // If page exists in L2, move to L2 front + if (pageSecondLRU.contains(page)) { + //System.out.println("L2 update"); + pageSecondLRU.remove(page); + pageSecondLRU.addFirst(page); + return; + } + // If L1 size is maximum, move back to L2 front + // Put at front of L1 cache + //System.out.println("L1 addition"); + pageLRU.addFirst(page); + if (pageLRU.size() > LRU_SIZE) { + //System.out.println("L1 eviction"); + Page evict=pageLRU.removeLast(); + evict.unloadRawData(); + } + + // + + /* -- LRU -- if (pageLRU.size() >= LRU_SIZE) { Page evict=pageLRU.removeLast(); evict.unloadRawData(); @@ -45,6 +83,7 @@ protected void trimPageSet(int id){ pageLRU.remove(page); } pageLRU.add(page); + */ } public Page getPage(int id) throws IOException{ From a259925b967d5f43333883691c38aa9bf76a1867 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 26 Sep 2015 11:17:22 -0700 Subject: [PATCH 03/10] add cache interface for swapping implementations --- .../java/me/doubledutch/pikadb/PageCache.java | 87 +++++++++++++++++++ .../java/me/doubledutch/pikadb/PageFile.java | 58 +------------ 2 files changed, 90 insertions(+), 55 deletions(-) create mode 100644 src/main/java/me/doubledutch/pikadb/PageCache.java diff --git a/src/main/java/me/doubledutch/pikadb/PageCache.java b/src/main/java/me/doubledutch/pikadb/PageCache.java new file mode 100644 index 0000000..a1bb3d2 --- /dev/null +++ b/src/main/java/me/doubledutch/pikadb/PageCache.java @@ -0,0 +1,87 @@ +package me.doubledutch.pikadb; + +import java.io.*; +import java.nio.channels.*; +import java.util.*; + +interface PageCache{ + void Set(int id); +} + +class NoopPageCache implements PageCache{ + public void Set(int id) { + // Noop + } +} + +class LRUPageCache implements PageCache{ + private int size; + private Map pageMap; + private Deque pageCache; + + public LRUPageCache(Map map, int size){ + this.size = size; + this.pageMap = map; + this.pageCache = new LinkedList(); + } + + public void Set(int id){ + if (!pageMap.containsKey(id)){ + return; + } + Page page=pageMap.get(id); + if (pageCache.contains(page)){ + pageCache.remove(page); + } + pageCache.addFirst(page); + if (pageCache.size() > size){ + Page evict=pageCache.removeLast(); + evict.unloadRawData(); + } + } +} + +class SLRUPageCache implements PageCache{ + private int size; + private Map pageMap; + private Deque lOne; + private Deque lTwo; + + public SLRUPageCache(Map map, int size){ + this.size = size; + this.pageMap = map; + this.lOne = new LinkedList(); + this.lTwo = new LinkedList(); + } + + public void Set(int id){ + if (!pageMap.containsKey(id)){ + return; + } + // If the page exists in L1, move it to L2 + // If L2 at size, move end to back of L1 + Page page=pageMap.get(id); + if (lOne.contains(page)){ + lOne.remove(page); + lTwo.addLast(page); + if (lTwo.size() > size){ + Page toOne=lTwo.removeLast(); + lOne.addFirst(toOne); + } + return; + } + // If page exists in L2, move to L2 front + if (lTwo.contains(page)){ + lTwo.remove(page); + lTwo.addFirst(page); + return; + } + // If L1 size is maximum, move back to L2 front + // Put at front of L1 cache + lOne.addFirst(page); + if (lOne.size() > size){ + Page evict=lOne.removeLast(); + evict.unloadRawData(); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 53a0e2c..f93f67a 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -10,9 +10,7 @@ public class PageFile{ private FileChannel pageFileChannel; private String filename; private WriteAheadLog wal=null; - public static int LRU_SIZE = 10; - private Deque pageLRU; - private Deque pageSecondLRU; + private PageCache cache; public PageFile(String filename) throws IOException{ this.filename=filename; @@ -25,8 +23,7 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } - this.pageLRU = new LinkedList(); - this.pageSecondLRU = new LinkedList(); + this.cache=new LRUPageCache(pageMap, 20); } private void recoverTransaction(){ @@ -34,56 +31,7 @@ private void recoverTransaction(){ } protected void trimPageSet(int id){ - if (!pageMap.containsKey(id)) { - return; - } - - // -- SLRU -- - // If the page exists in L1 - // If L2 at size, move end to back of L2 - // Else, move it to L2 - Page page=pageMap.get(id); - if (pageLRU.contains(page)) { - pageLRU.remove(page); - pageSecondLRU.addLast(page); - //System.out.println("L2 addition"); - if (pageSecondLRU.size() > LRU_SIZE) { - Page toOne=pageSecondLRU.removeLast(); - pageLRU.addFirst(toOne); - //System.out.println("L2 eviction"); - } - return; - } - // If page exists in L2, move to L2 front - if (pageSecondLRU.contains(page)) { - //System.out.println("L2 update"); - pageSecondLRU.remove(page); - pageSecondLRU.addFirst(page); - return; - } - // If L1 size is maximum, move back to L2 front - // Put at front of L1 cache - //System.out.println("L1 addition"); - pageLRU.addFirst(page); - if (pageLRU.size() > LRU_SIZE) { - //System.out.println("L1 eviction"); - Page evict=pageLRU.removeLast(); - evict.unloadRawData(); - } - - // - - /* -- LRU -- - if (pageLRU.size() >= LRU_SIZE) { - Page evict=pageLRU.removeLast(); - evict.unloadRawData(); - } - Page page=pageMap.get(id); - if (pageLRU.contains(page)) { - pageLRU.remove(page); - } - pageLRU.add(page); - */ + cache.Set(id); } public Page getPage(int id) throws IOException{ From b482e45eec120dece7c9d8a7d4ba2677f3b3dbe1 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 26 Sep 2015 13:39:50 -0700 Subject: [PATCH 04/10] use int in deque. print cache hit ratio include ARC implementation --- src/main/java/me/doubledutch/pikadb/Page.java | 84 ++++++++++++++++++- .../java/me/doubledutch/pikadb/PageCache.java | 56 ++++++------- .../java/me/doubledutch/pikadb/PageFile.java | 4 +- src/main/java/me/doubledutch/pikadb/Test.java | 11 +++ 4 files changed, 123 insertions(+), 32 deletions(-) diff --git a/src/main/java/me/doubledutch/pikadb/Page.java b/src/main/java/me/doubledutch/pikadb/Page.java index 9a7f189..8ad0985 100644 --- a/src/main/java/me/doubledutch/pikadb/Page.java +++ b/src/main/java/me/doubledutch/pikadb/Page.java @@ -29,6 +29,8 @@ public class Page{ private List diffList=new LinkedList(); + protected int cacheMiss, cacheHit; + public Page(int id,long offset,RandomAccessFile pageFile,PageFile pageHandler) throws IOException{ this.id=id; this.offset=offset; @@ -72,11 +74,14 @@ protected void unloadRawData(){ } private void loadRawData() throws IOException{ + pageHandler.trimPageSet(id); if(rawData==null){ - pageHandler.trimPageSet(id); + cacheMiss++; rawData=new byte[PAYLOAD]; pageFile.seek(offset+HEADER); pageFile.readFully(rawData); + } else { + cacheHit++; } } @@ -181,4 +186,81 @@ public void appendData(byte[] data){ dirty=true; // System.out.println("currentFill: "+id+" "+currentFill+" "+data.length); } +} + +/** + * Adaptive Replacement Cache + * Adapted from http://code.activestate.com/recipes/576532/ + */ +class ARCPageCache implements PageCache{ + private int c, p; + private Map pageMap; + private Deque t1, t2, b1, b2; + + public ARCPageCache(Map map, int size){ + this.c=size; + this.p=0; + this.pageMap=map; + t1=new ArrayDeque(); + t2=new ArrayDeque(); + b1=new ArrayDeque(); + b2=new ArrayDeque(); + } + + public void Set(int id){ + if (t1.contains(id)){ + t1.remove(id); + t2.addFirst(id); + return; + } + if (t2.contains(id)){ + t2.remove(id); + t2.addFirst(id); + return; + } + if (b1.contains(id)){ + p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); + replace(id); + b1.remove(id); + t2.addFirst(id); + return; + } + if (b2.contains(id)){ + p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); + replace(id); + b2.remove(id); + t2.addFirst(id); + return; + } + if (t1.size()+b1.size()==c){ + if (t1.size()= c){ + if (total == 2*c){ + b2.removeLast(); + } + replace(id); + } + } + t1.addFirst(id); + } + + private void replace(int id){ + Integer old; + if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ + old=t1.removeLast(); + b1.addFirst(old); + } else { + old=t2.removeLast(); + b2.addFirst(old); + } + pageMap.get(old).unloadRawData(); + } } \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageCache.java b/src/main/java/me/doubledutch/pikadb/PageCache.java index a1bb3d2..71a3cde 100644 --- a/src/main/java/me/doubledutch/pikadb/PageCache.java +++ b/src/main/java/me/doubledutch/pikadb/PageCache.java @@ -17,25 +17,25 @@ public void Set(int id) { class LRUPageCache implements PageCache{ private int size; private Map pageMap; - private Deque pageCache; + private Deque pageCache; public LRUPageCache(Map map, int size){ - this.size = size; - this.pageMap = map; - this.pageCache = new LinkedList(); + this.size=size; + this.pageMap=map; + this.pageCache=new ArrayDeque(); } public void Set(int id){ if (!pageMap.containsKey(id)){ return; } - Page page=pageMap.get(id); - if (pageCache.contains(page)){ - pageCache.remove(page); + if (pageCache.contains(id)){ + pageCache.remove(id); } - pageCache.addFirst(page); + pageCache.addFirst(id); if (pageCache.size() > size){ - Page evict=pageCache.removeLast(); + Integer evictID=pageCache.removeLast(); + Page evict=pageMap.get(evictID); evict.unloadRawData(); } } @@ -44,14 +44,13 @@ public void Set(int id){ class SLRUPageCache implements PageCache{ private int size; private Map pageMap; - private Deque lOne; - private Deque lTwo; + private Deque l1, l2; public SLRUPageCache(Map map, int size){ - this.size = size; - this.pageMap = map; - this.lOne = new LinkedList(); - this.lTwo = new LinkedList(); + this.size=size; + this.pageMap=map; + this.l1=new ArrayDeque(); + this.l2=new ArrayDeque(); } public void Set(int id){ @@ -60,27 +59,26 @@ public void Set(int id){ } // If the page exists in L1, move it to L2 // If L2 at size, move end to back of L1 - Page page=pageMap.get(id); - if (lOne.contains(page)){ - lOne.remove(page); - lTwo.addLast(page); - if (lTwo.size() > size){ - Page toOne=lTwo.removeLast(); - lOne.addFirst(toOne); + if (l1.contains(id)){ + l1.remove(id); + l2.addLast(id); + if (l2.size() > size){ + l1.addFirst(l2.removeLast()); } return; } // If page exists in L2, move to L2 front - if (lTwo.contains(page)){ - lTwo.remove(page); - lTwo.addFirst(page); + if (l2.contains(id)){ + l2.remove(id); + l2.addFirst(id); return; } - // If L1 size is maximum, move back to L2 front // Put at front of L1 cache - lOne.addFirst(page); - if (lOne.size() > size){ - Page evict=lOne.removeLast(); + l1.addFirst(id); + // If L1 size is at maximum, evict last page + if (l1.size() > size){ + Integer evictID=l1.removeLast(); + Page evict=pageMap.get(evictID); evict.unloadRawData(); } } diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index f93f67a..03dcc54 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -5,7 +5,7 @@ import java.util.*; public class PageFile{ - private Map pageMap=new HashMap(); + protected Map pageMap=new HashMap(); private RandomAccessFile pageFile; private FileChannel pageFileChannel; private String filename; @@ -23,7 +23,7 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } - this.cache=new LRUPageCache(pageMap, 20); + this.cache=new SLRUPageCache(pageMap, 500); } private void recoverTransaction(){ diff --git a/src/main/java/me/doubledutch/pikadb/Test.java b/src/main/java/me/doubledutch/pikadb/Test.java index be35dcb..69a0650 100644 --- a/src/main/java/me/doubledutch/pikadb/Test.java +++ b/src/main/java/me/doubledutch/pikadb/Test.java @@ -229,6 +229,17 @@ public static void main(String args[]){ obj=soup.scan(RECORDS/2); // System.out.println(obj); + int totalHit, totalMiss; + totalHit = totalMiss = 0; + for (Map.Entry entry : f.pageMap.entrySet()){ + Page page=entry.getValue(); + totalHit += page.cacheHit; + totalMiss += page.cacheMiss; + //if (page.cacheMiss > 0 || page.cacheHit > 0){ + // System.out.println("Page "+entry.getKey()+": "+page.cacheHit+" hits, "+page.cacheMiss+" misses"); + //} + } + System.out.println(" -- Cache hit ratio: "+(float)totalHit/(totalMiss+totalHit)); f.close(); /* From b10d71ea07fc4fba764705aacb5f1bf1c4633748 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sun, 27 Sep 2015 12:28:13 -0700 Subject: [PATCH 05/10] move ARC. return whether cache hit on set --- src/main/java/me/doubledutch/pikadb/Page.java | 79 +------------ .../java/me/doubledutch/pikadb/PageCache.java | 105 ++++++++++++++++-- .../java/me/doubledutch/pikadb/PageFile.java | 2 +- 3 files changed, 98 insertions(+), 88 deletions(-) diff --git a/src/main/java/me/doubledutch/pikadb/Page.java b/src/main/java/me/doubledutch/pikadb/Page.java index 8ad0985..73c76b8 100644 --- a/src/main/java/me/doubledutch/pikadb/Page.java +++ b/src/main/java/me/doubledutch/pikadb/Page.java @@ -74,8 +74,8 @@ protected void unloadRawData(){ } private void loadRawData() throws IOException{ - pageHandler.trimPageSet(id); if(rawData==null){ + pageHandler.trimPageSet(id); cacheMiss++; rawData=new byte[PAYLOAD]; pageFile.seek(offset+HEADER); @@ -186,81 +186,4 @@ public void appendData(byte[] data){ dirty=true; // System.out.println("currentFill: "+id+" "+currentFill+" "+data.length); } -} - -/** - * Adaptive Replacement Cache - * Adapted from http://code.activestate.com/recipes/576532/ - */ -class ARCPageCache implements PageCache{ - private int c, p; - private Map pageMap; - private Deque t1, t2, b1, b2; - - public ARCPageCache(Map map, int size){ - this.c=size; - this.p=0; - this.pageMap=map; - t1=new ArrayDeque(); - t2=new ArrayDeque(); - b1=new ArrayDeque(); - b2=new ArrayDeque(); - } - - public void Set(int id){ - if (t1.contains(id)){ - t1.remove(id); - t2.addFirst(id); - return; - } - if (t2.contains(id)){ - t2.remove(id); - t2.addFirst(id); - return; - } - if (b1.contains(id)){ - p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); - replace(id); - b1.remove(id); - t2.addFirst(id); - return; - } - if (b2.contains(id)){ - p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); - replace(id); - b2.remove(id); - t2.addFirst(id); - return; - } - if (t1.size()+b1.size()==c){ - if (t1.size()= c){ - if (total == 2*c){ - b2.removeLast(); - } - replace(id); - } - } - t1.addFirst(id); - } - - private void replace(int id){ - Integer old; - if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ - old=t1.removeLast(); - b1.addFirst(old); - } else { - old=t2.removeLast(); - b2.addFirst(old); - } - pageMap.get(old).unloadRawData(); - } } \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageCache.java b/src/main/java/me/doubledutch/pikadb/PageCache.java index 71a3cde..93342c0 100644 --- a/src/main/java/me/doubledutch/pikadb/PageCache.java +++ b/src/main/java/me/doubledutch/pikadb/PageCache.java @@ -5,12 +5,17 @@ import java.util.*; interface PageCache{ - void Set(int id); + /** + * Sets an item in the cache + * @param id id of cached item + * @return whether or not item is cached + */ + boolean Set(int id); } class NoopPageCache implements PageCache{ - public void Set(int id) { - // Noop + public boolean Set(int id) { + return false; } } @@ -25,12 +30,14 @@ public LRUPageCache(Map map, int size){ this.pageCache=new ArrayDeque(); } - public void Set(int id){ + public boolean Set(int id){ if (!pageMap.containsKey(id)){ - return; + return false; } + boolean cached=false; if (pageCache.contains(id)){ pageCache.remove(id); + cached=true; } pageCache.addFirst(id); if (pageCache.size() > size){ @@ -38,6 +45,7 @@ public void Set(int id){ Page evict=pageMap.get(evictID); evict.unloadRawData(); } + return cached; } } @@ -53,9 +61,9 @@ public SLRUPageCache(Map map, int size){ this.l2=new ArrayDeque(); } - public void Set(int id){ + public boolean Set(int id){ if (!pageMap.containsKey(id)){ - return; + return false; } // If the page exists in L1, move it to L2 // If L2 at size, move end to back of L1 @@ -65,13 +73,13 @@ public void Set(int id){ if (l2.size() > size){ l1.addFirst(l2.removeLast()); } - return; + return true; } // If page exists in L2, move to L2 front if (l2.contains(id)){ l2.remove(id); l2.addFirst(id); - return; + return true; } // Put at front of L1 cache l1.addFirst(id); @@ -81,5 +89,84 @@ public void Set(int id){ Page evict=pageMap.get(evictID); evict.unloadRawData(); } + return false; + } +} + +/** + * Adaptive Replacement Cache + * Adapted from http://code.activestate.com/recipes/576532/ + */ +class ARCPageCache implements PageCache{ + private int c, p; + private Map pageMap; + private Deque t1, t2, b1, b2; + + public ARCPageCache(Map map, int size){ + this.c=size; + this.p=0; + this.pageMap=map; + t1=new ArrayDeque(); + t2=new ArrayDeque(); + b1=new ArrayDeque(); + b2=new ArrayDeque(); + } + + public boolean Set(int id){ + if (t1.contains(id)){ + t1.remove(id); + t2.addFirst(id); + return true; + } + if (t2.contains(id)){ + t2.remove(id); + t2.addFirst(id); + return true; + } + if (b1.contains(id)){ + p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); + replace(id); + b1.remove(id); + t2.addFirst(id); + return false; + } + if (b2.contains(id)){ + p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); + replace(id); + b2.remove(id); + t2.addFirst(id); + return false; + } + if (t1.size()+b1.size()==c){ + if (t1.size()= c){ + if (total == 2*c){ + b2.removeLast(); + } + replace(id); + } + } + t1.addFirst(id); + return false; + } + + private void replace(int id){ + Integer old; + if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ + old=t1.removeLast(); + b1.addFirst(old); + } else { + old=t2.removeLast(); + b2.addFirst(old); + } + pageMap.get(old).unloadRawData(); } } \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 03dcc54..1629089 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -23,7 +23,7 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } - this.cache=new SLRUPageCache(pageMap, 500); + this.cache=new SLRUPageCache(pageMap, 100); } private void recoverTransaction(){ From feb493cbf083024cfd759002f1b44bf04d2d11a0 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 3 Oct 2015 15:05:41 -0700 Subject: [PATCH 06/10] separate caches into files --- .../me/doubledutch/pikadb/ARCPageCache.java | 83 +++++++++ .../java/me/doubledutch/pikadb/Column.java | 1 + .../me/doubledutch/pikadb/LRUPageCache.java | 35 ++++ .../me/doubledutch/pikadb/NoopPageCache.java | 7 + .../java/me/doubledutch/pikadb/PageCache.java | 162 ------------------ .../me/doubledutch/pikadb/SLRUPageCache.java | 49 ++++++ 6 files changed, 175 insertions(+), 162 deletions(-) create mode 100644 src/main/java/me/doubledutch/pikadb/ARCPageCache.java create mode 100644 src/main/java/me/doubledutch/pikadb/LRUPageCache.java create mode 100644 src/main/java/me/doubledutch/pikadb/NoopPageCache.java create mode 100644 src/main/java/me/doubledutch/pikadb/SLRUPageCache.java diff --git a/src/main/java/me/doubledutch/pikadb/ARCPageCache.java b/src/main/java/me/doubledutch/pikadb/ARCPageCache.java new file mode 100644 index 0000000..e28b190 --- /dev/null +++ b/src/main/java/me/doubledutch/pikadb/ARCPageCache.java @@ -0,0 +1,83 @@ +package me.doubledutch.pikadb; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Map; + +/** + * Adaptive Replacement Cache + * Adapted from http://code.activestate.com/recipes/576532/ + */ +class ARCPageCache implements PageCache{ + private int c, p; + private Map pageMap; + private Deque t1, t2, b1, b2; + + public ARCPageCache(Map map, int size){ + this.c=size; + this.p=0; + this.pageMap=map; + t1=new ArrayDeque(); + t2=new ArrayDeque(); + b1=new ArrayDeque(); + b2=new ArrayDeque(); + } + + public boolean Set(int id){ + if (t1.contains(id)){ + t1.remove(id); + t2.addFirst(id); + return true; + } + if (t2.contains(id)){ + t2.remove(id); + t2.addFirst(id); + return true; + } + if (b1.contains(id)){ + p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); + replace(id); + b1.remove(id); + t2.addFirst(id); + return false; + } + if (b2.contains(id)){ + p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); + replace(id); + b2.remove(id); + t2.addFirst(id); + return false; + } + if (t1.size()+b1.size()==c){ + if (t1.size()= c){ + if (total == 2*c){ + b2.removeLast(); + } + replace(id); + } + } + t1.addFirst(id); + return false; + } + + private void replace(int id){ + Integer old; + if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ + old=t1.removeLast(); + b1.addFirst(old); + } else { + old=t2.removeLast(); + b2.addFirst(old); + } + pageMap.get(old).unloadRawData(); + } +} \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/Column.java b/src/main/java/me/doubledutch/pikadb/Column.java index 24ef228..9909e63 100644 --- a/src/main/java/me/doubledutch/pikadb/Column.java +++ b/src/main/java/me/doubledutch/pikadb/Column.java @@ -3,6 +3,7 @@ import java.util.*; import java.io.*; + public class Column{ private PageFile pageFile; public int rootId; diff --git a/src/main/java/me/doubledutch/pikadb/LRUPageCache.java b/src/main/java/me/doubledutch/pikadb/LRUPageCache.java new file mode 100644 index 0000000..aae7d5c --- /dev/null +++ b/src/main/java/me/doubledutch/pikadb/LRUPageCache.java @@ -0,0 +1,35 @@ +package me.doubledutch.pikadb; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Map; + +class LRUPageCache implements PageCache{ + private int size; + private Map pageMap; + private Deque pageCache; + + public LRUPageCache(Map map, int size){ + this.size=size; + this.pageMap=map; + this.pageCache=new ArrayDeque(); + } + + public boolean Set(int id){ + if (!pageMap.containsKey(id)){ + return false; + } + boolean cached=false; + if (pageCache.contains(id)){ + pageCache.remove(id); + cached=true; + } + pageCache.addFirst(id); + if (pageCache.size() > size){ + Integer evictID=pageCache.removeLast(); + Page evict=pageMap.get(evictID); + evict.unloadRawData(); + } + return cached; + } +} \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/NoopPageCache.java b/src/main/java/me/doubledutch/pikadb/NoopPageCache.java new file mode 100644 index 0000000..2093424 --- /dev/null +++ b/src/main/java/me/doubledutch/pikadb/NoopPageCache.java @@ -0,0 +1,7 @@ +package me.doubledutch.pikadb; + +class NoopPageCache implements PageCache{ + public boolean Set(int id) { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageCache.java b/src/main/java/me/doubledutch/pikadb/PageCache.java index 93342c0..589d4df 100644 --- a/src/main/java/me/doubledutch/pikadb/PageCache.java +++ b/src/main/java/me/doubledutch/pikadb/PageCache.java @@ -1,9 +1,5 @@ package me.doubledutch.pikadb; -import java.io.*; -import java.nio.channels.*; -import java.util.*; - interface PageCache{ /** * Sets an item in the cache @@ -11,162 +7,4 @@ interface PageCache{ * @return whether or not item is cached */ boolean Set(int id); -} - -class NoopPageCache implements PageCache{ - public boolean Set(int id) { - return false; - } -} - -class LRUPageCache implements PageCache{ - private int size; - private Map pageMap; - private Deque pageCache; - - public LRUPageCache(Map map, int size){ - this.size=size; - this.pageMap=map; - this.pageCache=new ArrayDeque(); - } - - public boolean Set(int id){ - if (!pageMap.containsKey(id)){ - return false; - } - boolean cached=false; - if (pageCache.contains(id)){ - pageCache.remove(id); - cached=true; - } - pageCache.addFirst(id); - if (pageCache.size() > size){ - Integer evictID=pageCache.removeLast(); - Page evict=pageMap.get(evictID); - evict.unloadRawData(); - } - return cached; - } -} - -class SLRUPageCache implements PageCache{ - private int size; - private Map pageMap; - private Deque l1, l2; - - public SLRUPageCache(Map map, int size){ - this.size=size; - this.pageMap=map; - this.l1=new ArrayDeque(); - this.l2=new ArrayDeque(); - } - - public boolean Set(int id){ - if (!pageMap.containsKey(id)){ - return false; - } - // If the page exists in L1, move it to L2 - // If L2 at size, move end to back of L1 - if (l1.contains(id)){ - l1.remove(id); - l2.addLast(id); - if (l2.size() > size){ - l1.addFirst(l2.removeLast()); - } - return true; - } - // If page exists in L2, move to L2 front - if (l2.contains(id)){ - l2.remove(id); - l2.addFirst(id); - return true; - } - // Put at front of L1 cache - l1.addFirst(id); - // If L1 size is at maximum, evict last page - if (l1.size() > size){ - Integer evictID=l1.removeLast(); - Page evict=pageMap.get(evictID); - evict.unloadRawData(); - } - return false; - } -} - -/** - * Adaptive Replacement Cache - * Adapted from http://code.activestate.com/recipes/576532/ - */ -class ARCPageCache implements PageCache{ - private int c, p; - private Map pageMap; - private Deque t1, t2, b1, b2; - - public ARCPageCache(Map map, int size){ - this.c=size; - this.p=0; - this.pageMap=map; - t1=new ArrayDeque(); - t2=new ArrayDeque(); - b1=new ArrayDeque(); - b2=new ArrayDeque(); - } - - public boolean Set(int id){ - if (t1.contains(id)){ - t1.remove(id); - t2.addFirst(id); - return true; - } - if (t2.contains(id)){ - t2.remove(id); - t2.addFirst(id); - return true; - } - if (b1.contains(id)){ - p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); - replace(id); - b1.remove(id); - t2.addFirst(id); - return false; - } - if (b2.contains(id)){ - p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); - replace(id); - b2.remove(id); - t2.addFirst(id); - return false; - } - if (t1.size()+b1.size()==c){ - if (t1.size()= c){ - if (total == 2*c){ - b2.removeLast(); - } - replace(id); - } - } - t1.addFirst(id); - return false; - } - - private void replace(int id){ - Integer old; - if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ - old=t1.removeLast(); - b1.addFirst(old); - } else { - old=t2.removeLast(); - b2.addFirst(old); - } - pageMap.get(old).unloadRawData(); - } } \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/SLRUPageCache.java b/src/main/java/me/doubledutch/pikadb/SLRUPageCache.java new file mode 100644 index 0000000..0ad2d3e --- /dev/null +++ b/src/main/java/me/doubledutch/pikadb/SLRUPageCache.java @@ -0,0 +1,49 @@ +package me.doubledutch.pikadb; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Map; + +class SLRUPageCache implements PageCache{ + private int size; + private Map pageMap; + private Deque l1, l2; + + public SLRUPageCache(Map map, int size){ + this.size=size; + this.pageMap=map; + this.l1=new ArrayDeque(); + this.l2=new ArrayDeque(); + } + + public boolean Set(int id){ + if (!pageMap.containsKey(id)){ + return false; + } + // If the page exists in L1, move it to L2 + // If L2 at size, move end to back of L1 + if (l1.contains(id)){ + l1.remove(id); + l2.addLast(id); + if (l2.size() > size){ + l1.addFirst(l2.removeLast()); + } + return true; + } + // If page exists in L2, move to L2 front + if (l2.contains(id)){ + l2.remove(id); + l2.addFirst(id); + return true; + } + // Put at front of L1 cache + l1.addFirst(id); + // If L1 size is at maximum, evict last page + if (l1.size() > size){ + Integer evictID=l1.removeLast(); + Page evict=pageMap.get(evictID); + evict.unloadRawData(); + } + return false; + } +} From a0e9ad28071dd920149c640c041dc543f7df8837 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 10 Oct 2015 11:04:36 -0700 Subject: [PATCH 07/10] remove ARC --- .../me/doubledutch/pikadb/ARCPageCache.java | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100644 src/main/java/me/doubledutch/pikadb/ARCPageCache.java diff --git a/src/main/java/me/doubledutch/pikadb/ARCPageCache.java b/src/main/java/me/doubledutch/pikadb/ARCPageCache.java deleted file mode 100644 index e28b190..0000000 --- a/src/main/java/me/doubledutch/pikadb/ARCPageCache.java +++ /dev/null @@ -1,83 +0,0 @@ -package me.doubledutch.pikadb; - -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.Map; - -/** - * Adaptive Replacement Cache - * Adapted from http://code.activestate.com/recipes/576532/ - */ -class ARCPageCache implements PageCache{ - private int c, p; - private Map pageMap; - private Deque t1, t2, b1, b2; - - public ARCPageCache(Map map, int size){ - this.c=size; - this.p=0; - this.pageMap=map; - t1=new ArrayDeque(); - t2=new ArrayDeque(); - b1=new ArrayDeque(); - b2=new ArrayDeque(); - } - - public boolean Set(int id){ - if (t1.contains(id)){ - t1.remove(id); - t2.addFirst(id); - return true; - } - if (t2.contains(id)){ - t2.remove(id); - t2.addFirst(id); - return true; - } - if (b1.contains(id)){ - p = Math.min(c, p+Math.max(b2.size()/b1.size(), 1)); - replace(id); - b1.remove(id); - t2.addFirst(id); - return false; - } - if (b2.contains(id)){ - p = Math.max(0, p-Math.max(b1.size()/b2.size(),1)); - replace(id); - b2.remove(id); - t2.addFirst(id); - return false; - } - if (t1.size()+b1.size()==c){ - if (t1.size()= c){ - if (total == 2*c){ - b2.removeLast(); - } - replace(id); - } - } - t1.addFirst(id); - return false; - } - - private void replace(int id){ - Integer old; - if (this.t1.size() > 0 && ((b2.contains(id) && t1.size() == this.p) || (t1.size() > this.p))){ - old=t1.removeLast(); - b1.addFirst(old); - } else { - old=t2.removeLast(); - b2.addFirst(old); - } - pageMap.get(old).unloadRawData(); - } -} \ No newline at end of file From b021458e37c0ae3d29d1851cb89cd339f39e2b8d Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 10 Oct 2015 11:04:53 -0700 Subject: [PATCH 08/10] change size back to 500 --- src/main/java/me/doubledutch/pikadb/PageFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 1629089..03dcc54 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -23,7 +23,7 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } - this.cache=new SLRUPageCache(pageMap, 100); + this.cache=new SLRUPageCache(pageMap, 500); } private void recoverTransaction(){ From e2422d0699f1aae2c4dfc11b41f06884d35cec32 Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 10 Oct 2015 11:06:01 -0700 Subject: [PATCH 09/10] move cache size to constant --- src/main/java/me/doubledutch/pikadb/PageFile.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/PageFile.java index 03dcc54..e1e7c8a 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/PageFile.java @@ -11,6 +11,7 @@ public class PageFile{ private String filename; private WriteAheadLog wal=null; private PageCache cache; + private static int CACHE_SIZE = 500; public PageFile(String filename) throws IOException{ this.filename=filename; @@ -23,7 +24,7 @@ public PageFile(String filename) throws IOException{ ftest.delete(); wal=null; } - this.cache=new SLRUPageCache(pageMap, 500); + this.cache=new SLRUPageCache(pageMap, CACHE_SIZE); } private void recoverTransaction(){ From 320acaf2ab7ed2bafa1821db2296aea5953308bf Mon Sep 17 00:00:00 2001 From: Kevin Pike Date: Sat, 10 Oct 2015 11:11:41 -0700 Subject: [PATCH 10/10] page package --- src/main/java/me/doubledutch/pikadb/Column.java | 3 +++ src/main/java/me/doubledutch/pikadb/Soup.java | 4 ++++ src/main/java/me/doubledutch/pikadb/Test.java | 8 ++++++-- src/main/java/me/doubledutch/pikadb/Variant.java | 4 ++++ .../java/me/doubledutch/pikadb/WriteAheadLog.java | 2 ++ .../pikadb/{ => page}/LRUPageCache.java | 2 +- .../pikadb/{ => page}/NoopPageCache.java | 3 ++- .../me/doubledutch/pikadb/{ => page}/Page.java | 14 ++++++++++++-- .../doubledutch/pikadb/{ => page}/PageCache.java | 2 +- .../me/doubledutch/pikadb/{ => page}/PageDiff.java | 2 +- .../me/doubledutch/pikadb/{ => page}/PageFile.java | 7 +++++-- .../pikadb/{ => page}/SLRUPageCache.java | 2 +- 12 files changed, 42 insertions(+), 11 deletions(-) rename src/main/java/me/doubledutch/pikadb/{ => page}/LRUPageCache.java (95%) rename src/main/java/me/doubledutch/pikadb/{ => page}/NoopPageCache.java (71%) rename src/main/java/me/doubledutch/pikadb/{ => page}/Page.java (94%) rename src/main/java/me/doubledutch/pikadb/{ => page}/PageCache.java (81%) rename src/main/java/me/doubledutch/pikadb/{ => page}/PageDiff.java (87%) rename src/main/java/me/doubledutch/pikadb/{ => page}/PageFile.java (92%) rename src/main/java/me/doubledutch/pikadb/{ => page}/SLRUPageCache.java (96%) diff --git a/src/main/java/me/doubledutch/pikadb/Column.java b/src/main/java/me/doubledutch/pikadb/Column.java index 9909e63..3b18f45 100644 --- a/src/main/java/me/doubledutch/pikadb/Column.java +++ b/src/main/java/me/doubledutch/pikadb/Column.java @@ -3,6 +3,9 @@ import java.util.*; import java.io.*; +import me.doubledutch.pikadb.page.Page; +import me.doubledutch.pikadb.page.PageFile; + public class Column{ private PageFile pageFile; diff --git a/src/main/java/me/doubledutch/pikadb/Soup.java b/src/main/java/me/doubledutch/pikadb/Soup.java index 8239a80..81251db 100644 --- a/src/main/java/me/doubledutch/pikadb/Soup.java +++ b/src/main/java/me/doubledutch/pikadb/Soup.java @@ -2,6 +2,10 @@ import java.io.*; import java.util.*; + +import me.doubledutch.pikadb.page.Page; +import me.doubledutch.pikadb.page.PageFile; + import org.json.*; public class Soup{ diff --git a/src/main/java/me/doubledutch/pikadb/Test.java b/src/main/java/me/doubledutch/pikadb/Test.java index 69a0650..c7a518c 100644 --- a/src/main/java/me/doubledutch/pikadb/Test.java +++ b/src/main/java/me/doubledutch/pikadb/Test.java @@ -2,6 +2,10 @@ import java.io.*; import java.util.*; + +import me.doubledutch.pikadb.page.Page; +import me.doubledutch.pikadb.page.PageFile; + import org.json.*; public class Test{ @@ -233,8 +237,8 @@ public static void main(String args[]){ totalHit = totalMiss = 0; for (Map.Entry entry : f.pageMap.entrySet()){ Page page=entry.getValue(); - totalHit += page.cacheHit; - totalMiss += page.cacheMiss; + totalHit += page.getCacheHits(); + totalMiss += page.getCacheMisses(); //if (page.cacheMiss > 0 || page.cacheHit > 0){ // System.out.println("Page "+entry.getKey()+": "+page.cacheHit+" hits, "+page.cacheMiss+" misses"); //} diff --git a/src/main/java/me/doubledutch/pikadb/Variant.java b/src/main/java/me/doubledutch/pikadb/Variant.java index 17fb221..e23ca12 100644 --- a/src/main/java/me/doubledutch/pikadb/Variant.java +++ b/src/main/java/me/doubledutch/pikadb/Variant.java @@ -1,7 +1,11 @@ package me.doubledutch.pikadb; import java.io.*; + +import me.doubledutch.pikadb.page.Page; + import org.json.*; + import java.util.*; public abstract class Variant implements Comparable{ diff --git a/src/main/java/me/doubledutch/pikadb/WriteAheadLog.java b/src/main/java/me/doubledutch/pikadb/WriteAheadLog.java index 1cf7424..b1bf6b1 100644 --- a/src/main/java/me/doubledutch/pikadb/WriteAheadLog.java +++ b/src/main/java/me/doubledutch/pikadb/WriteAheadLog.java @@ -1,5 +1,7 @@ package me.doubledutch.pikadb; +import me.doubledutch.pikadb.page.PageDiff; + public class WriteAheadLog{ public WriteAheadLog(String filename){ diff --git a/src/main/java/me/doubledutch/pikadb/LRUPageCache.java b/src/main/java/me/doubledutch/pikadb/page/LRUPageCache.java similarity index 95% rename from src/main/java/me/doubledutch/pikadb/LRUPageCache.java rename to src/main/java/me/doubledutch/pikadb/page/LRUPageCache.java index aae7d5c..c52444f 100644 --- a/src/main/java/me/doubledutch/pikadb/LRUPageCache.java +++ b/src/main/java/me/doubledutch/pikadb/page/LRUPageCache.java @@ -1,4 +1,4 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; import java.util.ArrayDeque; import java.util.Deque; diff --git a/src/main/java/me/doubledutch/pikadb/NoopPageCache.java b/src/main/java/me/doubledutch/pikadb/page/NoopPageCache.java similarity index 71% rename from src/main/java/me/doubledutch/pikadb/NoopPageCache.java rename to src/main/java/me/doubledutch/pikadb/page/NoopPageCache.java index 2093424..f46fc56 100644 --- a/src/main/java/me/doubledutch/pikadb/NoopPageCache.java +++ b/src/main/java/me/doubledutch/pikadb/page/NoopPageCache.java @@ -1,4 +1,5 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; + class NoopPageCache implements PageCache{ public boolean Set(int id) { diff --git a/src/main/java/me/doubledutch/pikadb/Page.java b/src/main/java/me/doubledutch/pikadb/page/Page.java similarity index 94% rename from src/main/java/me/doubledutch/pikadb/Page.java rename to src/main/java/me/doubledutch/pikadb/page/Page.java index 73c76b8..3e5fb7e 100644 --- a/src/main/java/me/doubledutch/pikadb/Page.java +++ b/src/main/java/me/doubledutch/pikadb/page/Page.java @@ -1,8 +1,10 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; import java.util.*; import java.io.*; +import me.doubledutch.pikadb.WriteAheadLog; + public class Page{ public static int UNSORTED=0; public static int SORTED=1; @@ -29,7 +31,7 @@ public class Page{ private List diffList=new LinkedList(); - protected int cacheMiss, cacheHit; + private int cacheMiss, cacheHit; public Page(int id,long offset,RandomAccessFile pageFile,PageFile pageHandler) throws IOException{ this.id=id; @@ -186,4 +188,12 @@ public void appendData(byte[] data){ dirty=true; // System.out.println("currentFill: "+id+" "+currentFill+" "+data.length); } + + public int getCacheHits() { + return cacheHit; + } + + public int getCacheMisses() { + return cacheMiss; + } } \ No newline at end of file diff --git a/src/main/java/me/doubledutch/pikadb/PageCache.java b/src/main/java/me/doubledutch/pikadb/page/PageCache.java similarity index 81% rename from src/main/java/me/doubledutch/pikadb/PageCache.java rename to src/main/java/me/doubledutch/pikadb/page/PageCache.java index 589d4df..0feedc8 100644 --- a/src/main/java/me/doubledutch/pikadb/PageCache.java +++ b/src/main/java/me/doubledutch/pikadb/page/PageCache.java @@ -1,4 +1,4 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; interface PageCache{ /** diff --git a/src/main/java/me/doubledutch/pikadb/PageDiff.java b/src/main/java/me/doubledutch/pikadb/page/PageDiff.java similarity index 87% rename from src/main/java/me/doubledutch/pikadb/PageDiff.java rename to src/main/java/me/doubledutch/pikadb/page/PageDiff.java index b1ea028..b7f064e 100644 --- a/src/main/java/me/doubledutch/pikadb/PageDiff.java +++ b/src/main/java/me/doubledutch/pikadb/page/PageDiff.java @@ -1,4 +1,4 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; public class PageDiff{ private int offset; diff --git a/src/main/java/me/doubledutch/pikadb/PageFile.java b/src/main/java/me/doubledutch/pikadb/page/PageFile.java similarity index 92% rename from src/main/java/me/doubledutch/pikadb/PageFile.java rename to src/main/java/me/doubledutch/pikadb/page/PageFile.java index e1e7c8a..7850570 100644 --- a/src/main/java/me/doubledutch/pikadb/PageFile.java +++ b/src/main/java/me/doubledutch/pikadb/page/PageFile.java @@ -1,11 +1,14 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; import java.io.*; import java.nio.channels.*; import java.util.*; +import me.doubledutch.pikadb.Column; +import me.doubledutch.pikadb.WriteAheadLog; + public class PageFile{ - protected Map pageMap=new HashMap(); + public Map pageMap=new HashMap(); private RandomAccessFile pageFile; private FileChannel pageFileChannel; private String filename; diff --git a/src/main/java/me/doubledutch/pikadb/SLRUPageCache.java b/src/main/java/me/doubledutch/pikadb/page/SLRUPageCache.java similarity index 96% rename from src/main/java/me/doubledutch/pikadb/SLRUPageCache.java rename to src/main/java/me/doubledutch/pikadb/page/SLRUPageCache.java index 0ad2d3e..aeb8d43 100644 --- a/src/main/java/me/doubledutch/pikadb/SLRUPageCache.java +++ b/src/main/java/me/doubledutch/pikadb/page/SLRUPageCache.java @@ -1,4 +1,4 @@ -package me.doubledutch.pikadb; +package me.doubledutch.pikadb.page; import java.util.ArrayDeque; import java.util.Deque;