Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/me/doubledutch/pikadb/Column.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
import java.util.*;
import java.io.*;

import me.doubledutch.pikadb.page.Page;
import me.doubledutch.pikadb.page.PageFile;


public class Column{
private PageFile pageFile;
public int rootId;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/me/doubledutch/pikadb/Soup.java
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/me/doubledutch/pikadb/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -229,6 +233,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<Integer,Page> entry : f.pageMap.entrySet()){
Page page=entry.getValue();
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");
//}
}
System.out.println(" -- Cache hit ratio: "+(float)totalHit/(totalMiss+totalHit));
f.close();

/*
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/me/doubledutch/pikadb/Variant.java
Original file line number Diff line number Diff line change
@@ -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<Variant>{
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/me/doubledutch/pikadb/WriteAheadLog.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package me.doubledutch.pikadb;

import me.doubledutch.pikadb.page.PageDiff;

public class WriteAheadLog{
public WriteAheadLog(String filename){

Expand Down
35 changes: 35 additions & 0 deletions src/main/java/me/doubledutch/pikadb/page/LRUPageCache.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package me.doubledutch.pikadb.page;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Map;

class LRUPageCache implements PageCache{
private int size;
private Map<Integer, Page> pageMap;
private Deque<Integer> pageCache;

public LRUPageCache(Map<Integer, Page> map, int size){
this.size=size;
this.pageMap=map;
this.pageCache=new ArrayDeque<Integer>();
}

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;
}
}
8 changes: 8 additions & 0 deletions src/main/java/me/doubledutch/pikadb/page/NoopPageCache.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package me.doubledutch.pikadb.page;


class NoopPageCache implements PageCache{
public boolean Set(int id) {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -29,6 +31,8 @@ public class Page{

private List<PageDiff> diffList=new LinkedList<PageDiff>();

private int cacheMiss, cacheHit;

public Page(int id,long offset,RandomAccessFile pageFile,PageFile pageHandler) throws IOException{
this.id=id;
this.offset=offset;
Expand Down Expand Up @@ -74,9 +78,12 @@ protected void unloadRawData(){
private void loadRawData() throws IOException{
if(rawData==null){
pageHandler.trimPageSet(id);
cacheMiss++;
rawData=new byte[PAYLOAD];
pageFile.seek(offset+HEADER);
pageFile.readFully(rawData);
} else {
cacheHit++;
}
}

Expand Down Expand Up @@ -181,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;
}
}
10 changes: 10 additions & 0 deletions src/main/java/me/doubledutch/pikadb/page/PageCache.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package me.doubledutch.pikadb.page;

interface PageCache{
/**
* Sets an item in the cache
* @param id id of cached item
* @return whether or not item is cached
*/
boolean Set(int id);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package me.doubledutch.pikadb;
package me.doubledutch.pikadb.page;

public class PageDiff{
private int offset;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
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{
private Map<Integer,Page> pageMap=new HashMap<Integer,Page>();
public Map<Integer,Page> pageMap=new HashMap<Integer,Page>();
private RandomAccessFile pageFile;
private FileChannel pageFileChannel;
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;
Expand All @@ -22,15 +27,15 @@ public PageFile(String filename) throws IOException{
ftest.delete();
wal=null;
}
this.cache=new SLRUPageCache(pageMap, CACHE_SIZE);
}

private void recoverTransaction(){
// Replay everything in the write ahead log
}


private void trimPageSet(int id){

protected void trimPageSet(int id){
cache.Set(id);
}

public Page getPage(int id) throws IOException{
Expand Down Expand Up @@ -71,7 +76,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
Expand Down
49 changes: 49 additions & 0 deletions src/main/java/me/doubledutch/pikadb/page/SLRUPageCache.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package me.doubledutch.pikadb.page;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Map;

class SLRUPageCache implements PageCache{
private int size;
private Map<Integer, Page> pageMap;
private Deque<Integer> l1, l2;

public SLRUPageCache(Map<Integer, Page> map, int size){
this.size=size;
this.pageMap=map;
this.l1=new ArrayDeque<Integer>();
this.l2=new ArrayDeque<Integer>();
}

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;
}
}