From: jihoonl Date: Sat, 13 Feb 2010 00:09:44 +0000 (+0000) Subject: change X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c2bd38d7434317d24a2ae90db8696a7e3159d9d5;p=IRC.git change --- diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/FileSystem.java b/Robust/src/Benchmarks/Recovery/FileSystem/FileSystem.java deleted file mode 100644 index ffae3b38..00000000 --- a/Robust/src/Benchmarks/Recovery/FileSystem/FileSystem.java +++ /dev/null @@ -1,352 +0,0 @@ -/* -Usage : - ./FileSystem.bin -*/ - - - -public class FileSystem extends Thread { - DistributedHashMap dir; // Directory - DistributedHashMap fs; // File - DistributedLinkedList dir_list; - GlobalString inputfile; - int mid; - - public FileSystem(DistributedHashMap dir, DistributedHashMap fs, DistributedLinkedList dir_list) { - this.dir = dir; - this.fs = fs; - this.dir_list = dir_list; - } - - public FileSystem(DistributedHashMap dir, DistributedHashMap fs, DistributedLinkedList dir_list, String filename, int mid) { - this.dir = dir; - this.fs = fs; - this.dir_list = dir_list; - this.mid = mid; - this.inputfile = global new GlobalString("data/"+filename + mid); - } - - - public void setInputFileName(String filename, int mid) { - this.mid = mid; - this.inputfile = global new GlobalString("data/"+filename + mid); - } - - public void init() { - fillHashTable(); - } - - public void fillHashTable() { - GlobalString path; - DistributedLinkedList list; - - atomic { - path = global new GlobalString("/home/"); // root is 'home' - list = global new DistributedLinkedList(); - - dir.put(path, list); - dir_list.add(path); - } - } - - public static void fillTodoList(String file, LinkedList todoList) { - FileInputStream fis; - String comm; - char c; - String key; - String val; - Transaction t; - - fis = new FileInputStream(file); - - while ((comm = fis.readLine()) != null) { // 'command' 'path' - c = comm.charAt(0); // ex) w /home/abc.c - key = comm.subString(2); - t = new Transaction(c, key); - todoList.add(t); - } - } - - public void run() { - Transaction t; - - char command; - String key; - String val; - GlobalString gkey; - GlobalString gval; - boolean isDir; - - int index; - String file; - atomic { - file = inputfile.toLocalString(); - } - - LinkedList todoList = new LinkedList(); - fillTodoList(file, todoList); - - while (!todoList.isEmpty()) { - t = (Transaction)(todoList.removeFirst()); - - command = t.getCommand(); - key = t.getKey(); - - atomic { - gkey = global new GlobalString(key); - } - - index = key.lastindexOf('/'); - if (index+1 == key.length()) - isDir = true; - else - isDir = false; - - if (command == 'r') { - System.out.println("["+command+"] ["+key+"]"); - if (isDir == true) { - atomic { - readDirectory(gkey); - } - } - else { - atomic { - readFile(gkey); - } - } - } - else if (command == 'c') { - System.out.println("["+command+"] ["+key+"]"); - if (isDir == true) { - atomic { - createDirectory(gkey); - } - } - else { - val = t.getValue(); - atomic { - gval = global new GlobalString(val); - createFile(gkey, gval); - } - } - } - } - - sleep(3000000); - atomic { - output(); - } - - RecoveryStat.printRecoveryStat(); - } - - public void output() { - Iterator iter; - GlobalString gstr; - - iter = dir_list.iterator(); - - while (iter.hasNext()) { - gstr = (GlobalString)(iter.next()); - System.printString(gstr.toLocalString() + "\n"); - } - } - - public void readFile(GlobalString gkey) { - GlobalString gval; - String val; - - atomic { - gval = (GlobalString)(fs.get(gkey)); - val = gval.toLocalString(); - } - if (val != null) { -// System.out.println("<"+val+">"); - } - else { - System.out.println("No such file or directory"); - } - } - - public void readDirectory(GlobalString gkey) { - DistributedLinkedList list; - Iterator iter; - GlobalString gval; - - list = (DistributedLinkedList)(dir.get(gkey)); - - if (list != null) { - iter = list.iterator(); - while (iter.hasNext() == true) { - gval = (GlobalString)(iter.next()); -// System.out.print("["+gval.toLocalString()+"] "); - } -// System.out.println(""); - } - else { - System.out.println("No such file or directory"); - } - } - - public void createFile(GlobalString gkey, GlobalString gval) { - String path; - String target; - GlobalString gpath; - GlobalString gtarget; - int index; - DistributedLinkedList list; - - index = gkey.lastindexOf('/'); - gpath = gkey.subString(0, index+1); - gtarget = gkey.subString(index+1); - - if (dir.containsKey(gpath)) { - list = (DistributedLinkedList)(dir.get(gpath)); - list.push(gtarget); - dir.put(gpath, list); - fs.put(gkey, gval); - } - else { - System.out.println("Cannot create file"); - } - } - - public void createDirectory(GlobalString gkey) { - int index; - GlobalString gpath; - GlobalString gtarget; - DistributedLinkedList list; - - index = gkey.lastindexOf('/', gkey.length()-2); - - if (index != -1) { - gpath = gkey.subString(0, index+1); - gtarget = gkey.subString(index+1); - - if (dir.containsKey(gpath)) { - list = (DistributedLinkedList)(dir.get(gpath)); - list.push(gtarget); - dir.put(gpath, list); - - list = global new DistributedLinkedList(); - dir.put(gkey, list); - dir_list.add(gkey); - } - else { - System.out.println("Cannot create directory"); - } - } - else { - System.out.println("Cannot create directory"); - } - } - - public Object read(DistributedHashMap mydhmap, GlobalString key) { - Object obj = mydhmap.get(key); - - return obj; - } - - public static void main(String[] args) { - int NUM_THREADS = 3; - String filename = new String(); - - if (args.length == 2) { - NUM_THREADS = Integer.parseInt(args[0]); - filename = args[1]; - } - else { - System.out.println("./FileSystem.bin master "); - System.exit(0); - } - - int[] mid = new int[8]; - mid[0] = (128<<24)|(195<<16)|(180<<8)|21;//dw-2 - mid[1] = (128<<24)|(195<<16)|(180<<8)|26;//dw-7 -/* - mid[0] = (128<<24)|(195<<16)|(136<<8)|162;//dc-1 - mid[1] = (128<<24)|(195<<16)|(136<<8)|163;//dc-2 - mid[2] = (128<<24)|(195<<16)|(136<<8)|164;//dc-3 - mid[3] = (128<<24)|(195<<16)|(136<<8)|165;//dc-4 - mid[4] = (128<<24)|(195<<16)|(136<<8)|166;//dc-5 - mid[5] = (128<<24)|(195<<16)|(136<<8)|167;//dc-6 - mid[6] = (128<<24)|(195<<16)|(136<<8)|168;//dc-7 - mid[7] = (128<<24)|(195<<16)|(136<<8)|169;//dc-8 - */ - FileSystem[] lus; - FileSystem initLus; - - Work[] works; - Transaction[] currentWorkList; // type might be something else - - atomic { - currentWorkList = global new Transaction[NUM_THREADS]; // something else - works = global new Work[NUM_THREADS]; - - DistributedHashMap fs = global new DistributedHashMap(500, 500, 0.75f); - DistributedHashMap dir = global new DistributedHashMap(500, 500, 0.75f); - DistributedLinkedList dir_list = global new DistributedLinkedList(); - - initLus = global new FileSystem(dir, fs, dir_list); - initLus.init(); - - lus = global new FileSystem[NUM_THREADS]; - for(int i = 0; i < NUM_THREADS; i++) { -// lus[i] = initLus; -// lus[i].setInputFileName(filename, i); - lus[i] = global new FileSystem(initLus.dir, initLus.fs, initLus.dir_list, filename, i); - } - } - - FileSystem tmp; - /* Start threads */ - for(int i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = lus[i]; - } - Thread.myStart(tmp, mid[i]); - } - - /* Join threads */ - for(int i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = lus[i]; - } - tmp.join(); - } - - System.printString("Finished\n"); - } -} - -public class Transaction { // object for todoList - char command; // r: read, w: write - String key; - String val; - - Transaction (char c, String key) { - command = c; - - this.key = new String(key); - this.val = new String(); - } - - Transaction (char c, String key, String val) { - command = c; - - this.key = new String(key); - this.val = new String(val); - } - - public char getCommand() { - return command; - } - - public String getKey() { - return key; - } - - public String getValue() { - return val; - } -} diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/dstm.conf b/Robust/src/Benchmarks/Recovery/FileSystem/dstm.conf deleted file mode 100644 index 74a1e24c..00000000 --- a/Robust/src/Benchmarks/Recovery/FileSystem/dstm.conf +++ /dev/null @@ -1,3 +0,0 @@ -128.195.180.21 -#128.195.180.24 -128.195.180.26 diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/java/makefile b/Robust/src/Benchmarks/Recovery/FileSystem/java/makefile new file mode 100644 index 00000000..ab7f23e7 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/FileSystem/java/makefile @@ -0,0 +1,9 @@ +MAINCLASS=FileSystem +SRC1=${MAINCLASS}.java +FLAGS= -optimize -thread -mainclass ${MAINCLASS} +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/makefile b/Robust/src/Benchmarks/Recovery/FileSystem/makefile deleted file mode 100644 index 07625ee5..00000000 --- a/Robust/src/Benchmarks/Recovery/FileSystem/makefile +++ /dev/null @@ -1,9 +0,0 @@ -MAINCLASS=FileSystem -SRC1=${MAINCLASS}.java -FLAGS= -recoverystats -dsm -dsmtask -32bit -recovery -nooptimize -mainclass ${MAINCLASS} -default: - ../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} - -clean: - rm -rf tmpbuilddirectory - rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/recovery/FileSystem.java b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/FileSystem.java new file mode 100644 index 00000000..180d35b2 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/FileSystem.java @@ -0,0 +1,356 @@ +/* +Usage : + ./FileSystem.bin +*/ + + + +public class FileSystem extends Thread { + DistributedHashMap dir; // Directory + DistributedHashMap fs; // File + DistributedLinkedList dir_list; + GlobalString inputfile; + int mid; + + public FileSystem(DistributedHashMap dir, DistributedHashMap fs, DistributedLinkedList dir_list) { + this.dir = dir; + this.fs = fs; + this.dir_list = dir_list; + } + + public FileSystem(DistributedHashMap dir, DistributedHashMap fs, DistributedLinkedList dir_list, String filename, int mid) { + this.dir = dir; + this.fs = fs; + this.dir_list = dir_list; + this.mid = mid; + this.inputfile = global new GlobalString("../data/"+filename + mid); + } + + + public void setInputFileName(String filename, int mid) { + this.mid = mid; + this.inputfile = global new GlobalString("../data/"+filename + mid); + } + + public void init() { + fillHashTable(); + } + + public void fillHashTable() { + GlobalString path; + DistributedLinkedList list; + + atomic { + path = global new GlobalString("/home/"); // root is 'home' + list = global new DistributedLinkedList(); + + dir.put(path, list); + dir_list.add(path); + } + } + + public static void fillTodoList(String file, LinkedList todoList) { + FileInputStream fis; + String comm; + char c; + String key; + String val; + Transaction t; + + fis = new FileInputStream(file); + + while ((comm = fis.readLine()) != null) { // 'command' 'path' + c = comm.charAt(0); // ex) w /home/abc.c + key = comm.subString(2); + t = new Transaction(c, key); + todoList.add(t); + } + } + + public void run() { + Transaction t; + + char command; + String key; + String val; + GlobalString gkey; + GlobalString gval; + boolean isDir; + + int index; + String file; + atomic { + file = inputfile.toLocalString(); + } + + LinkedList todoList = new LinkedList(); + fillTodoList(file, todoList); + + while (!todoList.isEmpty()) { + t = (Transaction)(todoList.removeFirst()); + + command = t.getCommand(); + key = t.getKey(); + + atomic { + gkey = global new GlobalString(key); + } + + index = key.lastindexOf('/'); + if (index+1 == key.length()) + isDir = true; + else + isDir = false; + + if (command == 'r') { + System.out.println("["+command+"] ["+key+"]"); + if (isDir == true) { + atomic { + readDirectory(gkey); + } + } + else { + atomic { + readFile(gkey); + } + } + } + else if (command == 'c') { + System.out.println("["+command+"] ["+key+"]"); + if (isDir == true) { + atomic { + createDirectory(gkey); + } + } + else { + val = t.getValue(); + atomic { + gval = global new GlobalString(val); + createFile(gkey, gval); + } + } + } + } + + sleep(3000000); + atomic { + output(); + } + + RecoveryStat.printRecoveryStat(); + + + System.out.println("\n\n\n I'm done\n\n\n"); + + } + + public void output() { + Iterator iter; + GlobalString gstr; + + iter = dir_list.iterator(); + + while (iter.hasNext()) { + gstr = (GlobalString)(iter.next()); + System.printString(gstr.toLocalString() + "\n"); + } + } + + public void readFile(GlobalString gkey) { + GlobalString gval; + String val; + + atomic { + gval = (GlobalString)(fs.get(gkey)); + val = gval.toLocalString(); + } + if (val != null) { +// System.out.println("<"+val+">"); + } + else { + System.out.println("No such file or directory"); + } + } + + public void readDirectory(GlobalString gkey) { + DistributedLinkedList list; + Iterator iter; + GlobalString gval; + + list = (DistributedLinkedList)(dir.get(gkey)); + + if (list != null) { + iter = list.iterator(); + while (iter.hasNext() == true) { + gval = (GlobalString)(iter.next()); +// System.out.print("["+gval.toLocalString()+"] "); + } +// System.out.println(""); + } + else { + System.out.println("No such file or directory"); + } + } + + public void createFile(GlobalString gkey, GlobalString gval) { + String path; + String target; + GlobalString gpath; + GlobalString gtarget; + int index; + DistributedLinkedList list; + + index = gkey.lastindexOf('/'); + gpath = gkey.subString(0, index+1); + gtarget = gkey.subString(index+1); + + if (dir.containsKey(gpath)) { + list = (DistributedLinkedList)(dir.get(gpath)); + list.push(gtarget); + dir.put(gpath, list); + fs.put(gkey, gval); + } + else { + System.out.println("Cannot create file"); + } + } + + public void createDirectory(GlobalString gkey) { + int index; + GlobalString gpath; + GlobalString gtarget; + DistributedLinkedList list; + + index = gkey.lastindexOf('/', gkey.length()-2); + + if (index != -1) { + gpath = gkey.subString(0, index+1); + gtarget = gkey.subString(index+1); + + if (dir.containsKey(gpath)) { + list = (DistributedLinkedList)(dir.get(gpath)); + list.push(gtarget); + dir.put(gpath, list); + + list = global new DistributedLinkedList(); + dir.put(gkey, list); + dir_list.add(gkey); + } + else { + System.out.println("Cannot create directory"); + } + } + else { + System.out.println("Cannot create directory"); + } + } + + public Object read(DistributedHashMap mydhmap, GlobalString key) { + Object obj = mydhmap.get(key); + + return obj; + } + + public static void main(String[] args) { + int NUM_THREADS = 3; + String filename = new String(); + + if (args.length == 2) { + NUM_THREADS = Integer.parseInt(args[0]); + filename = args[1]; + } + else { + System.out.println("./FileSystem.bin master "); + System.exit(0); + } + + int[] mid = new int[8]; + mid[0] = (128<<24)|(195<<16)|(180<<8)|21;//dw-2 + mid[1] = (128<<24)|(195<<16)|(180<<8)|26;//dw-7 +/* + mid[0] = (128<<24)|(195<<16)|(136<<8)|162;//dc-1 + mid[1] = (128<<24)|(195<<16)|(136<<8)|163;//dc-2 + mid[2] = (128<<24)|(195<<16)|(136<<8)|164;//dc-3 + mid[3] = (128<<24)|(195<<16)|(136<<8)|165;//dc-4 + mid[4] = (128<<24)|(195<<16)|(136<<8)|166;//dc-5 + mid[5] = (128<<24)|(195<<16)|(136<<8)|167;//dc-6 + mid[6] = (128<<24)|(195<<16)|(136<<8)|168;//dc-7 + mid[7] = (128<<24)|(195<<16)|(136<<8)|169;//dc-8 + */ + FileSystem[] lus; + FileSystem initLus; + + Work[] works; + Transaction[] currentWorkList; // type might be something else + + atomic { + currentWorkList = global new Transaction[NUM_THREADS]; // something else + works = global new Work[NUM_THREADS]; + + DistributedHashMap fs = global new DistributedHashMap(500, 500, 0.75f); + DistributedHashMap dir = global new DistributedHashMap(500, 500, 0.75f); + DistributedLinkedList dir_list = global new DistributedLinkedList(); + + initLus = global new FileSystem(dir, fs, dir_list); + initLus.init(); + + lus = global new FileSystem[NUM_THREADS]; + for(int i = 0; i < NUM_THREADS; i++) { +// lus[i] = initLus; +// lus[i].setInputFileName(filename, i); + lus[i] = global new FileSystem(initLus.dir, initLus.fs, initLus.dir_list, filename, i); + } + } + + FileSystem tmp; + /* Start threads */ + for(int i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = lus[i]; + } + Thread.myStart(tmp, mid[i]); + } + + /* Join threads */ + for(int i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = lus[i]; + } + tmp.join(); + } + + System.printString("Finished\n"); + } +} + +public class Transaction { // object for todoList + char command; // r: read, w: write + String key; + String val; + + Transaction (char c, String key) { + command = c; + + this.key = new String(key); + this.val = new String(); + } + + Transaction (char c, String key, String val) { + command = c; + + this.key = new String(key); + this.val = new String(val); + } + + public char getCommand() { + return command; + } + + public String getKey() { + return key; + } + + public String getValue() { + return val; + } +} diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/recovery/dstm.conf b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/dstm.conf new file mode 100644 index 00000000..74a1e24c --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/dstm.conf @@ -0,0 +1,3 @@ +128.195.180.21 +#128.195.180.24 +128.195.180.26 diff --git a/Robust/src/Benchmarks/Recovery/FileSystem/recovery/makefile b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/makefile new file mode 100644 index 00000000..fcf36839 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/FileSystem/recovery/makefile @@ -0,0 +1,9 @@ +MAINCLASS=FileSystem +SRC1=${MAINCLASS}.java +FLAGS= -recoverystats -dsm -dsmtask -recovery -nooptimize -mainclass ${MAINCLASS} +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/MatrixMultiply.java b/Robust/src/Benchmarks/Recovery/MatrixMultiply/MatrixMultiply.java deleted file mode 100644 index 8d719c11..00000000 --- a/Robust/src/Benchmarks/Recovery/MatrixMultiply/MatrixMultiply.java +++ /dev/null @@ -1,268 +0,0 @@ -/* MatrixMultiplyN.java - - Matrix Multiplication Benchmark using Task Library. - a, b, and c are two dimensional array. - It computes a * b and assigns to c. - -*/ -public class MatrixMultiply extends Task { - MMul mmul; - int SIZE; - int increment; - - public MatrixMultiply(MMul mmul, int num_threads, int size,int increment) { - this.mmul = mmul; - - SIZE = size; - this.increment = increment; - - init(); - } - - public void init() { - todoList = global new GlobalQueue(); - - fillTodoList(); - } - - // fill up the Work Pool - public void fillTodoList() { - Segment seg; - int i; - - for(i = 0; i < SIZE; i +=increment) { - - if(i+increment > SIZE) { - seg = global new Segment(i,SIZE); - } - else { - seg = global new Segment(i, i + increment); - } - todoList.push(seg); - } - } - - public void execute() { - double la[][]; - double lc[][]; - double lb[][]; - double rowA[]; - double colB[]; - Segment seg; - - double innerproduct; - int i,j; - int x0; - int x1; - int size; - - // get matrix - atomic { - seg = (Segment)myWork; - x0 = seg.x0; // x start row - x1 = seg.x1; // x end row - la = mmul.a; // first mat - lb = mmul.btranspose; // second mat - size = SIZE; - } - - lc = new double[size][size]; - - for(i = x0; i < x1 ; i++) { - atomic { - rowA = la[i]; // grab first mat's row - - for(j = 0; j < size ; j++) { - colB = lb[j]; // grab second mat's col - - innerproduct = computeProduct(rowA,colB, size); // computes the value - - lc[i][j] = innerproduct; // store in dest mat - } // end of for j - } - } // end for i -// } - - atomic { - for (i = x0; i < x1; i++) { - for (j = 0; j < size; j++) { - mmul.c[i][j] = lc[i][j]; - } - } - } - } - - public double computeProduct(double[] rowA,double[] colB, int size) - { - int i; - double sum = 0; - - for(i = 0 ;i < size; i++) { - sum += rowA[i] * colB[i]; - } - - return sum; - } - - public void done(Object work) { - } - - public static void main(String[] args) { - int NUM_THREADS=4; - int SIZE = 1600; - int increment = 80; - int i,j; - Work[] works; - MMul matrix; - MatrixMultiply mm; - Segment[] currentWorkList; - - if (args.length == 3) { - NUM_THREADS = Integer.parseInt(args[0]); - SIZE = Integer.parseInt(args[1]); - increment = Integer.parseInt(args[2]); // size of subtask - } - else { - System.out.println("usage: ./MatrixMultiply.bin master "); - } - - int[] mid = new int[8]; - mid[0] = (128<<24)|(195<<16)|(180<<8)|21; //dw-2 -/* mid[1] = (128<<24)|(195<<16)|(180<<8)|24; //dw-5 - mid[2] = (128<<24)|(195<<16)|(180<<8)|26; //dw-7 - mid[0] = (128<<24)|(195<<16)|(136<<8)|162; //dc1 - mid[1] = (128<<24)|(195<<16)|(136<<8)|163; //dc2 - mid[2] = (128<<24)|(195<<16)|(136<<8)|164; //dc3 - mid[3] = (128<<24)|(195<<16)|(136<<8)|165; //dc4 - mid[4] = (128<<24)|(195<<16)|(136<<8)|166; //dc5 - mid[5] = (128<<24)|(195<<16)|(136<<8)|167; //dc6 - mid[6] = (128<<24)|(195<<16)|(136<<8)|168; //dc7 - mid[7] = (128<<24)|(195<<16)|(136<<8)|169; //dc8 -*/ - atomic { - matrix = global new MMul(SIZE, SIZE, SIZE); - matrix.setValues(); - matrix.transpose(); - mm = global new MatrixMultiply(matrix, NUM_THREADS, SIZE,increment); - - works = global new Work[NUM_THREADS]; - currentWorkList = global new Segment[NUM_THREADS]; - - for(i = 0; i < NUM_THREADS; i++) { - works[i] = global new Work(mm, NUM_THREADS, i,currentWorkList); - } - } - - long st = System.currentTimeMillis(); - long fi; - - Work tmp; - for (i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = works[i]; - } - Thread.myStart(tmp,mid[i]); - } - - for (i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = works[i]; - } - tmp.join(); - } - fi = System.currentTimeMillis(); - - double sum= 0; - atomic { - sum = matrix.getSum(); - } - - System.out.println("Sum of matrix = " + sum); - System.out.println("Time Elapse = " + (double)((fi-st)/1000)); - System.printString("Finished\n"); - } - - public void output() { - System.out.println("Sum = " + mmul.getSum()); - } - -} - -public class MMul{ - public int L, M, N; - public double[][] a; - public double[][] b; - public double[][] c; - public double[][] btranspose; - - public MMul(int L, int M, int N) { - this.L = L; - this.M = M; - this.N = N; - a = global new double[L][M]; - b = global new double[M][N]; - c = global new double[L][N]; - btranspose = global new double[N][M]; - } - - public void setValues() { - for(int i = 0; i < L; i++) { - double ai[] = a[i]; - for(int j = 0; j < M; j++) { - ai[j] = j+1; - } - } - - for(int i = 0; i < M; i++) { - double bi[] = b[i]; - for(int j = 0; j < N; j++) { - bi[j] = j+1; - } - } - - for(int i = 0; i < L; i++) { - double ci[] = c[i]; - for(int j = 0; j < N; j++) { - ci[j] = 0; - } - } - for(int i = 0; i < N; i++) { - double btransposei[] = btranspose[i]; - for(int j = 0; j < M; j++) { - btransposei[j] = 0; - } - } - } - - public void transpose() { - for(int row = 0; row < M; row++) { - double brow[] = b[row]; - for(int col = 0; col < N; col++) { - btranspose[col][row] = brow[col]; - } - } - } - - public double getSum() { - double sum =0; - - for(int row =0; row < L; row++) { - double cr[] = c[row]; - for(int col = 0; col < N; col++) { - sum += cr[col]; - } - } - return sum; - } -} - -public class Segment { - int x0; - int x1; - - Segment (int x0, int x1) { - this.x0 = x0; - this.x1 = x1; - } -} - diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/dstm.conf b/Robust/src/Benchmarks/Recovery/MatrixMultiply/dstm.conf deleted file mode 100644 index 16efe08a..00000000 --- a/Robust/src/Benchmarks/Recovery/MatrixMultiply/dstm.conf +++ /dev/null @@ -1,10 +0,0 @@ -128.195.180.21 -#128.195.136.162 -#128.195.136.163 -#128.195.136.164 -#128.195.136.165 -#128.195.136.166 -#128.195.136.167 -#128.195.136.168 -#128.195.136.169 - diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/java/makefile b/Robust/src/Benchmarks/Recovery/MatrixMultiply/java/makefile new file mode 100644 index 00000000..cf4e2e62 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/MatrixMultiply/java/makefile @@ -0,0 +1,9 @@ +MAINCLASS=MatrixMultiply +SRC1=${MAINCLASS}.java +FLAGS= -optimize -thread -mainclass ${MAINCLASS} +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/makefile b/Robust/src/Benchmarks/Recovery/MatrixMultiply/makefile deleted file mode 100644 index 92d0677f..00000000 --- a/Robust/src/Benchmarks/Recovery/MatrixMultiply/makefile +++ /dev/null @@ -1,11 +0,0 @@ -MAINCLASS=MatrixMultiply -SRC1=${MAINCLASS}.java - -FLAGS= -recovery -recoverystats -dsm -32bit -nooptimize -debug -dsmtask -mainclass ${MAINCLASS} - -default: - ../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} - -clean: - rm -rf tmpbuilddirectory - rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/MatrixMultiply.java b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/MatrixMultiply.java new file mode 100644 index 00000000..86bedf43 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/MatrixMultiply.java @@ -0,0 +1,268 @@ +/* MatrixMultiplyN.java + + Matrix Multiplication Benchmark using Task Library. + a, b, and c are two dimensional array. + It computes a * b and assigns to c. + +*/ +public class MatrixMultiply extends Task { + MMul mmul; + int SIZE; + int increment; + + public MatrixMultiply(MMul mmul, int num_threads, int size,int increment) { + this.mmul = mmul; + + SIZE = size; + this.increment = increment; + + init(); + } + + public void init() { + todoList = global new GlobalQueue(); + + fillTodoList(); + } + + // fill up the Work Pool + public void fillTodoList() { + Segment seg; + int i; + + for(i = 0; i < SIZE; i +=increment) { + + if(i+increment > SIZE) { + seg = global new Segment(i,SIZE); + } + else { + seg = global new Segment(i, i + increment); + } + todoList.push(seg); + } + } + + public void execute() { + double la[][]; + double lc[][]; + double lb[][]; + double rowA[]; + double colB[]; + Segment seg; + + double innerproduct; + int i,j; + int x0; + int x1; + int size; + + // get matrix + atomic { + seg = (Segment)myWork; + x0 = seg.x0; // x start row + x1 = seg.x1; // x end row + la = mmul.a; // first mat + lb = mmul.btranspose; // second mat + size = SIZE; + } + + lc = new double[size][size]; + + for(i = x0; i < x1 ; i++) { + atomic { + rowA = la[i]; // grab first mat's row + + for(j = 0; j < size ; j++) { + colB = lb[j]; // grab second mat's col + + innerproduct = computeProduct(rowA,colB, size); // computes the value + + lc[i][j] = innerproduct; // store in dest mat + } // end of for j + } + } // end for i +// } + + atomic { + for (i = x0; i < x1; i++) { + for (j = 0; j < size; j++) { + mmul.c[i][j] = lc[i][j]; + } + } + } + } + + public double computeProduct(double[] rowA,double[] colB, int size) + { + int i; + double sum = 0; + + for(i = 0 ;i < size; i++) { + sum += rowA[i] * colB[i]; + } + + return sum; + } + + public void done(Object work) { + } + + public static void main(String[] args) { + int NUM_THREADS=4; + int SIZE = 1600; + int increment = 80; + int i,j; + Work[] works; + MMul matrix; + MatrixMultiply mm; + Segment[] currentWorkList; + + if (args.length == 3) { + NUM_THREADS = Integer.parseInt(args[0]); + SIZE = Integer.parseInt(args[1]); + increment = Integer.parseInt(args[2]); // size of subtask + } + else { + System.out.println("usage: ./MatrixMultiply.bin master "); + } + + int[] mid = new int[8]; + mid[0] = (128<<24)|(195<<16)|(180<<8)|21; //dw-2 + mid[1] = (128<<24)|(195<<16)|(180<<8)|26; //dw-7 +/* mid[2] = (128<<24)|(195<<16)|(180<<8)|26; //dw-7 + mid[0] = (128<<24)|(195<<16)|(136<<8)|162; //dc1 + mid[1] = (128<<24)|(195<<16)|(136<<8)|163; //dc2 + mid[2] = (128<<24)|(195<<16)|(136<<8)|164; //dc3 + mid[3] = (128<<24)|(195<<16)|(136<<8)|165; //dc4 + mid[4] = (128<<24)|(195<<16)|(136<<8)|166; //dc5 + mid[5] = (128<<24)|(195<<16)|(136<<8)|167; //dc6 + mid[6] = (128<<24)|(195<<16)|(136<<8)|168; //dc7 + mid[7] = (128<<24)|(195<<16)|(136<<8)|169; //dc8 +*/ + atomic { + matrix = global new MMul(SIZE, SIZE, SIZE); + matrix.setValues(); + matrix.transpose(); + mm = global new MatrixMultiply(matrix, NUM_THREADS, SIZE,increment); + + works = global new Work[NUM_THREADS]; + currentWorkList = global new Segment[NUM_THREADS]; + + for(i = 0; i < NUM_THREADS; i++) { + works[i] = global new Work(mm, NUM_THREADS, i,currentWorkList); + } + } + + long st = System.currentTimeMillis(); + long fi; + + Work tmp; + for (i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = works[i]; + } + Thread.myStart(tmp,mid[i]); + } + + for (i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = works[i]; + } + tmp.join(); + } + fi = System.currentTimeMillis(); + + double sum= 0; + atomic { + sum = matrix.getSum(); + } + + System.out.println("Sum of matrix = " + sum); + System.out.println("Time Elapse = " + (double)((fi-st)/1000)); + System.printString("Finished\n"); + } + + public void output() { + System.out.println("Sum = " + mmul.getSum()); + } + +} + +public class MMul{ + public int L, M, N; + public double[][] a; + public double[][] b; + public double[][] c; + public double[][] btranspose; + + public MMul(int L, int M, int N) { + this.L = L; + this.M = M; + this.N = N; + a = global new double[L][M]; + b = global new double[M][N]; + c = global new double[L][N]; + btranspose = global new double[N][M]; + } + + public void setValues() { + for(int i = 0; i < L; i++) { + double ai[] = a[i]; + for(int j = 0; j < M; j++) { + ai[j] = j+1; + } + } + + for(int i = 0; i < M; i++) { + double bi[] = b[i]; + for(int j = 0; j < N; j++) { + bi[j] = j+1; + } + } + + for(int i = 0; i < L; i++) { + double ci[] = c[i]; + for(int j = 0; j < N; j++) { + ci[j] = 0; + } + } + for(int i = 0; i < N; i++) { + double btransposei[] = btranspose[i]; + for(int j = 0; j < M; j++) { + btransposei[j] = 0; + } + } + } + + public void transpose() { + for(int row = 0; row < M; row++) { + double brow[] = b[row]; + for(int col = 0; col < N; col++) { + btranspose[col][row] = brow[col]; + } + } + } + + public double getSum() { + double sum =0; + + for(int row =0; row < L; row++) { + double cr[] = c[row]; + for(int col = 0; col < N; col++) { + sum += cr[col]; + } + } + return sum; + } +} + +public class Segment { + int x0; + int x1; + + Segment (int x0, int x1) { + this.x0 = x0; + this.x1 = x1; + } +} + diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/dstm.conf b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/dstm.conf new file mode 100644 index 00000000..372ad1aa --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/dstm.conf @@ -0,0 +1,11 @@ +128.195.180.21 +128.195.180.26 +#128.195.136.162 +#128.195.136.163 +#128.195.136.164 +#128.195.136.165 +#128.195.136.166 +#128.195.136.167 +#128.195.136.168 +#128.195.136.169 + diff --git a/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/makefile b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/makefile new file mode 100644 index 00000000..006b8647 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/MatrixMultiply/recovery/makefile @@ -0,0 +1,11 @@ +MAINCLASS=MatrixMultiply +SRC1=${MAINCLASS}.java + +FLAGS= -recovery -recoverystats -dsm -32bit -nooptimize -debug -dsmtask -mainclass ${MAINCLASS} + +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/BufferedReader.java b/Robust/src/Benchmarks/Recovery/SpamFilter/BufferedReader.java deleted file mode 100644 index d4c96fdd..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/BufferedReader.java +++ /dev/null @@ -1,86 +0,0 @@ -public class BufferedReader { - FileInputStream fr; - byte[] buffer; - int offset; - int end; - - public BufferedReader(FileInputStream fr) { - this.fr=fr; - this.buffer=new byte[2048]; - } - - public int read() { - if (offset=arraylen) - return off; - array[off++]=buffer[offset]; - } - readBuffer(); - if (end==0) - return off; - if (end<0) - return end; - } while(true); - } - - public void readBuffer() { - offset=0; - end=fr.read(buffer); - } - - public String readLine() { - String str=null; - do { - boolean foundcr=false; - int index=offset; - for(;index> 27)) ^ str.charAt(i); - } - - return hash; - } - */ - -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/FilterResult.java b/Robust/src/Benchmarks/Recovery/SpamFilter/FilterResult.java deleted file mode 100644 index 196006be..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/FilterResult.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * A FilterResult encapsulates the result of a filter made by checking a mail. - **/ -public class FilterResult { - /** - * This value is used if type is ERROR or UNKNOWN. - */ - public double NO_RESULT; - - /** - * A result value greater or equal this value indicates that the filter has - * decided on spam. - */ - public int SPAM_THRESHOLD; - public int ABSOLUTE_SPAM; - public int ABSOLUTE_HAM; - - //public double result; // the result, a value between -1 (ham) and 1000 (spam), - // negative values for "error", "unknown" etc. - - // ----------------------------------------------------------------------------- - - public FilterResult(double result) { - SPAM_THRESHOLD=50; - ABSOLUTE_SPAM=100; - ABSOLUTE_HAM=0; - NO_RESULT=-1; - //this.result = result; - } - - public FilterResult() { - SPAM_THRESHOLD=50; - ABSOLUTE_SPAM=100; - ABSOLUTE_HAM=0; - NO_RESULT=-1; - } - - public boolean getResult(int[] confidenceVals) { - int[] res = new int[3]; //3 equals spam, ham and unknown - for(int i=0; i= 0 && confidenceVals[i] < SPAM_THRESHOLD) - res[1]+=1; //ham - if(confidenceVals[i] >= SPAM_THRESHOLD) - res[2]+=1;//spam - } - int maxVotes=0; - int max; - for(int i=0; i<3;i++) { - if(res[i] > maxVotes) { - maxVotes = res[i]; - max = i; - } - } - if(max==0) - return false; - if(max==1) - return false; - if(max==2) - return true; - - System.out.println("Err: getResult() Control shouldn't come here, max= " + max); - return false; - } - - /* - public void addProperty(String key, String value) { - properties.put(key,value); - } - - public String getProperty(String key) { - return properties.get(key); - } - - public HashMap getProperties() { - return properties; - } - */ -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/FilterStatistic.java b/Robust/src/Benchmarks/Recovery/SpamFilter/FilterStatistic.java deleted file mode 100644 index 2e326a5d..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/FilterStatistic.java +++ /dev/null @@ -1,66 +0,0 @@ -public class FilterStatistic { - int unknown; - int spam; - int ham; - - // ------------------------------------------------------- - - public FilterStatistic() { - this.spam = 0; - this.ham = 0; - this.unknown = 0; - } - - public FilterStatistic(int spam, int ham, int unknown) { - this.spam = spam; - this.ham = ham; - this.unknown = unknown; - } - - public int getChecked() { - return getSpam() + getHam() + getUnknown(); - } - - public int getHam() { - return ham; - } - - public int getSpam() { - return spam; - } - - public void setHam(int i) { - ham = i; - } - - public void setSpam(int i) { - spam = i; - } - - public int getUnknown() { - return unknown; - } - - public void setUnknown(int u) { - unknown = u; - } - - public void increaseSpam() { - setSpam(getSpam() + 1); - } - - public void increaseHam() { - setHam(getHam() + 1); - } - - public void increaseUnknown() { - setUnknown(getUnknown() + 1); - } - - public String toString() { - String str = "Filterstats_spam_"+spam; - str += "_ham_" +ham; - str += "_unknown_"+unknown; - return str; - } -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/GString.java b/Robust/src/Benchmarks/Recovery/SpamFilter/GString.java deleted file mode 100644 index 47e3fcf3..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/GString.java +++ /dev/null @@ -1,169 +0,0 @@ -public class GString { - public char value[]; - public int count; - public int offset; - - public GString() { - } - - public GString(char c) { - char[] str = global new char[1]; - str[0] = c; - GString(str); - } - - public GString(String str) { - value = global new char[str.count]; - for(int i =0; i< str.count;i++) { - value[i] = str.value[i+str.offset]; - } - count = str.count; - offset = 0; - } - - public GString(GString gstr) { - this.value = gstr.value; - this.count = gstr.count; - this.offset = gstr.offset; - } - - /* - public GString(StringBuffer gsb) { - value = global new char[gsb.length()]; - count = gsb.length(); - offset = 0; - for (int i = 0; i < count; i++) - value[i] = gsb.value[i]; - } - */ - - public GString(char str[]) { - char charstr[]=new char[str.length]; - for(int i=0; i 0; i--) - if (this.charAt(i) == ch) - return i; - return -1; - } - - public char charAt(int i) { - return value[i+offset]; - } - - public int indexOf(String str) { - return this.indexOf(str, 0); - } - - public int indexOf(String str, int fromIndex) { - if (fromIndex < 0) - fromIndex = 0; - for (int i = fromIndex; i <= (count-str.count); i++) - if (regionMatches(i, str, 0, str.count)) - return i; - return -1; - } - - public boolean regionMatches(int toffset, String other, int ooffset, int len) { - if (toffset < 0 || ooffset < 0 || (toffset+len) > count || (ooffset+len) > other.count) - return false; - - for (int i = 0; i < len; i++) { - if (other.value[i+other.offset+ooffset] != this.value[i+this.offset+toffset]) - return false; - } - return true; - } - - public String subString(int beginIndex, int endIndex) { - return substring(beginIndex, endIndex); - } - - public String substring(int beginIndex, int endIndex) { - String str; - str = global new String(); - str.value = this.value; - str.count = endIndex-beginIndex; - str.offset = this.offset + beginIndex; - return str; - } - - public static String valueOf(Object o) { - if (o==null) - return "null"; - else - return o.toString(); - } - - public String toLocalString() { - return new String(toLocalCharArray(this)); - } - - public static char[] toLocalCharArray(GString str) { - char[] c; - int length; - length = str.length(); - c = new char[length]; - for (int i = 0; i < length; i++) { - c[i] = str.value[i+str.offset]; - } - return c; - } - - public int hashCode() { - String s = this.toLocalString(); - return s.hashCode(); - } - - public boolean equals(Object o) { - if(o == null) - return false; - if(!(o instanceof GString)) - return false; - GString gs = (GString)o; - String s1 = gs.toLocalString(); - String s2 = this.toLocalString(); - if(s2.equals(s1)) - return true; - return false; - } -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/HashEntry.java b/Robust/src/Benchmarks/Recovery/SpamFilter/HashEntry.java deleted file mode 100644 index f76828ca..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/HashEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -public class HashEntry { - public GString engine; - public GString signature; - public HashStat stats; - - public HashEntry() { - - } - - /** - * hashCode that combines two strings using xor. - * @return a hash code value on the entire object. - */ - public int hashCode() { - int result=0; - // this will not work well if some of the strings are equal. - result = engine.hashCode(); - result ^= signature.hashCode(); - //result ^= stats.hashCode(); - //System.out.println("HashEntry: hashCode= " + result); - return result; - } - - public void setengine(GString engine) { - this.engine=engine; - } - - public void setstats(HashStat stats) { - this.stats=stats; - } - - public void setsig(GString signature) { - this.signature=signature; - } - - public GString getEngine() { - return engine; - } - - public GString getSignature() { - return signature; - } - - public HashStat getStats() { - return stats; - } - - public boolean equals(Object o) { - HashEntry he = (HashEntry)o; - if(!(he.getEngine().equals(engine))) - return false; - if(!(he.getSignature().equals(signature))) - return false; - //if(!(he.getStats().equals(stats))) - // return false; - return true; - } - - public int askForSpam() { - int[] users = stats.getUsers(); - int spamConfidence=0; - for(int i=0; i -// from some public domain C code (md5.c) included with the ssh-1.2.22 source. -// Tue Jan 19 15:55:50 EST 1999 -// $Id: MD5.java,v 1.1 2010/01/31 10:04:47 jihoonl Exp $ -// -// To compute the message digest of a chunk of bytes, create an -// MD5 object 'md5', call md5.update() as needed on buffers full -// of bytes, and then call md5.md5final(), which -// will fill a supplied 16-byte array with the digest. -// -// A main() method is included that hashes the data on System.in. -// -// It seems to run around 25-30 times slower (JDK1.1.6) than optimized C -// (gcc -O4, version 2.7.2.3). Measured on a Sun Ultra 5 (SPARC 270MHz). -// -// Comments from md5.c from ssh-1.2.22, the basis for this code: -// -/* This code has been heavily hacked by Tatu Ylonen to - make it compile on machines like Cray that don't have a 32 bit integer - type. */ -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -public class MD5 { - int buf[]; // These were originally unsigned ints. - // This Java code makes an effort to avoid sign traps. - // buf[] is where the hash accumulates. - long bits; // This is the count of bits hashed so far. - byte in[]; // This is a buffer where we stash bytes until we have - // enough (64) to perform a transform operation. - int inint[]; - // inint[] used and discarded inside transform(), - // but why allocate it over and over? - // (In the C version this is allocated on the stack.) - - public MD5() { - buf = new int[4]; - // fill the hash accumulator with a seed value - buf[0] = 0x67452301; - buf[1] = 0xefcdab89; - buf[2] = 0x98badcfe; - buf[3] = 0x10325476; - - // initially, we've hashed zero bits - bits = 0L; - - in = new byte[64]; - inint = new int[16]; - } - - public void update(byte[] newbuf) { - update(newbuf, 0, newbuf.length); - } - - public void update(byte[] newbuf, int length) { - update(newbuf, 0, length); - } - - public void update(byte[] newbuf, int bufstart, int buflen) { - int t; - int len = buflen; - - // shash old bits value for the "Bytes already in" computation - // just below. - t = (int) bits; // (int) cast should just drop high bits, I hope - - /* update bitcount */ - /* the C code used two 32-bit ints separately, and carefully - * ensured that the carry carried. - * Java has a 64-bit long, which is just what the code really wants. - */ - bits += (long)(len<<3); - - t = (t >>> 3) & 0x3f; /* Bytes already in this->in */ - - /* Handle any leading odd-sized chunks */ - /* (that is, any left-over chunk left by last update() */ - - if (t!=0) { - int p = t; - t = 64 - t; - if (len < t) { - arraycopy(newbuf, bufstart, in, p, len); - return; - } - arraycopy(newbuf, bufstart, in, p, t); - transform(); - bufstart += t; - len -= t; - } - - /* Process data in 64-byte chunks */ - while (len >= 64) { - arraycopy(newbuf, bufstart, in, 0, 64); - transform(); - bufstart += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - /* that is, stash them for the next update(). */ - arraycopy(newbuf, bufstart, in, 0, len); - } - - public void arraycopy(byte[] src, int srcPos, byte[] dest, int destPos, int len) { - for (int i = 0; i < len; i++) { - dest[destPos+i] = src[srcPos+i]; - } - return; - } - - /* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ - public void md5final(byte[] digest) { - /* "final" is a poor method name in Java. :v) */ - int count; - int p; // in original code, this is a pointer; in this java code - // it's an index into the array this->in. - - /* Compute number of bytes mod 64 */ - count = (int) ((bits >>> 3) & 0x3F); - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = count; - in[p++] = (byte) 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - zeroByteArray(in, p, count); - transform(); - - /* Now fill the next block with 56 bytes */ - zeroByteArray(in, 0, 56); - } else { - /* Pad block to 56 bytes */ - zeroByteArray(in, p, count - 8); - } - - /* Append length in bits and transform */ - // Could use a PUT_64BIT... func here. This is a fairly - // direct translation from the C code, where bits was an array - // of two 32-bit ints. - int lowbits = (int) bits; - int highbits = (int) (bits >>> 32); - PUT_32BIT_LSB_FIRST(in, 56, lowbits); - PUT_32BIT_LSB_FIRST(in, 60, highbits); - - transform(); - PUT_32BIT_LSB_FIRST(digest, 0, buf[0]); - PUT_32BIT_LSB_FIRST(digest, 4, buf[1]); - PUT_32BIT_LSB_FIRST(digest, 8, buf[2]); - PUT_32BIT_LSB_FIRST(digest, 12, buf[3]); - - /* zero sensitive data */ - /* notice this misses any sneaking out on the stack. The C - * version uses registers in some spots, perhaps because - * they care about this. - */ - zeroByteArray(in); - zeroIntArray(buf); - bits = 0; - zeroIntArray(inint); - } - - /* - public static void main(String args[]) { - // This main() method was created to easily test - // this class. It hashes whatever's on System.in. - - byte buf[] = new byte[397]; - // arbitrary buffer length designed to irritate update() - int rc; - MD5 md = new MD5(); - byte out[] = new byte[16]; - int i; - int len = 0; - - try { - while ((rc = System.in.read(buf, 0, 397)) > 0) { - md.update(buf, rc); - len += rc; - } - } catch (IOException ex) { - ex.printStackTrace(); - return; - } - md.md5final(out); - - System.out.println("file length: "+len); - System.out.println("hash: "+dumpBytes(out)); - } - */ - - - ///////////////////////////////////////////////////////////////////// - // Below here ye will only finde private functions // - ///////////////////////////////////////////////////////////////////// - - // There must be a way to do these functions that's - // built into Java, and I just haven't noticed it yet. - - private void zeroByteArray(byte[] a) { - zeroByteArray(a, 0, a.length); - } - - private void zeroByteArray(byte[] a, int start, int length) { - setByteArray(a, (byte) 0, start, length); - } - - private void setByteArray(byte[] a, byte val, int start, int length) { - int i; - int end = start+length; - for (i=start; i>>(32-s); - w += x; - return w; - } - - private int MD5STEP2(int w, int x, int y, int z, int data, int s) { - w += (y ^ (z & (x ^ y))) + data; - w = w<>>(32-s); - w += x; - return w; - } - - private int MD5STEP3(int w, int x, int y, int z, int data, int s) { - w += (x ^ y ^ z) + data; - w = w<>>(32-s); - w += x; - return w; - } - - private int MD5STEP4(int w, int x, int y, int z, int data, int s) { - w += (y ^ (x | ~z)) + data; - w = w<>>(32-s); - w += x; - return w; - } - - private void transform() { - /* load in[] byte array into an internal int array */ - int i; - int[] inint = new int[16]; - - for (i=0; i<16; i++) { - inint[i] = GET_32BIT_LSB_FIRST(in, 4*i); - } - - int a, b, c, d; - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - a = MD5STEP1(a, b, c, d, inint[0] + 0xd76aa478, 7); - d = MD5STEP1(d, a, b, c, inint[1] + 0xe8c7b756, 12); - c = MD5STEP1(c, d, a, b, inint[2] + 0x242070db, 17); - b = MD5STEP1(b, c, d, a, inint[3] + 0xc1bdceee, 22); - a = MD5STEP1(a, b, c, d, inint[4] + 0xf57c0faf, 7); - d = MD5STEP1(d, a, b, c, inint[5] + 0x4787c62a, 12); - c = MD5STEP1(c, d, a, b, inint[6] + 0xa8304613, 17); - b = MD5STEP1(b, c, d, a, inint[7] + 0xfd469501, 22); - a = MD5STEP1(a, b, c, d, inint[8] + 0x698098d8, 7); - d = MD5STEP1(d, a, b, c, inint[9] + 0x8b44f7af, 12); - c = MD5STEP1(c, d, a, b, inint[10] + 0xffff5bb1, 17); - b = MD5STEP1(b, c, d, a, inint[11] + 0x895cd7be, 22); - a = MD5STEP1(a, b, c, d, inint[12] + 0x6b901122, 7); - d = MD5STEP1(d, a, b, c, inint[13] + 0xfd987193, 12); - c = MD5STEP1(c, d, a, b, inint[14] + 0xa679438e, 17); - b = MD5STEP1(b, c, d, a, inint[15] + 0x49b40821, 22); - - a = MD5STEP2(a, b, c, d, inint[1] + 0xf61e2562, 5); - d = MD5STEP2(d, a, b, c, inint[6] + 0xc040b340, 9); - c = MD5STEP2(c, d, a, b, inint[11] + 0x265e5a51, 14); - b = MD5STEP2(b, c, d, a, inint[0] + 0xe9b6c7aa, 20); - a = MD5STEP2(a, b, c, d, inint[5] + 0xd62f105d, 5); - d = MD5STEP2(d, a, b, c, inint[10] + 0x02441453, 9); - c = MD5STEP2(c, d, a, b, inint[15] + 0xd8a1e681, 14); - b = MD5STEP2(b, c, d, a, inint[4] + 0xe7d3fbc8, 20); - a = MD5STEP2(a, b, c, d, inint[9] + 0x21e1cde6, 5); - d = MD5STEP2(d, a, b, c, inint[14] + 0xc33707d6, 9); - c = MD5STEP2(c, d, a, b, inint[3] + 0xf4d50d87, 14); - b = MD5STEP2(b, c, d, a, inint[8] + 0x455a14ed, 20); - a = MD5STEP2(a, b, c, d, inint[13] + 0xa9e3e905, 5); - d = MD5STEP2(d, a, b, c, inint[2] + 0xfcefa3f8, 9); - c = MD5STEP2(c, d, a, b, inint[7] + 0x676f02d9, 14); - b = MD5STEP2(b, c, d, a, inint[12] + 0x8d2a4c8a, 20); - - a = MD5STEP3(a, b, c, d, inint[5] + 0xfffa3942, 4); - d = MD5STEP3(d, a, b, c, inint[8] + 0x8771f681, 11); - c = MD5STEP3(c, d, a, b, inint[11] + 0x6d9d6122, 16); - b = MD5STEP3(b, c, d, a, inint[14] + 0xfde5380c, 23); - a = MD5STEP3(a, b, c, d, inint[1] + 0xa4beea44, 4); - d = MD5STEP3(d, a, b, c, inint[4] + 0x4bdecfa9, 11); - c = MD5STEP3(c, d, a, b, inint[7] + 0xf6bb4b60, 16); - b = MD5STEP3(b, c, d, a, inint[10] + 0xbebfbc70, 23); - a = MD5STEP3(a, b, c, d, inint[13] + 0x289b7ec6, 4); - d = MD5STEP3(d, a, b, c, inint[0] + 0xeaa127fa, 11); - c = MD5STEP3(c, d, a, b, inint[3] + 0xd4ef3085, 16); - b = MD5STEP3(b, c, d, a, inint[6] + 0x04881d05, 23); - a = MD5STEP3(a, b, c, d, inint[9] + 0xd9d4d039, 4); - d = MD5STEP3(d, a, b, c, inint[12] + 0xe6db99e5, 11); - c = MD5STEP3(c, d, a, b, inint[15] + 0x1fa27cf8, 16); - b = MD5STEP3(b, c, d, a, inint[2] + 0xc4ac5665, 23); - - a = MD5STEP4(a, b, c, d, inint[0] + 0xf4292244, 6); - d = MD5STEP4(d, a, b, c, inint[7] + 0x432aff97, 10); - c = MD5STEP4(c, d, a, b, inint[14] + 0xab9423a7, 15); - b = MD5STEP4(b, c, d, a, inint[5] + 0xfc93a039, 21); - a = MD5STEP4(a, b, c, d, inint[12] + 0x655b59c3, 6); - d = MD5STEP4(d, a, b, c, inint[3] + 0x8f0ccc92, 10); - c = MD5STEP4(c, d, a, b, inint[10] + 0xffeff47d, 15); - b = MD5STEP4(b, c, d, a, inint[1] + 0x85845dd1, 21); - a = MD5STEP4(a, b, c, d, inint[8] + 0x6fa87e4f, 6); - d = MD5STEP4(d, a, b, c, inint[15] + 0xfe2ce6e0, 10); - c = MD5STEP4(c, d, a, b, inint[6] + 0xa3014314, 15); - b = MD5STEP4(b, c, d, a, inint[13] + 0x4e0811a1, 21); - a = MD5STEP4(a, b, c, d, inint[4] + 0xf7537e82, 6); - d = MD5STEP4(d, a, b, c, inint[11] + 0xbd3af235, 10); - c = MD5STEP4(c, d, a, b, inint[2] + 0x2ad7d2bb, 15); - b = MD5STEP4(b, c, d, a, inint[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; - } - - private int GET_32BIT_LSB_FIRST(byte[] b, int off) { - return - ((int)(b[off+0]&0xff)) | - ((int)(b[off+1]&0xff) << 8) | - ((int)(b[off+2]&0xff) << 16) | - ((int)(b[off+3]&0xff) << 24); - } - - private void PUT_32BIT_LSB_FIRST(byte[] b, int off, int value) { - b[off+0] = (byte) (value & 0xff); - b[off+1] = (byte) ((value >> 8) & 0xff); - b[off+2] = (byte) ((value >> 16)& 0xff); - b[off+3] = (byte) ((value >> 24)& 0xff); - } - - // These are debug routines I was using while trying to - // get this code to generate the same hashes as the C version. - // (IIRC, all the errors were due to the absence of unsigned - // ints in Java.) - /* - private void debugStatus(String m) { - System.out.println(m+":"); - System.out.println("in: "+dumpBytes(in)); - System.out.println("bits: "+bits); - System.out.println("buf: " - +Integer.toHexString(buf[0])+" " - +Integer.toHexString(buf[1])+" " - +Integer.toHexString(buf[2])+" " - +Integer.toHexString(buf[3])); - } - - private static String dumpBytes(byte[] bytes) { - int i; - StringBuffer sb = new StringBuffer(); - for (i=0; i 2) { - s = s.substring(s.length()-2); - } - sb.append(s); - } - return sb.toString(); - } - */ -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/Mail.java b/Robust/src/Benchmarks/Recovery/SpamFilter/Mail.java deleted file mode 100644 index 3afbe19c..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/Mail.java +++ /dev/null @@ -1,422 +0,0 @@ -/** - * This class is a container for all data contained in an Email Message. - **/ -public class Mail { - - String header; // the full header - //String sentOn; // time the message was sent - //String receivedOn; // time when the message arrived - String from; // the "from" field - String to; // the "to" field - String cc; - String subject; - String body; - String noURLBody; - String sourceCode; - String spam; - boolean hasAttachement; - String encoding; //rich text, plain, html - - String messageID; // cached message ID for reuse (takes a lot of memory and is used all over the place) - //same as hashcode of a class - boolean isSpam; - - /** - * this is a really simple implementation of a tokenizer - * used to build tokens from an email and divide email into parts - **/ - int MAX_TOKEN_SIZE; - - public Mail() { - messageID=null; - } - - public Mail(String fileName) // read a mail from file - { - //System.out.println("DEBUG: fileName= " + fileName); - - BufferedReader fileinput = new BufferedReader(new FileInputStream(fileName)); - String line; - boolean chk = false; - - while((line = fileinput.readLine()) != null) - { - chk = true; - - Vector splittedLine = line.split(); - if(((String)(splittedLine.elementAt(0))).equals("Spam:")) - { - spam = (String)(splittedLine.elementAt(1)); - } - else if(((String)(splittedLine.elementAt(0))).equals("Header:")) // message id - { - header = (String)splittedLine.elementAt(1); - } - else if(((String)(splittedLine.elementAt(0))).equals("To:")) // receiver - { - to = (String)splittedLine.elementAt(1); - } - else if(((String)(splittedLine.elementAt(0))).equals("From:")) // sender - { - from = (String)splittedLine.elementAt(1); - } - else if(((String)(splittedLine.elementAt(0))).equals("Cc:")) // cc - { - cc = (String)splittedLine.elementAt(1); - } - else if(((String)(splittedLine.elementAt(0))).equals("Subject:")) // Subject - { - subject = (String)splittedLine.elementAt(1); - break; - } - } // parsed messageID, To, from, cc, Title - - /** - * error checking - **/ - if(!chk) - System.out.println("no line read"); - - - body = new String(); - byte[] readBody = new byte[256]; - - while((fileinput.read(readBody)>0)) - { - body += new String(readBody); - readBody = new byte[256]; - } - - fileinput.close(); - - MAX_TOKEN_SIZE = 1024; - } - - // ------------------------------------------------------- - - public void setHeader(String header) { - this.header = header; - } - - public String getHeader() { - return header; - } - - - /* - public void setSentOn(String sentOn) { - this.sentOn = sentOn; - } - - public String getSentOn() { - return sentOn; - } - - public Date getSentOnAsDate() { - String sentOn = getSentOn(); - return parseDate(sentOn); - } - - public void setReceivedOn(String receivedOn) { - this.receivedOn = receivedOn; - } - - public String getReceivedOn() { - return receivedOn; - } - - public Date getReceivedOnAsDate() { - String receivedOn = getReceivedOn(); - return parseDate(receivedOn); - } - */ - - - /** - * Parses a given Date-String in into a real Date-Object - * - * @param stringDate the string in format dd.mm.yyyy hh:mm - * @return a Date containing the info of the string or the actual date and time if something fails. - */ - /* - public Date parseDate(String stringDate) { - // date is in this format: dd.mm.yyyy hh:mm - if (stringDate == null || "N/A".equals(stringDate)) { - return new Date(); - } - try { - synchronized (MAIL_TIME_FORMAT) { - return MAIL_TIME_FORMAT.parse(stringDate); - } - } catch (Throwable e) { - return new Date(); - } - } - */ - - public void setFrom(String from) { - this.from = from; - } - - public String getFrom() { - return from; - } - - public void setTo(String to) { - this.to = to; - } - - public String getTo() { - return to; - } - - public void setCc(String cc) { - this.cc = cc; - } - - public String getCc() { - return cc; - } - - public void setSubject(String subject) { - this.subject = subject; - } - - public String getSubject() { - return subject; - } - - public void setBody(String body) { - this.body = body; - } - - public String getBody() { - return body; - } - - public void setSourceCode(String sourceCode) { - this.sourceCode = sourceCode; - } - - public String getSourceCode() { - return sourceCode; - } - - public void setHasAttachement(boolean hasAttachement) { - this.hasAttachement = hasAttachement; - } - - public boolean getHasAttachement() { - return hasAttachement; - } - - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - public String getEncoding() { - return encoding; - } - - public boolean isTextEncoding() { - return getEncoding().toLowerCase().indexOf("plain") >= 0; - } - - public boolean isHTMLEncoding() { - return getEncoding().toLowerCase().indexOf("html") >= 0; - } - - /* - public String toString() { - return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getReceivedOn() + "," + getSentOn() + "," + getSourceCode() + "," + getSubject() + "," + getTo(); - } - */ - - public String toString() { - return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getSourceCode() + "," + getSubject() + "," + getTo(); - } - - /* - public String getID() { - if (messageID == null) { // no cached version - // Take the message-ID header as ID (if present) - String[] messageIDs = getHeaderField("Message-ID"); - if ((messageIDs != null) && (messageIDs.length > 0)) { - messageID = messageIDs[0]; - } else { // otherwise, hash header and body as ID - return String.valueOf(getHeader().hashCode() + getBody().hashCode()); - } - } - - return messageID; - } - */ - - public String[] getHeaderField(String fieldName) { - - } - - public String extractEMailAddress() { - - } - - /* - public boolean equals(Object o) { - if (o instanceof Mail) { - Mail mail = (Mail)o; - return this.getID().equals(mail.getID()); - } - - return false; - } - */ - - public Vector getCommonPart() - { - Vector returnStrings = new Vector(); - - // add header, sender, and title - returnStrings.addElement(header); - returnStrings.addElement(from); - returnStrings.addElement(subject); - - return returnStrings; - } - - public String getBodyString() - { - return body; - } - - public Vector returnEmail() { - Vector myemail = new Vector(); - myemail.addElement(getCommonPart()); - //System.out.println("DEBUG: getCommonPart.size= " + getCommonPart().size()); - myemail.addElement(getURLs()); - //System.out.println("DEBUG: getURLs.size= " + getURLs().size()); - myemail.addElement(getSplittedBody(MAX_TOKEN_SIZE)); - //System.out.println("DEBUG: getSplittedBody.size= " + getSplittedBody(MAX_TOKEN_SIZE).size()); - return myemail; - } - - public Vector getURLs() - { - Vector returnStrings = new Vector(); - Vector splittedBody = body.split(); - - // add URL and email in the body - for(int i=0; i=end) { - String str=noURLBody.substring(i, end); - returnStrings.addElement(str); - } - else { - String str=noURLBody.substring(i, i+size); - returnStrings.addElement(str); - } - } - return returnStrings; - } - - - public void setIsSpam(boolean spam) { - isSpam = spam; - } - - public boolean getIsSpam() { - if(spam.equals("yes")) - return true; - return false; - } - - /** - * Returns result to the Spam filter - **/ - public Vector checkMail(int userid) { - //Preprocess emails - - //long startGetParts=System.currentTimeMillis(); - Vector partsOfMailStrings = returnEmail(); - //long stopGetParts=System.currentTimeMillis(); - //System.out.println("Time to read email= " + (stopGetParts-startGetParts)); - - //Compute signatures - SignatureComputer sigComp = new SignatureComputer(); - //Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of strings - //long startGetsignatures=System.currentTimeMillis(); - Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of vector of strings - //long stopGetsignatures=System.currentTimeMillis(); - //System.out.println("Time to Getsignatures= " + (stopGetsignatures-startGetsignatures)); - - return signatures; - } - - /* For tests only */ - /* - public static void main(String[] args) - { - Mail mail = new Mail("./emails/email1"); - - String[] a = mail.createMailStrings(); - - for(String b : a) - { - System.out.println(b); - } - } - */ -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/SignatureComputer.java b/Robust/src/Benchmarks/Recovery/SpamFilter/SignatureComputer.java deleted file mode 100644 index 4f98a2d0..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/SignatureComputer.java +++ /dev/null @@ -1,289 +0,0 @@ -public class SignatureComputer { - public EphemeralSignature sig4; //signature engines - public WhiplashSignature sig8; //signature engines - - int[] enginesToUseForCheck; - - public SignatureComputer() { - sig4 = new EphemeralSignature(); //default values - sig8 = new WhiplashSignature(); - createEnginesToCheck(); - } - - /** - * constructor to be used when some parsing has already taken place with the - * server-provides value randomNumberSeed. - * - * @param randomNumberSeed - * a non-negative number used for seeding the random number generator - * before starting to hash values. - * @param separator - * how the mail-text should be splitted into lines. (== what chars - * separate 2 lines) - */ - public SignatureComputer(int randomNumberSeed, String separator) { - sig4 = new EphemeralSignature(randomNumberSeed,separator); - sig8 = new WhiplashSignature(); - createEnginesToCheck(); - } - - /** - * the constructor to be used most of the time. you can hand over the - * seed-string exactly as it is provided by the razor-server. - * - * @param seedAndSeparator - * a string containing the seed value for the RNG and a separator list - * (separated by ' - '). default value is - * "7542-10" which means server-seed 7542 and only one - * separator 10 (which is ascii '\n'). - */ - public SignatureComputer(String seedAndSeparator) { - sig4 = new EphemeralSignature(seedAndSeparator); - sig8 = new WhiplashSignature(); - createEnginesToCheck(); - } - - /** - * - */ - public void createEnginesToCheck() { - enginesToUseForCheck = new int[2]; - enginesToUseForCheck[0] = 4; //Ephemeral engine - enginesToUseForCheck[1] = 8;//Whiplash engine - } - - public boolean isSigSupported(int sig) { - boolean found = false; - for (int i = 0; i < enginesToUseForCheck.length && !found; i++) { - if (enginesToUseForCheck[i] == sig) { - found = true; - } - } - return found; - } - - public boolean isSigSupported(String sig) { - return (sig != null && isSigSupported(Integer.parseInt(sig))); - } - - public String getDefaultEngine() { - return "4"; - } - - public Vector computeSigs(Vector EmailParts) { - if (EmailParts == null) return null; - - Vector printableSigs = new Vector(); // vector of strings - - /** - * Step -I - * Get signatures for the common parts - **/ - - Vector commonpart = (Vector) (EmailParts.elementAt(0)); - for (int mailIndex = 0; mailIndex < commonpart.size(); mailIndex++) { - String mail = (String) (commonpart.elementAt(mailIndex)); - - if (mail == null) continue; - - /* - * Compute Sig for email header that are cleaned. - */ - for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { - int engineNo = enginesToUseForCheck[engineIndex]; - String sig = null; - - /* EphemeralSignature calculator */ - if(engineNo==4) { - sig = computeSignature(engineNo,mail); - } - - if(engineNo==8) { - continue; - } - - if((engineNo!=4)) { - System.out.println("Err: Common part Couldn't find the signature engine: " + engineNo); - } - - if (sig != null) { - String hash = engineNo + ":" + sig; - printableSigs.addElement(hash); - - //System.out.println("DEBUG: mail= " +mail + " hash= " + hash); - - } else { - // we didn't produce a signature for the mail. - } - }//engine - }//common part - - /** - * Step -II - * Get signatures for the body parts without URLs - **/ - Vector getBodywithNoURLs = (Vector)(EmailParts.elementAt(2)); - for (int mailIndex = 0; mailIndex < getBodywithNoURLs.size(); mailIndex++) { - String mail = (String) (getBodywithNoURLs.elementAt(mailIndex)); - - - if (mail == null) continue; - - /* - * Compute Sig for email header that are cleaned. - */ - for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { - int engineNo = enginesToUseForCheck[engineIndex]; - String sig = null; - - /* EphemeralSignature calculator */ - if(engineNo==4) { - sig = computeSignature(engineNo,mail); - } - - if(engineNo==8) - continue; - - if(engineNo!=4) { - System.out.println("Err: body parts without URL Couldn't find the signature engine: " + engineNo); - } - - if (sig != null) { - String hash = engineNo + ":" + sig; - printableSigs.addElement(hash); - } else { - // we didn't produce a signature for the mail. - } - }//engine - } - - /** - * Step -III - * Get signatures for the body parts with URLs - **/ - Vector getURLs = (Vector)(EmailParts.elementAt(1)); - for (int mailIndex = 0; mailIndex < getURLs.size(); mailIndex++) { - String mail = (String) (getURLs.elementAt(mailIndex)); - - /* - * Compute Sig for bodyparts that are cleaned. - */ - for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { - int engineNo = enginesToUseForCheck[engineIndex]; - if(engineNo==4) - continue; - - /* WhiplashSignature calculator */ - String[] hosts = null; - String sig = null; - if(engineNo==8) { - //hosts = computeSignature(engineNo,mail); - hosts = sig8.computeSignature(mail); - if(hosts != null) { - for(int i=0; i -n -e \n"); - System.out.println( " -n : num iterations"); - System.out.println( " -e : number of emails"); - } - - /** - * Returns result to the Spam filter - **/ - /* - public boolean checkMail(Mail mail, int userid) { - //Preprocess emails - //Vector partsOfMailStrings = mail.createMailStringsWithURL(); - /* - Vector partsOfMailStrings = mail.getCommonPart(); - partsOfMailStrings.addElement(mail.getBodyString()); - - //Compute signatures - SignatureComputer sigComp = new SignatureComputer(); - Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of strings - - //check with global data structure - int[] confidenceVals = check(signatures,userid); - - //---- create and return results -------- - FilterResult filterResult = new FilterResult(); - boolean spam = filterResult.getResult(confidenceVals); - - return spam; - } - */ - - public int[] check(Vector signatures, int userid) { - int numparts = signatures.size(); - - //System.out.println("check() numparts= " + numparts); - - int[] confidenceVals = new int[numparts]; - for(int i=0; i the mail client is able to determine if it is spam or not - // --- According to the "any"-logic (in Core#check_logic) in original Razor --- - // If any answer is spam, the entire email is spam. - return confidenceVals; - } - - /** - * This method sends feedback from the user to a distributed - * spam database and trains the spam database to check future - * emails and detect spam - **/ - public void sendFeedBack(Vector signatures, boolean isSpam, int id, Random myrand) { - - for(int i=0;ipack() which - * we must do manually in java. - */ - private int convertHexToRazorEncoding(String hex3) { - if((hex3 == null)) - return 0; //error - int res = 0; - int cur = Integer.parseInt(hex3.substring(0,1),16); - cur = mirror4LSBits(cur); - res |= ( (cur&0xf) << 8); - if(hex3.length() >=2) { - cur = Integer.parseInt(hex3.substring(1,2),16); - } else { - cur = 0; - } - //cur = ( hex3.length() >=2 ? Integer.parseInt(hex3.substring(1,2),16) : 0); - cur = mirror4LSBits(cur); - res |= ((cur & 0xf) << 4); - if(hex3.length() >= 3) { - cur = Integer.parseInt(hex3.substring(2,3),16); - } else { - cur = 0; - } - //cur = ( hex3.length() >= 3 ? Integer.parseInt(hex3.substring(2,3),16): 0); - cur = mirror4LSBits(cur); - res |= (cur & 0xf); - - return res; - } - - /** - * mirrors the 4 least significant bytes of an integer - * @param cur an int containing 4 Least Singificant bytes like 00000...00abcd - * @return the mirrored 4 least significant bytes 00000...00dcba. all bits except a-b are lost. - */ - public int mirror4LSBits(int cur) { - int res = 0; - res |= (cur & 0x8)>>>3; - res |= (cur & 0x4)>>>1; - res |= (cur & 0x2)<<1; - res |= (cur & 0x1)<<3; - return res; - } - - public String[] whiplash(String text) { - - if (text == null) { - return null; - } - String[] hosts = extractHosts(text); - if (hosts == null || hosts.length < 1) { - return null; - } - String[] sigs = new String[hosts.length]; - - for (int i = 0; i < hosts.length; i++) { - MD5 md = new MD5(); - String host = hosts[i]; - int len = host.length(); - byte buf[] = host.getBytes(); - byte sig[] = new byte[16]; - md.update(buf, len); - md.md5final(sig); - String signature = new String(sig); - - // System.out.println("DEBUG: host= " + host + " whiplash sig= " + signature); - - sigs[i] = signature; - } - return sigs; - } - - public String[] extractHosts(String text) { - //System.out.println("Inside extractHosts"); - Vector hosts = new Vector(); - String buf = new String(text); - - //System.out.println("DEBUG: extractHosts() string= " + buf); - - /* Extract hosts from http:// links */ - int idx; - String strwww = new String("www."); - while ((idx = buf.indexOf(strwww)) != -1) { - int startidx = idx + strwww.length(); - String strcom = new String("."); - buf = buf.subString(startidx); - int endidx = buf.indexOf(strcom); - String host = buf.subString(0, endidx); - //System.out.println("DEBUG: http links extracted host= " + host); - - buf = buf.subString(endidx); - endidx = buf.indexOf(strcom); - host += buf.subString(0, endidx); - - hosts.addElement(host); - buf = buf.subString(endidx+strcom.length()); - } - - /* Extract hosts from email addressess */ - buf = new String(text); - String strrate = new String("@"); - while ((idx = buf.indexOf(strrate)) != -1) { - int startidx = idx + strrate.length(); - String strdot = new String("."); - buf = buf.subString(startidx); - int endidx = buf.indexOf(strdot); - String host = buf.subString(0, endidx); - //System.out.println("DEBUG: email addr extracted host= " + host); - - buf = buf.subString(endidx); - endidx = buf.indexOf(strdot); - host += buf.subString(0, endidx); - - hosts.addElement(host); - buf = buf.subString(endidx+strdot.length()); - } - - if (hosts.size() == 0) { - return null; - } - - String[] retbuf = new String[hosts.size()]; - for (int i = 0; i < hosts.size(); i++) { - retbuf[i] = (String) (hosts.elementAt(i)); - } - - return retbuf; - } - -// Testing the signature computation -// public static void main(String[] args) { -// /* String testVector = " Test Vectors: \n"+ -// "\n" + -// "1. http:www.nodg.com@www.geocities.com/nxcisdsfdfdsy/off\n"+ -// "2. http:www.ksleybiuh.com@213.171.60.74/getoff/\n"+ -// "3. \n"+ -// "4. http:217.12.4.7/rmi/http:definethis.net/526/index.html\n"+ -// "5. http:magalygr8sex.free-host.com/h.html\n"+ -// "6. http:%3CVenkatrs%3E@218.80.74.102/thecard/4index.htm\n"+ -// "7. http:EBCDVKIGURGGCEOKXHINOCANVQOIDOXJWTWGPC@218.80.74.102/thecard/5in\n"+ -// "8. http:g.india2.bag.gs/remove_page.htm\n"+ -// "9. https:220.97.40.149\n"+ -// "10. http:mjaked.biz/unsubscribe.ddd?leaving\n"+ -// "11. http:g5j99m8@it.rd.yahoo.com/bassi/*http:www.lekobas.com/c/index.php\n"+ -// "12. look great / feel great\n"+ -// "13. \n"+ -// "14. www.pillzthatwork.com # anything that starts with www. \n"; -// */ -// String testVector = "\n"+ -// "\n"+ -// "

Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com

\n"+ -// "

now a masked link http://www.coveringlink1.com and another link http:plaintextlink3.net and how about https:plaintextlink4.to

\n"+ -// "

another masked link https:coveringlink2.com and another link https:plaintextlink5.com

\n"+ -// "\n"+ -// "\n"; -// String test1 = "Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com

\n"; -// WhiplashSignature whiplash = new WhiplashSignature(); -// String[] hosts = whiplash.computeSignature(testVector); -// //String[] hosts = whiplash.computeSignature(test1); -// for (int i = 0; i < hosts.length; i++) { -// String string = hosts[i]; -// System.out.println("host " + i + ":\t" + string); -// } -// } - -} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/dstm.conf b/Robust/src/Benchmarks/Recovery/SpamFilter/dstm.conf deleted file mode 100644 index 18e28963..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/dstm.conf +++ /dev/null @@ -1,12 +0,0 @@ -128.195.180.21 -128.195.180.26 -#128.195.136.162 -#128.195.136.163 -#128.195.136.164 -#128.195.136.165 -#128.195.136.166 -#128.195.136.167 -#128.195.136.168 -#128.195.136.169 - - diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/makefile b/Robust/src/Benchmarks/Recovery/SpamFilter/makefile deleted file mode 100644 index 5b8d579c..00000000 --- a/Robust/src/Benchmarks/Recovery/SpamFilter/makefile +++ /dev/null @@ -1,21 +0,0 @@ -MAINCLASS=SpamFilter -SRC=${MAINCLASS}.java \ - DistributedHashMap.java \ - Mail.java \ - FilterResult.java \ - HashEntry.java \ - HashStat.java \ - SignatureComputer.java \ - FilterStatistic.java \ - EphemeralSignature.java \ - GString.java \ - WhiplashSignature.java - -FLAGS= -dsm -recoverystats -recovery -nooptimize -mainclass ${MAINCLASS} - -default: - ../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC} - -clean: - rm -rf tmpbuilddirectory* - rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/BufferedReader.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/BufferedReader.java new file mode 100644 index 00000000..d4c96fdd --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/BufferedReader.java @@ -0,0 +1,86 @@ +public class BufferedReader { + FileInputStream fr; + byte[] buffer; + int offset; + int end; + + public BufferedReader(FileInputStream fr) { + this.fr=fr; + this.buffer=new byte[2048]; + } + + public int read() { + if (offset=arraylen) + return off; + array[off++]=buffer[offset]; + } + readBuffer(); + if (end==0) + return off; + if (end<0) + return end; + } while(true); + } + + public void readBuffer() { + offset=0; + end=fr.read(buffer); + } + + public String readLine() { + String str=null; + do { + boolean foundcr=false; + int index=offset; + for(;index> 27)) ^ str.charAt(i); + } + + return hash; + } + */ + +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterResult.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterResult.java new file mode 100644 index 00000000..196006be --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterResult.java @@ -0,0 +1,80 @@ +/** + * A FilterResult encapsulates the result of a filter made by checking a mail. + **/ +public class FilterResult { + /** + * This value is used if type is ERROR or UNKNOWN. + */ + public double NO_RESULT; + + /** + * A result value greater or equal this value indicates that the filter has + * decided on spam. + */ + public int SPAM_THRESHOLD; + public int ABSOLUTE_SPAM; + public int ABSOLUTE_HAM; + + //public double result; // the result, a value between -1 (ham) and 1000 (spam), + // negative values for "error", "unknown" etc. + + // ----------------------------------------------------------------------------- + + public FilterResult(double result) { + SPAM_THRESHOLD=50; + ABSOLUTE_SPAM=100; + ABSOLUTE_HAM=0; + NO_RESULT=-1; + //this.result = result; + } + + public FilterResult() { + SPAM_THRESHOLD=50; + ABSOLUTE_SPAM=100; + ABSOLUTE_HAM=0; + NO_RESULT=-1; + } + + public boolean getResult(int[] confidenceVals) { + int[] res = new int[3]; //3 equals spam, ham and unknown + for(int i=0; i= 0 && confidenceVals[i] < SPAM_THRESHOLD) + res[1]+=1; //ham + if(confidenceVals[i] >= SPAM_THRESHOLD) + res[2]+=1;//spam + } + int maxVotes=0; + int max; + for(int i=0; i<3;i++) { + if(res[i] > maxVotes) { + maxVotes = res[i]; + max = i; + } + } + if(max==0) + return false; + if(max==1) + return false; + if(max==2) + return true; + + System.out.println("Err: getResult() Control shouldn't come here, max= " + max); + return false; + } + + /* + public void addProperty(String key, String value) { + properties.put(key,value); + } + + public String getProperty(String key) { + return properties.get(key); + } + + public HashMap getProperties() { + return properties; + } + */ +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterStatistic.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterStatistic.java new file mode 100644 index 00000000..2e326a5d --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/FilterStatistic.java @@ -0,0 +1,66 @@ +public class FilterStatistic { + int unknown; + int spam; + int ham; + + // ------------------------------------------------------- + + public FilterStatistic() { + this.spam = 0; + this.ham = 0; + this.unknown = 0; + } + + public FilterStatistic(int spam, int ham, int unknown) { + this.spam = spam; + this.ham = ham; + this.unknown = unknown; + } + + public int getChecked() { + return getSpam() + getHam() + getUnknown(); + } + + public int getHam() { + return ham; + } + + public int getSpam() { + return spam; + } + + public void setHam(int i) { + ham = i; + } + + public void setSpam(int i) { + spam = i; + } + + public int getUnknown() { + return unknown; + } + + public void setUnknown(int u) { + unknown = u; + } + + public void increaseSpam() { + setSpam(getSpam() + 1); + } + + public void increaseHam() { + setHam(getHam() + 1); + } + + public void increaseUnknown() { + setUnknown(getUnknown() + 1); + } + + public String toString() { + String str = "Filterstats_spam_"+spam; + str += "_ham_" +ham; + str += "_unknown_"+unknown; + return str; + } +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/GString.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/GString.java new file mode 100644 index 00000000..47e3fcf3 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/GString.java @@ -0,0 +1,169 @@ +public class GString { + public char value[]; + public int count; + public int offset; + + public GString() { + } + + public GString(char c) { + char[] str = global new char[1]; + str[0] = c; + GString(str); + } + + public GString(String str) { + value = global new char[str.count]; + for(int i =0; i< str.count;i++) { + value[i] = str.value[i+str.offset]; + } + count = str.count; + offset = 0; + } + + public GString(GString gstr) { + this.value = gstr.value; + this.count = gstr.count; + this.offset = gstr.offset; + } + + /* + public GString(StringBuffer gsb) { + value = global new char[gsb.length()]; + count = gsb.length(); + offset = 0; + for (int i = 0; i < count; i++) + value[i] = gsb.value[i]; + } + */ + + public GString(char str[]) { + char charstr[]=new char[str.length]; + for(int i=0; i 0; i--) + if (this.charAt(i) == ch) + return i; + return -1; + } + + public char charAt(int i) { + return value[i+offset]; + } + + public int indexOf(String str) { + return this.indexOf(str, 0); + } + + public int indexOf(String str, int fromIndex) { + if (fromIndex < 0) + fromIndex = 0; + for (int i = fromIndex; i <= (count-str.count); i++) + if (regionMatches(i, str, 0, str.count)) + return i; + return -1; + } + + public boolean regionMatches(int toffset, String other, int ooffset, int len) { + if (toffset < 0 || ooffset < 0 || (toffset+len) > count || (ooffset+len) > other.count) + return false; + + for (int i = 0; i < len; i++) { + if (other.value[i+other.offset+ooffset] != this.value[i+this.offset+toffset]) + return false; + } + return true; + } + + public String subString(int beginIndex, int endIndex) { + return substring(beginIndex, endIndex); + } + + public String substring(int beginIndex, int endIndex) { + String str; + str = global new String(); + str.value = this.value; + str.count = endIndex-beginIndex; + str.offset = this.offset + beginIndex; + return str; + } + + public static String valueOf(Object o) { + if (o==null) + return "null"; + else + return o.toString(); + } + + public String toLocalString() { + return new String(toLocalCharArray(this)); + } + + public static char[] toLocalCharArray(GString str) { + char[] c; + int length; + length = str.length(); + c = new char[length]; + for (int i = 0; i < length; i++) { + c[i] = str.value[i+str.offset]; + } + return c; + } + + public int hashCode() { + String s = this.toLocalString(); + return s.hashCode(); + } + + public boolean equals(Object o) { + if(o == null) + return false; + if(!(o instanceof GString)) + return false; + GString gs = (GString)o; + String s1 = gs.toLocalString(); + String s2 = this.toLocalString(); + if(s2.equals(s1)) + return true; + return false; + } +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/HashEntry.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/HashEntry.java new file mode 100644 index 00000000..f76828ca --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/HashEntry.java @@ -0,0 +1,68 @@ +public class HashEntry { + public GString engine; + public GString signature; + public HashStat stats; + + public HashEntry() { + + } + + /** + * hashCode that combines two strings using xor. + * @return a hash code value on the entire object. + */ + public int hashCode() { + int result=0; + // this will not work well if some of the strings are equal. + result = engine.hashCode(); + result ^= signature.hashCode(); + //result ^= stats.hashCode(); + //System.out.println("HashEntry: hashCode= " + result); + return result; + } + + public void setengine(GString engine) { + this.engine=engine; + } + + public void setstats(HashStat stats) { + this.stats=stats; + } + + public void setsig(GString signature) { + this.signature=signature; + } + + public GString getEngine() { + return engine; + } + + public GString getSignature() { + return signature; + } + + public HashStat getStats() { + return stats; + } + + public boolean equals(Object o) { + HashEntry he = (HashEntry)o; + if(!(he.getEngine().equals(engine))) + return false; + if(!(he.getSignature().equals(signature))) + return false; + //if(!(he.getStats().equals(stats))) + // return false; + return true; + } + + public int askForSpam() { + int[] users = stats.getUsers(); + int spamConfidence=0; + for(int i=0; i +// from some public domain C code (md5.c) included with the ssh-1.2.22 source. +// Tue Jan 19 15:55:50 EST 1999 +// $Id: MD5.java,v 1.1 2010/02/13 00:09:44 jihoonl Exp $ +// +// To compute the message digest of a chunk of bytes, create an +// MD5 object 'md5', call md5.update() as needed on buffers full +// of bytes, and then call md5.md5final(), which +// will fill a supplied 16-byte array with the digest. +// +// A main() method is included that hashes the data on System.in. +// +// It seems to run around 25-30 times slower (JDK1.1.6) than optimized C +// (gcc -O4, version 2.7.2.3). Measured on a Sun Ultra 5 (SPARC 270MHz). +// +// Comments from md5.c from ssh-1.2.22, the basis for this code: +// +/* This code has been heavily hacked by Tatu Ylonen to + make it compile on machines like Cray that don't have a 32 bit integer + type. */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +public class MD5 { + int buf[]; // These were originally unsigned ints. + // This Java code makes an effort to avoid sign traps. + // buf[] is where the hash accumulates. + long bits; // This is the count of bits hashed so far. + byte in[]; // This is a buffer where we stash bytes until we have + // enough (64) to perform a transform operation. + int inint[]; + // inint[] used and discarded inside transform(), + // but why allocate it over and over? + // (In the C version this is allocated on the stack.) + + public MD5() { + buf = new int[4]; + // fill the hash accumulator with a seed value + buf[0] = 0x67452301; + buf[1] = 0xefcdab89; + buf[2] = 0x98badcfe; + buf[3] = 0x10325476; + + // initially, we've hashed zero bits + bits = 0L; + + in = new byte[64]; + inint = new int[16]; + } + + public void update(byte[] newbuf) { + update(newbuf, 0, newbuf.length); + } + + public void update(byte[] newbuf, int length) { + update(newbuf, 0, length); + } + + public void update(byte[] newbuf, int bufstart, int buflen) { + int t; + int len = buflen; + + // shash old bits value for the "Bytes already in" computation + // just below. + t = (int) bits; // (int) cast should just drop high bits, I hope + + /* update bitcount */ + /* the C code used two 32-bit ints separately, and carefully + * ensured that the carry carried. + * Java has a 64-bit long, which is just what the code really wants. + */ + bits += (long)(len<<3); + + t = (t >>> 3) & 0x3f; /* Bytes already in this->in */ + + /* Handle any leading odd-sized chunks */ + /* (that is, any left-over chunk left by last update() */ + + if (t!=0) { + int p = t; + t = 64 - t; + if (len < t) { + arraycopy(newbuf, bufstart, in, p, len); + return; + } + arraycopy(newbuf, bufstart, in, p, t); + transform(); + bufstart += t; + len -= t; + } + + /* Process data in 64-byte chunks */ + while (len >= 64) { + arraycopy(newbuf, bufstart, in, 0, 64); + transform(); + bufstart += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + /* that is, stash them for the next update(). */ + arraycopy(newbuf, bufstart, in, 0, len); + } + + public void arraycopy(byte[] src, int srcPos, byte[] dest, int destPos, int len) { + for (int i = 0; i < len; i++) { + dest[destPos+i] = src[srcPos+i]; + } + return; + } + + /* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ + public void md5final(byte[] digest) { + /* "final" is a poor method name in Java. :v) */ + int count; + int p; // in original code, this is a pointer; in this java code + // it's an index into the array this->in. + + /* Compute number of bytes mod 64 */ + count = (int) ((bits >>> 3) & 0x3F); + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = count; + in[p++] = (byte) 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + zeroByteArray(in, p, count); + transform(); + + /* Now fill the next block with 56 bytes */ + zeroByteArray(in, 0, 56); + } else { + /* Pad block to 56 bytes */ + zeroByteArray(in, p, count - 8); + } + + /* Append length in bits and transform */ + // Could use a PUT_64BIT... func here. This is a fairly + // direct translation from the C code, where bits was an array + // of two 32-bit ints. + int lowbits = (int) bits; + int highbits = (int) (bits >>> 32); + PUT_32BIT_LSB_FIRST(in, 56, lowbits); + PUT_32BIT_LSB_FIRST(in, 60, highbits); + + transform(); + PUT_32BIT_LSB_FIRST(digest, 0, buf[0]); + PUT_32BIT_LSB_FIRST(digest, 4, buf[1]); + PUT_32BIT_LSB_FIRST(digest, 8, buf[2]); + PUT_32BIT_LSB_FIRST(digest, 12, buf[3]); + + /* zero sensitive data */ + /* notice this misses any sneaking out on the stack. The C + * version uses registers in some spots, perhaps because + * they care about this. + */ + zeroByteArray(in); + zeroIntArray(buf); + bits = 0; + zeroIntArray(inint); + } + + /* + public static void main(String args[]) { + // This main() method was created to easily test + // this class. It hashes whatever's on System.in. + + byte buf[] = new byte[397]; + // arbitrary buffer length designed to irritate update() + int rc; + MD5 md = new MD5(); + byte out[] = new byte[16]; + int i; + int len = 0; + + try { + while ((rc = System.in.read(buf, 0, 397)) > 0) { + md.update(buf, rc); + len += rc; + } + } catch (IOException ex) { + ex.printStackTrace(); + return; + } + md.md5final(out); + + System.out.println("file length: "+len); + System.out.println("hash: "+dumpBytes(out)); + } + */ + + + ///////////////////////////////////////////////////////////////////// + // Below here ye will only finde private functions // + ///////////////////////////////////////////////////////////////////// + + // There must be a way to do these functions that's + // built into Java, and I just haven't noticed it yet. + + private void zeroByteArray(byte[] a) { + zeroByteArray(a, 0, a.length); + } + + private void zeroByteArray(byte[] a, int start, int length) { + setByteArray(a, (byte) 0, start, length); + } + + private void setByteArray(byte[] a, byte val, int start, int length) { + int i; + int end = start+length; + for (i=start; i>>(32-s); + w += x; + return w; + } + + private int MD5STEP2(int w, int x, int y, int z, int data, int s) { + w += (y ^ (z & (x ^ y))) + data; + w = w<>>(32-s); + w += x; + return w; + } + + private int MD5STEP3(int w, int x, int y, int z, int data, int s) { + w += (x ^ y ^ z) + data; + w = w<>>(32-s); + w += x; + return w; + } + + private int MD5STEP4(int w, int x, int y, int z, int data, int s) { + w += (y ^ (x | ~z)) + data; + w = w<>>(32-s); + w += x; + return w; + } + + private void transform() { + /* load in[] byte array into an internal int array */ + int i; + int[] inint = new int[16]; + + for (i=0; i<16; i++) { + inint[i] = GET_32BIT_LSB_FIRST(in, 4*i); + } + + int a, b, c, d; + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + a = MD5STEP1(a, b, c, d, inint[0] + 0xd76aa478, 7); + d = MD5STEP1(d, a, b, c, inint[1] + 0xe8c7b756, 12); + c = MD5STEP1(c, d, a, b, inint[2] + 0x242070db, 17); + b = MD5STEP1(b, c, d, a, inint[3] + 0xc1bdceee, 22); + a = MD5STEP1(a, b, c, d, inint[4] + 0xf57c0faf, 7); + d = MD5STEP1(d, a, b, c, inint[5] + 0x4787c62a, 12); + c = MD5STEP1(c, d, a, b, inint[6] + 0xa8304613, 17); + b = MD5STEP1(b, c, d, a, inint[7] + 0xfd469501, 22); + a = MD5STEP1(a, b, c, d, inint[8] + 0x698098d8, 7); + d = MD5STEP1(d, a, b, c, inint[9] + 0x8b44f7af, 12); + c = MD5STEP1(c, d, a, b, inint[10] + 0xffff5bb1, 17); + b = MD5STEP1(b, c, d, a, inint[11] + 0x895cd7be, 22); + a = MD5STEP1(a, b, c, d, inint[12] + 0x6b901122, 7); + d = MD5STEP1(d, a, b, c, inint[13] + 0xfd987193, 12); + c = MD5STEP1(c, d, a, b, inint[14] + 0xa679438e, 17); + b = MD5STEP1(b, c, d, a, inint[15] + 0x49b40821, 22); + + a = MD5STEP2(a, b, c, d, inint[1] + 0xf61e2562, 5); + d = MD5STEP2(d, a, b, c, inint[6] + 0xc040b340, 9); + c = MD5STEP2(c, d, a, b, inint[11] + 0x265e5a51, 14); + b = MD5STEP2(b, c, d, a, inint[0] + 0xe9b6c7aa, 20); + a = MD5STEP2(a, b, c, d, inint[5] + 0xd62f105d, 5); + d = MD5STEP2(d, a, b, c, inint[10] + 0x02441453, 9); + c = MD5STEP2(c, d, a, b, inint[15] + 0xd8a1e681, 14); + b = MD5STEP2(b, c, d, a, inint[4] + 0xe7d3fbc8, 20); + a = MD5STEP2(a, b, c, d, inint[9] + 0x21e1cde6, 5); + d = MD5STEP2(d, a, b, c, inint[14] + 0xc33707d6, 9); + c = MD5STEP2(c, d, a, b, inint[3] + 0xf4d50d87, 14); + b = MD5STEP2(b, c, d, a, inint[8] + 0x455a14ed, 20); + a = MD5STEP2(a, b, c, d, inint[13] + 0xa9e3e905, 5); + d = MD5STEP2(d, a, b, c, inint[2] + 0xfcefa3f8, 9); + c = MD5STEP2(c, d, a, b, inint[7] + 0x676f02d9, 14); + b = MD5STEP2(b, c, d, a, inint[12] + 0x8d2a4c8a, 20); + + a = MD5STEP3(a, b, c, d, inint[5] + 0xfffa3942, 4); + d = MD5STEP3(d, a, b, c, inint[8] + 0x8771f681, 11); + c = MD5STEP3(c, d, a, b, inint[11] + 0x6d9d6122, 16); + b = MD5STEP3(b, c, d, a, inint[14] + 0xfde5380c, 23); + a = MD5STEP3(a, b, c, d, inint[1] + 0xa4beea44, 4); + d = MD5STEP3(d, a, b, c, inint[4] + 0x4bdecfa9, 11); + c = MD5STEP3(c, d, a, b, inint[7] + 0xf6bb4b60, 16); + b = MD5STEP3(b, c, d, a, inint[10] + 0xbebfbc70, 23); + a = MD5STEP3(a, b, c, d, inint[13] + 0x289b7ec6, 4); + d = MD5STEP3(d, a, b, c, inint[0] + 0xeaa127fa, 11); + c = MD5STEP3(c, d, a, b, inint[3] + 0xd4ef3085, 16); + b = MD5STEP3(b, c, d, a, inint[6] + 0x04881d05, 23); + a = MD5STEP3(a, b, c, d, inint[9] + 0xd9d4d039, 4); + d = MD5STEP3(d, a, b, c, inint[12] + 0xe6db99e5, 11); + c = MD5STEP3(c, d, a, b, inint[15] + 0x1fa27cf8, 16); + b = MD5STEP3(b, c, d, a, inint[2] + 0xc4ac5665, 23); + + a = MD5STEP4(a, b, c, d, inint[0] + 0xf4292244, 6); + d = MD5STEP4(d, a, b, c, inint[7] + 0x432aff97, 10); + c = MD5STEP4(c, d, a, b, inint[14] + 0xab9423a7, 15); + b = MD5STEP4(b, c, d, a, inint[5] + 0xfc93a039, 21); + a = MD5STEP4(a, b, c, d, inint[12] + 0x655b59c3, 6); + d = MD5STEP4(d, a, b, c, inint[3] + 0x8f0ccc92, 10); + c = MD5STEP4(c, d, a, b, inint[10] + 0xffeff47d, 15); + b = MD5STEP4(b, c, d, a, inint[1] + 0x85845dd1, 21); + a = MD5STEP4(a, b, c, d, inint[8] + 0x6fa87e4f, 6); + d = MD5STEP4(d, a, b, c, inint[15] + 0xfe2ce6e0, 10); + c = MD5STEP4(c, d, a, b, inint[6] + 0xa3014314, 15); + b = MD5STEP4(b, c, d, a, inint[13] + 0x4e0811a1, 21); + a = MD5STEP4(a, b, c, d, inint[4] + 0xf7537e82, 6); + d = MD5STEP4(d, a, b, c, inint[11] + 0xbd3af235, 10); + c = MD5STEP4(c, d, a, b, inint[2] + 0x2ad7d2bb, 15); + b = MD5STEP4(b, c, d, a, inint[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + } + + private int GET_32BIT_LSB_FIRST(byte[] b, int off) { + return + ((int)(b[off+0]&0xff)) | + ((int)(b[off+1]&0xff) << 8) | + ((int)(b[off+2]&0xff) << 16) | + ((int)(b[off+3]&0xff) << 24); + } + + private void PUT_32BIT_LSB_FIRST(byte[] b, int off, int value) { + b[off+0] = (byte) (value & 0xff); + b[off+1] = (byte) ((value >> 8) & 0xff); + b[off+2] = (byte) ((value >> 16)& 0xff); + b[off+3] = (byte) ((value >> 24)& 0xff); + } + + // These are debug routines I was using while trying to + // get this code to generate the same hashes as the C version. + // (IIRC, all the errors were due to the absence of unsigned + // ints in Java.) + /* + private void debugStatus(String m) { + System.out.println(m+":"); + System.out.println("in: "+dumpBytes(in)); + System.out.println("bits: "+bits); + System.out.println("buf: " + +Integer.toHexString(buf[0])+" " + +Integer.toHexString(buf[1])+" " + +Integer.toHexString(buf[2])+" " + +Integer.toHexString(buf[3])); + } + + private static String dumpBytes(byte[] bytes) { + int i; + StringBuffer sb = new StringBuffer(); + for (i=0; i 2) { + s = s.substring(s.length()-2); + } + sb.append(s); + } + return sb.toString(); + } + */ +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/Mail.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/Mail.java new file mode 100644 index 00000000..3afbe19c --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/Mail.java @@ -0,0 +1,422 @@ +/** + * This class is a container for all data contained in an Email Message. + **/ +public class Mail { + + String header; // the full header + //String sentOn; // time the message was sent + //String receivedOn; // time when the message arrived + String from; // the "from" field + String to; // the "to" field + String cc; + String subject; + String body; + String noURLBody; + String sourceCode; + String spam; + boolean hasAttachement; + String encoding; //rich text, plain, html + + String messageID; // cached message ID for reuse (takes a lot of memory and is used all over the place) + //same as hashcode of a class + boolean isSpam; + + /** + * this is a really simple implementation of a tokenizer + * used to build tokens from an email and divide email into parts + **/ + int MAX_TOKEN_SIZE; + + public Mail() { + messageID=null; + } + + public Mail(String fileName) // read a mail from file + { + //System.out.println("DEBUG: fileName= " + fileName); + + BufferedReader fileinput = new BufferedReader(new FileInputStream(fileName)); + String line; + boolean chk = false; + + while((line = fileinput.readLine()) != null) + { + chk = true; + + Vector splittedLine = line.split(); + if(((String)(splittedLine.elementAt(0))).equals("Spam:")) + { + spam = (String)(splittedLine.elementAt(1)); + } + else if(((String)(splittedLine.elementAt(0))).equals("Header:")) // message id + { + header = (String)splittedLine.elementAt(1); + } + else if(((String)(splittedLine.elementAt(0))).equals("To:")) // receiver + { + to = (String)splittedLine.elementAt(1); + } + else if(((String)(splittedLine.elementAt(0))).equals("From:")) // sender + { + from = (String)splittedLine.elementAt(1); + } + else if(((String)(splittedLine.elementAt(0))).equals("Cc:")) // cc + { + cc = (String)splittedLine.elementAt(1); + } + else if(((String)(splittedLine.elementAt(0))).equals("Subject:")) // Subject + { + subject = (String)splittedLine.elementAt(1); + break; + } + } // parsed messageID, To, from, cc, Title + + /** + * error checking + **/ + if(!chk) + System.out.println("no line read"); + + + body = new String(); + byte[] readBody = new byte[256]; + + while((fileinput.read(readBody)>0)) + { + body += new String(readBody); + readBody = new byte[256]; + } + + fileinput.close(); + + MAX_TOKEN_SIZE = 1024; + } + + // ------------------------------------------------------- + + public void setHeader(String header) { + this.header = header; + } + + public String getHeader() { + return header; + } + + + /* + public void setSentOn(String sentOn) { + this.sentOn = sentOn; + } + + public String getSentOn() { + return sentOn; + } + + public Date getSentOnAsDate() { + String sentOn = getSentOn(); + return parseDate(sentOn); + } + + public void setReceivedOn(String receivedOn) { + this.receivedOn = receivedOn; + } + + public String getReceivedOn() { + return receivedOn; + } + + public Date getReceivedOnAsDate() { + String receivedOn = getReceivedOn(); + return parseDate(receivedOn); + } + */ + + + /** + * Parses a given Date-String in into a real Date-Object + * + * @param stringDate the string in format dd.mm.yyyy hh:mm + * @return a Date containing the info of the string or the actual date and time if something fails. + */ + /* + public Date parseDate(String stringDate) { + // date is in this format: dd.mm.yyyy hh:mm + if (stringDate == null || "N/A".equals(stringDate)) { + return new Date(); + } + try { + synchronized (MAIL_TIME_FORMAT) { + return MAIL_TIME_FORMAT.parse(stringDate); + } + } catch (Throwable e) { + return new Date(); + } + } + */ + + public void setFrom(String from) { + this.from = from; + } + + public String getFrom() { + return from; + } + + public void setTo(String to) { + this.to = to; + } + + public String getTo() { + return to; + } + + public void setCc(String cc) { + this.cc = cc; + } + + public String getCc() { + return cc; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getSubject() { + return subject; + } + + public void setBody(String body) { + this.body = body; + } + + public String getBody() { + return body; + } + + public void setSourceCode(String sourceCode) { + this.sourceCode = sourceCode; + } + + public String getSourceCode() { + return sourceCode; + } + + public void setHasAttachement(boolean hasAttachement) { + this.hasAttachement = hasAttachement; + } + + public boolean getHasAttachement() { + return hasAttachement; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public String getEncoding() { + return encoding; + } + + public boolean isTextEncoding() { + return getEncoding().toLowerCase().indexOf("plain") >= 0; + } + + public boolean isHTMLEncoding() { + return getEncoding().toLowerCase().indexOf("html") >= 0; + } + + /* + public String toString() { + return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getReceivedOn() + "," + getSentOn() + "," + getSourceCode() + "," + getSubject() + "," + getTo(); + } + */ + + public String toString() { + return getBody() + "," + getCc() + "," + getEncoding() + "," + getFrom() + "," + getHasAttachement() + "," + getHeader() + "," + getSourceCode() + "," + getSubject() + "," + getTo(); + } + + /* + public String getID() { + if (messageID == null) { // no cached version + // Take the message-ID header as ID (if present) + String[] messageIDs = getHeaderField("Message-ID"); + if ((messageIDs != null) && (messageIDs.length > 0)) { + messageID = messageIDs[0]; + } else { // otherwise, hash header and body as ID + return String.valueOf(getHeader().hashCode() + getBody().hashCode()); + } + } + + return messageID; + } + */ + + public String[] getHeaderField(String fieldName) { + + } + + public String extractEMailAddress() { + + } + + /* + public boolean equals(Object o) { + if (o instanceof Mail) { + Mail mail = (Mail)o; + return this.getID().equals(mail.getID()); + } + + return false; + } + */ + + public Vector getCommonPart() + { + Vector returnStrings = new Vector(); + + // add header, sender, and title + returnStrings.addElement(header); + returnStrings.addElement(from); + returnStrings.addElement(subject); + + return returnStrings; + } + + public String getBodyString() + { + return body; + } + + public Vector returnEmail() { + Vector myemail = new Vector(); + myemail.addElement(getCommonPart()); + //System.out.println("DEBUG: getCommonPart.size= " + getCommonPart().size()); + myemail.addElement(getURLs()); + //System.out.println("DEBUG: getURLs.size= " + getURLs().size()); + myemail.addElement(getSplittedBody(MAX_TOKEN_SIZE)); + //System.out.println("DEBUG: getSplittedBody.size= " + getSplittedBody(MAX_TOKEN_SIZE).size()); + return myemail; + } + + public Vector getURLs() + { + Vector returnStrings = new Vector(); + Vector splittedBody = body.split(); + + // add URL and email in the body + for(int i=0; i=end) { + String str=noURLBody.substring(i, end); + returnStrings.addElement(str); + } + else { + String str=noURLBody.substring(i, i+size); + returnStrings.addElement(str); + } + } + return returnStrings; + } + + + public void setIsSpam(boolean spam) { + isSpam = spam; + } + + public boolean getIsSpam() { + if(spam.equals("yes")) + return true; + return false; + } + + /** + * Returns result to the Spam filter + **/ + public Vector checkMail(int userid) { + //Preprocess emails + + //long startGetParts=System.currentTimeMillis(); + Vector partsOfMailStrings = returnEmail(); + //long stopGetParts=System.currentTimeMillis(); + //System.out.println("Time to read email= " + (stopGetParts-startGetParts)); + + //Compute signatures + SignatureComputer sigComp = new SignatureComputer(); + //Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of strings + //long startGetsignatures=System.currentTimeMillis(); + Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of vector of strings + //long stopGetsignatures=System.currentTimeMillis(); + //System.out.println("Time to Getsignatures= " + (stopGetsignatures-startGetsignatures)); + + return signatures; + } + + /* For tests only */ + /* + public static void main(String[] args) + { + Mail mail = new Mail("./emails/email1"); + + String[] a = mail.createMailStrings(); + + for(String b : a) + { + System.out.println(b); + } + } + */ +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/SignatureComputer.java b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/SignatureComputer.java new file mode 100644 index 00000000..4f98a2d0 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/SignatureComputer.java @@ -0,0 +1,289 @@ +public class SignatureComputer { + public EphemeralSignature sig4; //signature engines + public WhiplashSignature sig8; //signature engines + + int[] enginesToUseForCheck; + + public SignatureComputer() { + sig4 = new EphemeralSignature(); //default values + sig8 = new WhiplashSignature(); + createEnginesToCheck(); + } + + /** + * constructor to be used when some parsing has already taken place with the + * server-provides value randomNumberSeed. + * + * @param randomNumberSeed + * a non-negative number used for seeding the random number generator + * before starting to hash values. + * @param separator + * how the mail-text should be splitted into lines. (== what chars + * separate 2 lines) + */ + public SignatureComputer(int randomNumberSeed, String separator) { + sig4 = new EphemeralSignature(randomNumberSeed,separator); + sig8 = new WhiplashSignature(); + createEnginesToCheck(); + } + + /** + * the constructor to be used most of the time. you can hand over the + * seed-string exactly as it is provided by the razor-server. + * + * @param seedAndSeparator + * a string containing the seed value for the RNG and a separator list + * (separated by ' - '). default value is + * "7542-10" which means server-seed 7542 and only one + * separator 10 (which is ascii '\n'). + */ + public SignatureComputer(String seedAndSeparator) { + sig4 = new EphemeralSignature(seedAndSeparator); + sig8 = new WhiplashSignature(); + createEnginesToCheck(); + } + + /** + * + */ + public void createEnginesToCheck() { + enginesToUseForCheck = new int[2]; + enginesToUseForCheck[0] = 4; //Ephemeral engine + enginesToUseForCheck[1] = 8;//Whiplash engine + } + + public boolean isSigSupported(int sig) { + boolean found = false; + for (int i = 0; i < enginesToUseForCheck.length && !found; i++) { + if (enginesToUseForCheck[i] == sig) { + found = true; + } + } + return found; + } + + public boolean isSigSupported(String sig) { + return (sig != null && isSigSupported(Integer.parseInt(sig))); + } + + public String getDefaultEngine() { + return "4"; + } + + public Vector computeSigs(Vector EmailParts) { + if (EmailParts == null) return null; + + Vector printableSigs = new Vector(); // vector of strings + + /** + * Step -I + * Get signatures for the common parts + **/ + + Vector commonpart = (Vector) (EmailParts.elementAt(0)); + for (int mailIndex = 0; mailIndex < commonpart.size(); mailIndex++) { + String mail = (String) (commonpart.elementAt(mailIndex)); + + if (mail == null) continue; + + /* + * Compute Sig for email header that are cleaned. + */ + for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { + int engineNo = enginesToUseForCheck[engineIndex]; + String sig = null; + + /* EphemeralSignature calculator */ + if(engineNo==4) { + sig = computeSignature(engineNo,mail); + } + + if(engineNo==8) { + continue; + } + + if((engineNo!=4)) { + System.out.println("Err: Common part Couldn't find the signature engine: " + engineNo); + } + + if (sig != null) { + String hash = engineNo + ":" + sig; + printableSigs.addElement(hash); + + //System.out.println("DEBUG: mail= " +mail + " hash= " + hash); + + } else { + // we didn't produce a signature for the mail. + } + }//engine + }//common part + + /** + * Step -II + * Get signatures for the body parts without URLs + **/ + Vector getBodywithNoURLs = (Vector)(EmailParts.elementAt(2)); + for (int mailIndex = 0; mailIndex < getBodywithNoURLs.size(); mailIndex++) { + String mail = (String) (getBodywithNoURLs.elementAt(mailIndex)); + + + if (mail == null) continue; + + /* + * Compute Sig for email header that are cleaned. + */ + for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { + int engineNo = enginesToUseForCheck[engineIndex]; + String sig = null; + + /* EphemeralSignature calculator */ + if(engineNo==4) { + sig = computeSignature(engineNo,mail); + } + + if(engineNo==8) + continue; + + if(engineNo!=4) { + System.out.println("Err: body parts without URL Couldn't find the signature engine: " + engineNo); + } + + if (sig != null) { + String hash = engineNo + ":" + sig; + printableSigs.addElement(hash); + } else { + // we didn't produce a signature for the mail. + } + }//engine + } + + /** + * Step -III + * Get signatures for the body parts with URLs + **/ + Vector getURLs = (Vector)(EmailParts.elementAt(1)); + for (int mailIndex = 0; mailIndex < getURLs.size(); mailIndex++) { + String mail = (String) (getURLs.elementAt(mailIndex)); + + /* + * Compute Sig for bodyparts that are cleaned. + */ + for (int engineIndex = 0; engineIndex < enginesToUseForCheck.length; engineIndex++) { + int engineNo = enginesToUseForCheck[engineIndex]; + if(engineNo==4) + continue; + + /* WhiplashSignature calculator */ + String[] hosts = null; + String sig = null; + if(engineNo==8) { + //hosts = computeSignature(engineNo,mail); + hosts = sig8.computeSignature(mail); + if(hosts != null) { + for(int i=0; i -n -e \n"); + System.out.println( " -n : num iterations"); + System.out.println( " -e : number of emails"); + } + + /** + * Returns result to the Spam filter + **/ + /* + public boolean checkMail(Mail mail, int userid) { + //Preprocess emails + //Vector partsOfMailStrings = mail.createMailStringsWithURL(); + /* + Vector partsOfMailStrings = mail.getCommonPart(); + partsOfMailStrings.addElement(mail.getBodyString()); + + //Compute signatures + SignatureComputer sigComp = new SignatureComputer(); + Vector signatures = sigComp.computeSigs(partsOfMailStrings);//vector of strings + + //check with global data structure + int[] confidenceVals = check(signatures,userid); + + //---- create and return results -------- + FilterResult filterResult = new FilterResult(); + boolean spam = filterResult.getResult(confidenceVals); + + return spam; + } + */ + + public int[] check(Vector signatures, int userid) { + int numparts = signatures.size(); + + //System.out.println("check() numparts= " + numparts); + + int[] confidenceVals = new int[numparts]; + for(int i=0; i the mail client is able to determine if it is spam or not + // --- According to the "any"-logic (in Core#check_logic) in original Razor --- + // If any answer is spam, the entire email is spam. + return confidenceVals; + } + + /** + * This method sends feedback from the user to a distributed + * spam database and trains the spam database to check future + * emails and detect spam + **/ + public void sendFeedBack(Vector signatures, boolean isSpam, int id, Random myrand) { + + for(int i=0;ipack() which + * we must do manually in java. + */ + private int convertHexToRazorEncoding(String hex3) { + if((hex3 == null)) + return 0; //error + int res = 0; + int cur = Integer.parseInt(hex3.substring(0,1),16); + cur = mirror4LSBits(cur); + res |= ( (cur&0xf) << 8); + if(hex3.length() >=2) { + cur = Integer.parseInt(hex3.substring(1,2),16); + } else { + cur = 0; + } + //cur = ( hex3.length() >=2 ? Integer.parseInt(hex3.substring(1,2),16) : 0); + cur = mirror4LSBits(cur); + res |= ((cur & 0xf) << 4); + if(hex3.length() >= 3) { + cur = Integer.parseInt(hex3.substring(2,3),16); + } else { + cur = 0; + } + //cur = ( hex3.length() >= 3 ? Integer.parseInt(hex3.substring(2,3),16): 0); + cur = mirror4LSBits(cur); + res |= (cur & 0xf); + + return res; + } + + /** + * mirrors the 4 least significant bytes of an integer + * @param cur an int containing 4 Least Singificant bytes like 00000...00abcd + * @return the mirrored 4 least significant bytes 00000...00dcba. all bits except a-b are lost. + */ + public int mirror4LSBits(int cur) { + int res = 0; + res |= (cur & 0x8)>>>3; + res |= (cur & 0x4)>>>1; + res |= (cur & 0x2)<<1; + res |= (cur & 0x1)<<3; + return res; + } + + public String[] whiplash(String text) { + + if (text == null) { + return null; + } + String[] hosts = extractHosts(text); + if (hosts == null || hosts.length < 1) { + return null; + } + String[] sigs = new String[hosts.length]; + + for (int i = 0; i < hosts.length; i++) { + MD5 md = new MD5(); + String host = hosts[i]; + int len = host.length(); + byte buf[] = host.getBytes(); + byte sig[] = new byte[16]; + md.update(buf, len); + md.md5final(sig); + String signature = new String(sig); + + // System.out.println("DEBUG: host= " + host + " whiplash sig= " + signature); + + sigs[i] = signature; + } + return sigs; + } + + public String[] extractHosts(String text) { + //System.out.println("Inside extractHosts"); + Vector hosts = new Vector(); + String buf = new String(text); + + //System.out.println("DEBUG: extractHosts() string= " + buf); + + /* Extract hosts from http:// links */ + int idx; + String strwww = new String("www."); + while ((idx = buf.indexOf(strwww)) != -1) { + int startidx = idx + strwww.length(); + String strcom = new String("."); + buf = buf.subString(startidx); + int endidx = buf.indexOf(strcom); + String host = buf.subString(0, endidx); + //System.out.println("DEBUG: http links extracted host= " + host); + + buf = buf.subString(endidx); + endidx = buf.indexOf(strcom); + host += buf.subString(0, endidx); + + hosts.addElement(host); + buf = buf.subString(endidx+strcom.length()); + } + + /* Extract hosts from email addressess */ + buf = new String(text); + String strrate = new String("@"); + while ((idx = buf.indexOf(strrate)) != -1) { + int startidx = idx + strrate.length(); + String strdot = new String("."); + buf = buf.subString(startidx); + int endidx = buf.indexOf(strdot); + String host = buf.subString(0, endidx); + //System.out.println("DEBUG: email addr extracted host= " + host); + + buf = buf.subString(endidx); + endidx = buf.indexOf(strdot); + host += buf.subString(0, endidx); + + hosts.addElement(host); + buf = buf.subString(endidx+strdot.length()); + } + + if (hosts.size() == 0) { + return null; + } + + String[] retbuf = new String[hosts.size()]; + for (int i = 0; i < hosts.size(); i++) { + retbuf[i] = (String) (hosts.elementAt(i)); + } + + return retbuf; + } + +// Testing the signature computation +// public static void main(String[] args) { +// /* String testVector = " Test Vectors: \n"+ +// "\n" + +// "1. http:www.nodg.com@www.geocities.com/nxcisdsfdfdsy/off\n"+ +// "2. http:www.ksleybiuh.com@213.171.60.74/getoff/\n"+ +// "3. \n"+ +// "4. http:217.12.4.7/rmi/http:definethis.net/526/index.html\n"+ +// "5. http:magalygr8sex.free-host.com/h.html\n"+ +// "6. http:%3CVenkatrs%3E@218.80.74.102/thecard/4index.htm\n"+ +// "7. http:EBCDVKIGURGGCEOKXHINOCANVQOIDOXJWTWGPC@218.80.74.102/thecard/5in\n"+ +// "8. http:g.india2.bag.gs/remove_page.htm\n"+ +// "9. https:220.97.40.149\n"+ +// "10. http:mjaked.biz/unsubscribe.ddd?leaving\n"+ +// "11. http:g5j99m8@it.rd.yahoo.com/bassi/*http:www.lekobas.com/c/index.php\n"+ +// "12. look great / feel great\n"+ +// "13. \n"+ +// "14. www.pillzthatwork.com # anything that starts with www. \n"; +// */ +// String testVector = "\n"+ +// "\n"+ +// "

Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com

\n"+ +// "

now a masked link http://www.coveringlink1.com and another link http:plaintextlink3.net and how about https:plaintextlink4.to

\n"+ +// "

another masked link https:coveringlink2.com and another link https:plaintextlink5.com

\n"+ +// "\n"+ +// "\n"; +// String test1 = "Our first autolink: www.autolink1.com or another link like www.autolink2.co.uk or how about https:plaintextlink1.co.uk or http:plaintextlink2.com

\n"; +// WhiplashSignature whiplash = new WhiplashSignature(); +// String[] hosts = whiplash.computeSignature(testVector); +// //String[] hosts = whiplash.computeSignature(test1); +// for (int i = 0; i < hosts.length; i++) { +// String string = hosts[i]; +// System.out.println("host " + i + ":\t" + string); +// } +// } + +} diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/dstm.conf b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/dstm.conf new file mode 100644 index 00000000..18e28963 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/dstm.conf @@ -0,0 +1,12 @@ +128.195.180.21 +128.195.180.26 +#128.195.136.162 +#128.195.136.163 +#128.195.136.164 +#128.195.136.165 +#128.195.136.166 +#128.195.136.167 +#128.195.136.168 +#128.195.136.169 + + diff --git a/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/makefile b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/makefile new file mode 100644 index 00000000..569af6c1 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/SpamFilter/recovery/makefile @@ -0,0 +1,21 @@ +MAINCLASS=SpamFilter +SRC=${MAINCLASS}.java \ + DistributedHashMap.java \ + Mail.java \ + FilterResult.java \ + HashEntry.java \ + HashStat.java \ + SignatureComputer.java \ + FilterStatistic.java \ + EphemeralSignature.java \ + GString.java \ + WhiplashSignature.java + +FLAGS= -dsm -recoverystats -recovery -nooptimize -mainclass ${MAINCLASS} + +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC} + +clean: + rm -rf tmpbuilddirectory* + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/Spider/GlobalQuery.java b/Robust/src/Benchmarks/Recovery/Spider/GlobalQuery.java deleted file mode 100644 index 718728b8..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/GlobalQuery.java +++ /dev/null @@ -1,92 +0,0 @@ -public class GlobalQuery { - GlobalString hostname; - GlobalString path; - int depth; - - public GlobalQuery(GlobalString hostname, GlobalString path) { - this.hostname = hostname; - this.path = path; - this.depth = 0; - } - - public GlobalQuery(GlobalString hostname, GlobalString path, int depth) { - this.hostname = global new GlobalString(hostname); - this.path = global new GlobalString(path); - this.depth = depth; - } - - public int getDepth() { - return depth; - } - - public GlobalString getHostName() { - return hostname; - } - - public GlobalString getPath() { - return path; - } - - public GlobalString makewebcanonical(GlobalString page) { - GlobalStringBuffer b = global new GlobalStringBuffer(getHostName(page)); - b.append("/"); - b.append(getPathName(page)); - return b.toGlobalString(); - } - - public GlobalString getHostName(GlobalString page) { - GlobalString http = global new GlobalString("http://"); - GlobalString https = global new GlobalString("https://"); - int beginindex; - int endindex; - - if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { - return getHostName(); - } - else if (page.indexOf(https) != -1) { - beginindex = page.indexOf(https) + https.length(); - } - else { - beginindex = page.indexOf(http) + http.length(); - } - endindex = page.indexOf('/',beginindex+1); - - if ((beginindex == -1)) { - System.printString("ERROR"); - } - if (endindex == -1) - endindex = page.length(); - - return page.subString(beginindex, endindex); - } - - - public GlobalString getPathName(GlobalString page) { - GlobalString http = global new GlobalString("http://"); - GlobalString https = global new GlobalString("https://"); - int beginindex; - int nextindex; - - if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { - GlobalString path = getPath(); - int lastindex = path.lastindexOf('/'); - if (lastindex == -1) - return page; - - GlobalStringBuffer sb = global new GlobalStringBuffer(path.subString(0,lastindex+1)); - sb.append(page); - return sb.toGlobalString(); - } - else if (page.indexOf(https) != -1) { - beginindex = page.indexOf(https) + https.length(); - } - else { - beginindex = page.indexOf(http) + http.length(); - } - nextindex = page.indexOf('/',beginindex+1); - - if ((beginindex == -1) || (nextindex == -1)) - return global new GlobalString("index.html"); - return page.subString(nextindex+1, page.length()); - } -} diff --git a/Robust/src/Benchmarks/Recovery/Spider/LocalQuery.java b/Robust/src/Benchmarks/Recovery/Spider/LocalQuery.java deleted file mode 100644 index 1beeadbe..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/LocalQuery.java +++ /dev/null @@ -1,95 +0,0 @@ -public class LocalQuery { - String hostname; - String path; - StringBuffer response; - int depth; - - public LocalQuery(String hostname, String path, int depth) { - this.hostname = new String(hostname); - this.path = new String(path); - response = new StringBuffer(); - this.depth = depth; - } - - public int getDepth() { - return depth; - } - - public String getHostName() { - return hostname; - } - - public String getPath() { - return path; - } - - public void outputFile() { - StringBuffer sb = new StringBuffer(hostname); - sb.append(path); - FileOutputStream fos = new FileOutputStream(sb.toString().replace('/','#')); - fos.write(response.toString().getBytes()); - fos.close(); - } - - public String makewebcanonical(String page) { - StringBuffer b = new StringBuffer(getHostName(page)); - b.append("/"); - b.append(getPathName(page)); - return b.toString(); - } - - public String getHostName(String page) { - String http = new String("http://"); - String https = new String("https://"); - int beginindex; - int endindex; - - if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { - return getHostName(); - } - else if (page.indexOf(https) != -1) { - beginindex = page.indexOf(https) + https.length(); - } - else { - beginindex = page.indexOf(http) + http.length(); - } - endindex = page.indexOf('/',beginindex+1); - - if ((beginindex == -1)) { - System.printString("ERROR"); - } - if (endindex == -1) - endindex = page.length(); - - return page.subString(beginindex, endindex); - } - - public String getPathName(String page) { - String http = new String("http://"); - String https = new String("https://"); - int beginindex; - int nextindex; - - if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { - String path = getPath(); - int lastindex = path.lastindexOf('/'); - if (lastindex == -1) - return page; - - StringBuffer sb = new StringBuffer(path.subString(0,lastindex+1)); - sb.append(page); - return sb.toString(); - } - else if (page.indexOf(https) != -1) { - beginindex = page.indexOf(https) + https.length(); - } - else { - beginindex = page.indexOf(http) + http.length(); - } - nextindex = page.indexOf('/',beginindex+1); - - if ((beginindex==-1) || (nextindex==-1)) - return new String("index.html"); - return page.subString(nextindex+1, page.length()); - } -} diff --git a/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java b/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java deleted file mode 100644 index 7113e451..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/QueryTask.java +++ /dev/null @@ -1,388 +0,0 @@ -public class QueryTask extends Task { - int maxDepth; - int maxSearchDepth; - GlobalQueue toprocess; - DistributedHashMap results; - DistributedLinkedList results_list; - DistributedHashMap visitedList; - GlobalString gTitle; - GlobalString workingURL; - - public QueryTask(GlobalQueue todoList, DistributedHashMap visitedList, int maxDepth, int maxSearchDepth, DistributedHashMap results, DistributedLinkedList results_list) { - this.todoList = todoList; - this.visitedList = visitedList; - this.maxDepth = maxDepth; - this.maxSearchDepth = maxSearchDepth; - this.results = results; - this.results_list = results_list; - toprocess = global new GlobalQueue(); - } - - public void execute() { - int depth; - int max; - int maxSearch; - - atomic { - depth = ((GlobalQuery)myWork).getDepth(); - max = this.maxDepth; - maxSearch = this.maxSearchDepth; - } - - if (depth < max) { - /* global variables */ - GlobalQuery gq; - - /* local variables */ - LocalQuery lq; - String hostname; - String path; - String title; - - atomic { - gq = (GlobalQuery)myWork; - hostname = new String(GlobalString.toLocalCharArray(gq.getHostName())); - path = new String(GlobalString.toLocalCharArray(gq.getPath())); - - GlobalStringBuffer gsb = global new GlobalStringBuffer(hostname); - gsb.append("/"); - gsb.append(path); - workingURL = global new GlobalString(gsb.toGlobalString()); - gTitle = null; - } - lq = new LocalQuery(hostname, path, depth); - -/* System.printString("["+lq.getDepth()+"] "); - System.printString("Processing - Hostname : "); - System.printString(hostname); - System.printString(", Path : "); - System.printString(path); - System.printString("\n"); -*/ - if (isDocument(path)) { - return; - } - - Socket s = new Socket(); - - if(s.connect(hostname, 80) == -1) { - return; - } - - requestQuery(hostname, path, s); - readResponse(lq, s); - - if ((title = grabTitle(lq)) != null) { - atomic { - gTitle = global new GlobalString(title); - } - atomic { - toprocess = processPage(lq); - } - } - s.close(); - } - } - - - public static boolean isDocument(String str) { - int index = str.lastindexOf('.'); - - if (index != -1) { - if ((str.subString(index+1)).equals("pdf")) return true; - else if ((str.subString(index+1)).equals("ps")) return true; - else if ((str.subString(index+1)).equals("ppt")) return true; - else if ((str.subString(index+1)).equals("pptx")) return true; - else if ((str.subString(index+1)).equals("jpg")) return true; - else if ((str.subString(index+1)).equals("mp3")) return true; - else if ((str.subString(index+1)).equals("wmv")) return true; - else if ((str.subString(index+1)).equals("doc")) return true; - else if ((str.subString(index+1)).equals("docx")) return true; - else if ((str.subString(index+1)).equals("mov")) return true; - else if ((str.subString(index+1)).equals("flv")) return true; - else if ((str.subString(index+1)).equals("tar")) return true; - else if ((str.subString(index+1)).equals("tgz")) return true; - else return false; - } - return false; - } - - public void done(Object obj) { - if ((gTitle != null) && (gTitle.length() > 0)) { - processedList(); - } - - int searchCnt = 0; - while(!toprocess.isEmpty()) { - GlobalQuery q = (GlobalQuery)toprocess.pop(); - - GlobalString hostname = global new GlobalString(q.getHostName()); - GlobalString path = global new GlobalString(q.getPath()); - - GlobalStringBuffer gsb = global new GlobalStringBuffer(hostname); - gsb.append("/"); - gsb.append(path); - - if (!visitedList.containsKey(gsb.toGlobalString()) && (searchCnt < maxSearchDepth)) { - todoList.push(q); - - GlobalString str = global new GlobalString("1"); - visitedList.put(gsb.toGlobalString(), str); - results_list.add(gsb.toGlobalString()); - searchCnt++; - } - } - } - - public void output() { - String str; - Iterator iter = results_list.iterator(); - - while (iter.hasNext() == true) { - str = ((GlobalString)(iter.next())).toLocalString(); - System.printString(str + "\n"); - } - } - - public static String grabTitle(LocalQuery lq) { - String sBrace = new String("<"); - String strTitle = new String("title>"); - String searchstr = lq.response.toString(); - String title = null; - char ch; - - int mindex = -1; - int endquote = -1; - int i, j; - String tmp; - - for (i = 0; i < searchstr.length(); i++) { - if (searchstr.charAt(i) == '<') { - i++; - if (searchstr.length() > (i+strTitle.length())) { - tmp = searchstr.subString(i, i+strTitle.length()); - if (tmp.equalsIgnoreCase("title>")) { - mindex = i + tmp.length(); - for (j = mindex; j < searchstr.length(); j++) { - if (searchstr.charAt(j) == '<') { - j++; - tmp = searchstr.subString(j, j+strTitle.length()+1); - if (tmp.equalsIgnoreCase("/title>")) { - endquote = j - 1; - break; - } - } - } - } - } - } - } - - if (mindex != -1) { - title = searchstr.subString(mindex, endquote); - if (Character.isWhitespace(title.charAt(0))){ - mindex=0; - while (Character.isWhitespace(title.charAt(mindex++))); - mindex--; - if (mindex >= title.length()) return null; - title = new String(title.subString(mindex)); - } - - if (Character.isWhitespace(title.charAt(title.length()-1))) { - endquote=title.length()-1; - while (Character.isWhitespace(title.charAt(endquote--))); - endquote += 2; - if (mindex >= endquote) return null; - title = new String(title.subString(0, endquote)); - } - - if (isErrorPage(title)) { - return null; - } - } - - return title; - } - - public static boolean isErrorPage(String str) { - if (str.equals("301 Moved Permanently")) - return true; - else if (str.equals("302 Found")) - return true; - else if (str.equals("404 Not Found")) - return true; - else if (str.equals("403 Forbidden")) - return true; - else if (str.equals("404 File Not Found")) - return true; - else - return false; - } - - public static void requestQuery(String hostname, String path, Socket sock) { - StringBuffer req = new StringBuffer("GET "); - req.append("/"); - req.append(path); - req.append(" HTTP/1.0\r\nHost: "); - req.append(hostname); - req.append("\r\n\r\n"); - sock.write(req.toString().getBytes()); - } - - public static void readResponse(LocalQuery lq, Socket sock) { - // state 0 - nothing - // state 1 - \r - // state 2 - \r\n - // state 3 - \r\n\r - // state 4 - \r\n\r\n - byte[] buffer = new byte[1024]; - int numchars; - - do { - numchars = sock.read(buffer); - - String curr = (new String(buffer)).subString(0, numchars); - - lq.response.append(curr); - buffer = new byte[1024]; - } while(numchars > 0); - } - - public void processedList() { - LinkedList ll; - GlobalString token = null; - int mindex = 0; - int endquote = 0; - - while (endquote != -1) { - endquote = gTitle.indexOf(' ', mindex); - - if (endquote != -1) { - token = gTitle.subString(mindex, endquote); - mindex = endquote + 1; - if (filter(token)) { - continue; - } - token = refine(token); - } - else { - token = gTitle.subString(mindex); - token = refine(token); - } - - GlobalQueue q = (GlobalQueue)results.get(token); - if (q == null) { - q = global new GlobalQueue(); - } - q.push(workingURL); - results.put(token, q); - } - } - - public boolean filter(GlobalString str) { - if (str.equals("of")) return true; - else if (str.equals("for")) return true; - else if (str.equals("a")) return true; - else if (str.equals("an")) return true; - else if (str.equals("the")) return true; - else if (str.equals("at")) return true; - else if (str.equals("and")) return true; - else if (str.equals("or")) return true; - else if (str.equals("but")) return true; - else if (str.equals("to")) return true; - else if (str.equals("The")) return true; - else if (str.length() == 1) { - if (str.charAt(0) == '.') return true; - else if (str.charAt(0) == '.') return true; - else if (str.charAt(0) == '-') return true; - else if (str.charAt(0) == '=') return true; - else if (str.charAt(0) == '_') return true; - else if (str.charAt(0) == ':') return true; - else if (str.charAt(0) == ';') return true; - else if (str.charAt(0) == '\'') return true; - else if (str.charAt(0) == '\"') return true; - else if (str.charAt(0) == '|') return true; - else if (str.charAt(0) == '@') return true; - else if (str.charAt(0) == '&') return true; - else if (str.charAt(0) == ' ') return true; - } - else return false; - } - - public GlobalString refine(GlobalString str) { - str = refinePrefix(str); - str = refinePostfix(str); - return str; - } - - public GlobalString refinePrefix(GlobalString str) { - if (str.charAt(0) == '&') { // & - return str.subString(1); - } - else if (str.charAt(0) == '/') { // & - return str.subString(1); - } - return str; - } - - public GlobalString refinePostfix(GlobalString str) { - if (str.charAt(str.length()-1) == ',') { // , - return str.subString(0, str.length()-1); - } - else if (str.charAt(str.length()-1) == ':') { // : - return str.subString(0, str.length()-1); - } - else if (str.charAt(str.length()-1) == ';') { // ; - return str.subString(0, str.length()-1); - } - else if (str.charAt(str.length()-1) == '!') { // ! - return str.subString(0, str.length()-1); - } - else if (str.charAt(str.length()-1) == 's') { // 's - if (str.charAt(str.length()-2) == '\'') - return str.subString(0, str.length()-2); - } - else if (str.charAt(str.length()-1) == '-') { - int index = str.length()-2; - while (Character.isWhitespace(str.charAt(index--))); - return str.subString(0, index+2); - } - return str; - } - - public static GlobalQueue processPage(LocalQuery lq) { - int index = 0; - String href = new String("href=\""); - String searchstr = lq.response.toString(); - int depth; - boolean cont = true; - GlobalQueue toprocess; - - depth = lq.getDepth() + 1; - - toprocess = global new GlobalQueue(); - while(cont) { - int mindex = searchstr.indexOf(href,index); - if (mindex != -1) { - int endquote = searchstr.indexOf('"', mindex+href.length()); - if (endquote != -1) { - String match = searchstr.subString(mindex+href.length(), endquote); - String match2 = lq.makewebcanonical(match); - - GlobalString ghostname; - GlobalString gpath; - - ghostname = global new GlobalString(lq.getHostName(match)); - gpath = global new GlobalString(lq.getPathName(match)); - - if (match2 != null) { - GlobalQuery gq = global new GlobalQuery(ghostname, gpath, depth); - toprocess.push(gq); - } - index = endquote; - } else cont = false; - } else cont = false; - } - return toprocess; - } -} diff --git a/Robust/src/Benchmarks/Recovery/Spider/Spider.java b/Robust/src/Benchmarks/Recovery/Spider/Spider.java deleted file mode 100644 index 93242493..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/Spider.java +++ /dev/null @@ -1,88 +0,0 @@ -/* -Usage : - ./Spider.java master -*/ - - -public class Spider { - public static void main(String[] args) { - int NUM_THREADS = 3; - int maxDepth = 3; - int maxSearchDepth = 10; - int i, j; - Work[] works; - QueryTask[] qt; - GlobalQuery[] currentWorkList; - String fm = "www.uci.edu"; - String fp = ""; - - if(args.length != 4) { - System.out.println("./Spider.java master "); - System.exit(0); - } - else { - NUM_THREADS = Integer.parseInt(args[0]); - fm = args[1]; - fp = args[2]; - maxDepth = Integer.parseInt(args[3]); - } - - GlobalString firstmachine; - GlobalString firstpage; - - int mid[] = new int[8]; - mid[0] = (128<<24)|(195<<16)|(180<<8)|21; - mid[1] = (128<<24)|(195<<16)|(180<<8)|26; -/* mid[0] = (128<<24)|(195<<16)|(136<<8)|162; - mid[1] = (128<<24)|(195<<16)|(136<<8)|163; - mid[2] = (128<<24)|(195<<16)|(136<<8)|164; - mid[3] = (128<<24)|(195<<16)|(136<<8)|165; - mid[4] = (128<<24)|(195<<16)|(136<<8)|166; - mid[5] = (128<<24)|(195<<16)|(136<<8)|167; - mid[6] = (128<<24)|(195<<16)|(136<<8)|168; - mid[7] = (128<<24)|(195<<16)|(136<<8)|169; - */ - atomic { - firstmachine = global new GlobalString(fm); - if (args.length == 3) { - firstpage = global new GlobalString(fp); - } - else - firstpage = global new GlobalString("");; - - works = global new Work[NUM_THREADS]; - qt = global new QueryTask[NUM_THREADS]; - currentWorkList = global new GlobalQuery[NUM_THREADS]; - - GlobalQuery firstquery = global new GlobalQuery(firstmachine, firstpage); - - GlobalQueue todoList = global new GlobalQueue(); - DistributedHashMap visitedList = global new DistributedHashMap(500, 500, 0.75f); - DistributedHashMap results = global new DistributedHashMap(100, 100, 0.75f); - DistributedLinkedList results_list = global new DistributedLinkedList(); - - todoList.push(firstquery); - - for (i = 0; i < NUM_THREADS; i++) { - qt[i] = global new QueryTask(todoList, visitedList, maxDepth, maxSearchDepth, results, results_list); - works[i] = global new Work(qt[i], NUM_THREADS, i, currentWorkList); - } - } - System.printString("Finished to create Objects\n"); - - Work tmp; - for (i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = works[i]; - } - Thread.myStart(tmp, mid[i]); - } - - for (i = 0; i < NUM_THREADS; i++) { - atomic { - tmp = works[i]; - } - tmp.join(); - } - } -} diff --git a/Robust/src/Benchmarks/Recovery/Spider/dstm.conf b/Robust/src/Benchmarks/Recovery/Spider/dstm.conf deleted file mode 100644 index 28d63559..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/dstm.conf +++ /dev/null @@ -1,6 +0,0 @@ -128.195.180.21 -#128.195.180.24 -128.195.180.26 -#128.195.136.162 -#128.195.136.163 -#128.195.136.164 diff --git a/Robust/src/Benchmarks/Recovery/Spider/java/makefile b/Robust/src/Benchmarks/Recovery/Spider/java/makefile index 6c43c3d6..cff29434 100644 --- a/Robust/src/Benchmarks/Recovery/Spider/java/makefile +++ b/Robust/src/Benchmarks/Recovery/Spider/java/makefile @@ -3,7 +3,7 @@ SUBCLASS=Query SRC1=${MAINCLASS}.java SRC2=Local${SUBCLASS}.java SRC3=${SUBCLASS}Task.java -FLAGS= -32bit -nooptimize -mainclass ${MAINCLASS} +FLAGS= -optimize -thread -mainclass ${MAINCLASS} default: ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC2} ${SRC3} ${SRC1} diff --git a/Robust/src/Benchmarks/Recovery/Spider/makefile b/Robust/src/Benchmarks/Recovery/Spider/makefile deleted file mode 100644 index 3702f861..00000000 --- a/Robust/src/Benchmarks/Recovery/Spider/makefile +++ /dev/null @@ -1,12 +0,0 @@ -MAINCLASS=Spider -SUBCLASS=Query -SRC1=${MAINCLASS}.java -SRC2=Global${SUBCLASS}.java -SRC3=${SUBCLASS}Task.java -FLAGS= -recoverystats -recovery -dsmtask -dsm -dsmtask -32bit -nooptimize -debug -mainclass ${MAINCLASS} -default: - ../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC2} ${SRC3} ${SRC1} - -clean: - rm -rf tmpbuilddirectory - rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/GlobalQuery.java b/Robust/src/Benchmarks/Recovery/Spider/recovery/GlobalQuery.java new file mode 100644 index 00000000..718728b8 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/GlobalQuery.java @@ -0,0 +1,92 @@ +public class GlobalQuery { + GlobalString hostname; + GlobalString path; + int depth; + + public GlobalQuery(GlobalString hostname, GlobalString path) { + this.hostname = hostname; + this.path = path; + this.depth = 0; + } + + public GlobalQuery(GlobalString hostname, GlobalString path, int depth) { + this.hostname = global new GlobalString(hostname); + this.path = global new GlobalString(path); + this.depth = depth; + } + + public int getDepth() { + return depth; + } + + public GlobalString getHostName() { + return hostname; + } + + public GlobalString getPath() { + return path; + } + + public GlobalString makewebcanonical(GlobalString page) { + GlobalStringBuffer b = global new GlobalStringBuffer(getHostName(page)); + b.append("/"); + b.append(getPathName(page)); + return b.toGlobalString(); + } + + public GlobalString getHostName(GlobalString page) { + GlobalString http = global new GlobalString("http://"); + GlobalString https = global new GlobalString("https://"); + int beginindex; + int endindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + return getHostName(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + endindex = page.indexOf('/',beginindex+1); + + if ((beginindex == -1)) { + System.printString("ERROR"); + } + if (endindex == -1) + endindex = page.length(); + + return page.subString(beginindex, endindex); + } + + + public GlobalString getPathName(GlobalString page) { + GlobalString http = global new GlobalString("http://"); + GlobalString https = global new GlobalString("https://"); + int beginindex; + int nextindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + GlobalString path = getPath(); + int lastindex = path.lastindexOf('/'); + if (lastindex == -1) + return page; + + GlobalStringBuffer sb = global new GlobalStringBuffer(path.subString(0,lastindex+1)); + sb.append(page); + return sb.toGlobalString(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + nextindex = page.indexOf('/',beginindex+1); + + if ((beginindex == -1) || (nextindex == -1)) + return global new GlobalString("index.html"); + return page.subString(nextindex+1, page.length()); + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/LocalQuery.java b/Robust/src/Benchmarks/Recovery/Spider/recovery/LocalQuery.java new file mode 100644 index 00000000..1beeadbe --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/LocalQuery.java @@ -0,0 +1,95 @@ +public class LocalQuery { + String hostname; + String path; + StringBuffer response; + int depth; + + public LocalQuery(String hostname, String path, int depth) { + this.hostname = new String(hostname); + this.path = new String(path); + response = new StringBuffer(); + this.depth = depth; + } + + public int getDepth() { + return depth; + } + + public String getHostName() { + return hostname; + } + + public String getPath() { + return path; + } + + public void outputFile() { + StringBuffer sb = new StringBuffer(hostname); + sb.append(path); + FileOutputStream fos = new FileOutputStream(sb.toString().replace('/','#')); + fos.write(response.toString().getBytes()); + fos.close(); + } + + public String makewebcanonical(String page) { + StringBuffer b = new StringBuffer(getHostName(page)); + b.append("/"); + b.append(getPathName(page)); + return b.toString(); + } + + public String getHostName(String page) { + String http = new String("http://"); + String https = new String("https://"); + int beginindex; + int endindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + return getHostName(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + endindex = page.indexOf('/',beginindex+1); + + if ((beginindex == -1)) { + System.printString("ERROR"); + } + if (endindex == -1) + endindex = page.length(); + + return page.subString(beginindex, endindex); + } + + public String getPathName(String page) { + String http = new String("http://"); + String https = new String("https://"); + int beginindex; + int nextindex; + + if ((page.indexOf(http) == -1) && (page.indexOf(https) == -1)) { + String path = getPath(); + int lastindex = path.lastindexOf('/'); + if (lastindex == -1) + return page; + + StringBuffer sb = new StringBuffer(path.subString(0,lastindex+1)); + sb.append(page); + return sb.toString(); + } + else if (page.indexOf(https) != -1) { + beginindex = page.indexOf(https) + https.length(); + } + else { + beginindex = page.indexOf(http) + http.length(); + } + nextindex = page.indexOf('/',beginindex+1); + + if ((beginindex==-1) || (nextindex==-1)) + return new String("index.html"); + return page.subString(nextindex+1, page.length()); + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/QueryTask.java b/Robust/src/Benchmarks/Recovery/Spider/recovery/QueryTask.java new file mode 100644 index 00000000..7113e451 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/QueryTask.java @@ -0,0 +1,388 @@ +public class QueryTask extends Task { + int maxDepth; + int maxSearchDepth; + GlobalQueue toprocess; + DistributedHashMap results; + DistributedLinkedList results_list; + DistributedHashMap visitedList; + GlobalString gTitle; + GlobalString workingURL; + + public QueryTask(GlobalQueue todoList, DistributedHashMap visitedList, int maxDepth, int maxSearchDepth, DistributedHashMap results, DistributedLinkedList results_list) { + this.todoList = todoList; + this.visitedList = visitedList; + this.maxDepth = maxDepth; + this.maxSearchDepth = maxSearchDepth; + this.results = results; + this.results_list = results_list; + toprocess = global new GlobalQueue(); + } + + public void execute() { + int depth; + int max; + int maxSearch; + + atomic { + depth = ((GlobalQuery)myWork).getDepth(); + max = this.maxDepth; + maxSearch = this.maxSearchDepth; + } + + if (depth < max) { + /* global variables */ + GlobalQuery gq; + + /* local variables */ + LocalQuery lq; + String hostname; + String path; + String title; + + atomic { + gq = (GlobalQuery)myWork; + hostname = new String(GlobalString.toLocalCharArray(gq.getHostName())); + path = new String(GlobalString.toLocalCharArray(gq.getPath())); + + GlobalStringBuffer gsb = global new GlobalStringBuffer(hostname); + gsb.append("/"); + gsb.append(path); + workingURL = global new GlobalString(gsb.toGlobalString()); + gTitle = null; + } + lq = new LocalQuery(hostname, path, depth); + +/* System.printString("["+lq.getDepth()+"] "); + System.printString("Processing - Hostname : "); + System.printString(hostname); + System.printString(", Path : "); + System.printString(path); + System.printString("\n"); +*/ + if (isDocument(path)) { + return; + } + + Socket s = new Socket(); + + if(s.connect(hostname, 80) == -1) { + return; + } + + requestQuery(hostname, path, s); + readResponse(lq, s); + + if ((title = grabTitle(lq)) != null) { + atomic { + gTitle = global new GlobalString(title); + } + atomic { + toprocess = processPage(lq); + } + } + s.close(); + } + } + + + public static boolean isDocument(String str) { + int index = str.lastindexOf('.'); + + if (index != -1) { + if ((str.subString(index+1)).equals("pdf")) return true; + else if ((str.subString(index+1)).equals("ps")) return true; + else if ((str.subString(index+1)).equals("ppt")) return true; + else if ((str.subString(index+1)).equals("pptx")) return true; + else if ((str.subString(index+1)).equals("jpg")) return true; + else if ((str.subString(index+1)).equals("mp3")) return true; + else if ((str.subString(index+1)).equals("wmv")) return true; + else if ((str.subString(index+1)).equals("doc")) return true; + else if ((str.subString(index+1)).equals("docx")) return true; + else if ((str.subString(index+1)).equals("mov")) return true; + else if ((str.subString(index+1)).equals("flv")) return true; + else if ((str.subString(index+1)).equals("tar")) return true; + else if ((str.subString(index+1)).equals("tgz")) return true; + else return false; + } + return false; + } + + public void done(Object obj) { + if ((gTitle != null) && (gTitle.length() > 0)) { + processedList(); + } + + int searchCnt = 0; + while(!toprocess.isEmpty()) { + GlobalQuery q = (GlobalQuery)toprocess.pop(); + + GlobalString hostname = global new GlobalString(q.getHostName()); + GlobalString path = global new GlobalString(q.getPath()); + + GlobalStringBuffer gsb = global new GlobalStringBuffer(hostname); + gsb.append("/"); + gsb.append(path); + + if (!visitedList.containsKey(gsb.toGlobalString()) && (searchCnt < maxSearchDepth)) { + todoList.push(q); + + GlobalString str = global new GlobalString("1"); + visitedList.put(gsb.toGlobalString(), str); + results_list.add(gsb.toGlobalString()); + searchCnt++; + } + } + } + + public void output() { + String str; + Iterator iter = results_list.iterator(); + + while (iter.hasNext() == true) { + str = ((GlobalString)(iter.next())).toLocalString(); + System.printString(str + "\n"); + } + } + + public static String grabTitle(LocalQuery lq) { + String sBrace = new String("<"); + String strTitle = new String("title>"); + String searchstr = lq.response.toString(); + String title = null; + char ch; + + int mindex = -1; + int endquote = -1; + int i, j; + String tmp; + + for (i = 0; i < searchstr.length(); i++) { + if (searchstr.charAt(i) == '<') { + i++; + if (searchstr.length() > (i+strTitle.length())) { + tmp = searchstr.subString(i, i+strTitle.length()); + if (tmp.equalsIgnoreCase("title>")) { + mindex = i + tmp.length(); + for (j = mindex; j < searchstr.length(); j++) { + if (searchstr.charAt(j) == '<') { + j++; + tmp = searchstr.subString(j, j+strTitle.length()+1); + if (tmp.equalsIgnoreCase("/title>")) { + endquote = j - 1; + break; + } + } + } + } + } + } + } + + if (mindex != -1) { + title = searchstr.subString(mindex, endquote); + if (Character.isWhitespace(title.charAt(0))){ + mindex=0; + while (Character.isWhitespace(title.charAt(mindex++))); + mindex--; + if (mindex >= title.length()) return null; + title = new String(title.subString(mindex)); + } + + if (Character.isWhitespace(title.charAt(title.length()-1))) { + endquote=title.length()-1; + while (Character.isWhitespace(title.charAt(endquote--))); + endquote += 2; + if (mindex >= endquote) return null; + title = new String(title.subString(0, endquote)); + } + + if (isErrorPage(title)) { + return null; + } + } + + return title; + } + + public static boolean isErrorPage(String str) { + if (str.equals("301 Moved Permanently")) + return true; + else if (str.equals("302 Found")) + return true; + else if (str.equals("404 Not Found")) + return true; + else if (str.equals("403 Forbidden")) + return true; + else if (str.equals("404 File Not Found")) + return true; + else + return false; + } + + public static void requestQuery(String hostname, String path, Socket sock) { + StringBuffer req = new StringBuffer("GET "); + req.append("/"); + req.append(path); + req.append(" HTTP/1.0\r\nHost: "); + req.append(hostname); + req.append("\r\n\r\n"); + sock.write(req.toString().getBytes()); + } + + public static void readResponse(LocalQuery lq, Socket sock) { + // state 0 - nothing + // state 1 - \r + // state 2 - \r\n + // state 3 - \r\n\r + // state 4 - \r\n\r\n + byte[] buffer = new byte[1024]; + int numchars; + + do { + numchars = sock.read(buffer); + + String curr = (new String(buffer)).subString(0, numchars); + + lq.response.append(curr); + buffer = new byte[1024]; + } while(numchars > 0); + } + + public void processedList() { + LinkedList ll; + GlobalString token = null; + int mindex = 0; + int endquote = 0; + + while (endquote != -1) { + endquote = gTitle.indexOf(' ', mindex); + + if (endquote != -1) { + token = gTitle.subString(mindex, endquote); + mindex = endquote + 1; + if (filter(token)) { + continue; + } + token = refine(token); + } + else { + token = gTitle.subString(mindex); + token = refine(token); + } + + GlobalQueue q = (GlobalQueue)results.get(token); + if (q == null) { + q = global new GlobalQueue(); + } + q.push(workingURL); + results.put(token, q); + } + } + + public boolean filter(GlobalString str) { + if (str.equals("of")) return true; + else if (str.equals("for")) return true; + else if (str.equals("a")) return true; + else if (str.equals("an")) return true; + else if (str.equals("the")) return true; + else if (str.equals("at")) return true; + else if (str.equals("and")) return true; + else if (str.equals("or")) return true; + else if (str.equals("but")) return true; + else if (str.equals("to")) return true; + else if (str.equals("The")) return true; + else if (str.length() == 1) { + if (str.charAt(0) == '.') return true; + else if (str.charAt(0) == '.') return true; + else if (str.charAt(0) == '-') return true; + else if (str.charAt(0) == '=') return true; + else if (str.charAt(0) == '_') return true; + else if (str.charAt(0) == ':') return true; + else if (str.charAt(0) == ';') return true; + else if (str.charAt(0) == '\'') return true; + else if (str.charAt(0) == '\"') return true; + else if (str.charAt(0) == '|') return true; + else if (str.charAt(0) == '@') return true; + else if (str.charAt(0) == '&') return true; + else if (str.charAt(0) == ' ') return true; + } + else return false; + } + + public GlobalString refine(GlobalString str) { + str = refinePrefix(str); + str = refinePostfix(str); + return str; + } + + public GlobalString refinePrefix(GlobalString str) { + if (str.charAt(0) == '&') { // & + return str.subString(1); + } + else if (str.charAt(0) == '/') { // & + return str.subString(1); + } + return str; + } + + public GlobalString refinePostfix(GlobalString str) { + if (str.charAt(str.length()-1) == ',') { // , + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == ':') { // : + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == ';') { // ; + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == '!') { // ! + return str.subString(0, str.length()-1); + } + else if (str.charAt(str.length()-1) == 's') { // 's + if (str.charAt(str.length()-2) == '\'') + return str.subString(0, str.length()-2); + } + else if (str.charAt(str.length()-1) == '-') { + int index = str.length()-2; + while (Character.isWhitespace(str.charAt(index--))); + return str.subString(0, index+2); + } + return str; + } + + public static GlobalQueue processPage(LocalQuery lq) { + int index = 0; + String href = new String("href=\""); + String searchstr = lq.response.toString(); + int depth; + boolean cont = true; + GlobalQueue toprocess; + + depth = lq.getDepth() + 1; + + toprocess = global new GlobalQueue(); + while(cont) { + int mindex = searchstr.indexOf(href,index); + if (mindex != -1) { + int endquote = searchstr.indexOf('"', mindex+href.length()); + if (endquote != -1) { + String match = searchstr.subString(mindex+href.length(), endquote); + String match2 = lq.makewebcanonical(match); + + GlobalString ghostname; + GlobalString gpath; + + ghostname = global new GlobalString(lq.getHostName(match)); + gpath = global new GlobalString(lq.getPathName(match)); + + if (match2 != null) { + GlobalQuery gq = global new GlobalQuery(ghostname, gpath, depth); + toprocess.push(gq); + } + index = endquote; + } else cont = false; + } else cont = false; + } + return toprocess; + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/Spider.java b/Robust/src/Benchmarks/Recovery/Spider/recovery/Spider.java new file mode 100644 index 00000000..77771683 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/Spider.java @@ -0,0 +1,90 @@ +/* +Usage : + ./Spider.java master +*/ + + +public class Spider { + public static void main(String[] args) { + int NUM_THREADS = 3; + int maxDepth = 3; + int maxSearchDepth = 10; + int i, j; + Work[] works; + QueryTask[] qt; + GlobalQuery[] currentWorkList; + String fm = "www.uci.edu"; + String fp = ""; + + if(args.length != 4) { + System.out.println("./Spider.java master "); + System.exit(0); + } + else { + NUM_THREADS = Integer.parseInt(args[0]); + fm = args[1]; + fp = args[2]; + maxDepth = Integer.parseInt(args[3]); + } + + GlobalString firstmachine; + GlobalString firstpage; + + int mid[] = new int[8]; + mid[0] = (128<<24)|(195<<16)|(180<<8)|21; + mid[1] = (128<<24)|(195<<16)|(180<<8)|26; + mid[2] = (128<<24)|(195<<16)|(180<<8)|24; +/* + mid[0] = (128<<24)|(195<<16)|(136<<8)|162; + mid[1] = (128<<24)|(195<<16)|(136<<8)|163; + mid[2] = (128<<24)|(195<<16)|(136<<8)|164; + mid[3] = (128<<24)|(195<<16)|(136<<8)|165; + mid[4] = (128<<24)|(195<<16)|(136<<8)|166; + mid[5] = (128<<24)|(195<<16)|(136<<8)|167; + mid[6] = (128<<24)|(195<<16)|(136<<8)|168; + mid[7] = (128<<24)|(195<<16)|(136<<8)|169; + */ + atomic { + firstmachine = global new GlobalString(fm); + if (args.length == 3) { + firstpage = global new GlobalString(fp); + } + else + firstpage = global new GlobalString("");; + + works = global new Work[NUM_THREADS]; + qt = global new QueryTask[NUM_THREADS]; + currentWorkList = global new GlobalQuery[NUM_THREADS]; + + GlobalQuery firstquery = global new GlobalQuery(firstmachine, firstpage); + + GlobalQueue todoList = global new GlobalQueue(); + DistributedHashMap visitedList = global new DistributedHashMap(500, 500, 0.75f); + DistributedHashMap results = global new DistributedHashMap(100, 100, 0.75f); + DistributedLinkedList results_list = global new DistributedLinkedList(); + + todoList.push(firstquery); + + for (i = 0; i < NUM_THREADS; i++) { + qt[i] = global new QueryTask(todoList, visitedList, maxDepth, maxSearchDepth, results, results_list); + works[i] = global new Work(qt[i], NUM_THREADS, i, currentWorkList); + } + } + System.printString("Finished to create Objects\n"); + + Work tmp; + for (i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = works[i]; + } + Thread.myStart(tmp, mid[i]); + } + + for (i = 0; i < NUM_THREADS; i++) { + atomic { + tmp = works[i]; + } + tmp.join(); + } + } +} diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/dstm.conf b/Robust/src/Benchmarks/Recovery/Spider/recovery/dstm.conf new file mode 100644 index 00000000..6deb6935 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/dstm.conf @@ -0,0 +1,6 @@ +128.195.180.21 +128.195.180.26 +#128.195.180.24 +#128.195.136.162 +#128.195.136.163 +#128.195.136.164 diff --git a/Robust/src/Benchmarks/Recovery/Spider/recovery/makefile b/Robust/src/Benchmarks/Recovery/Spider/recovery/makefile new file mode 100644 index 00000000..2bb9fd45 --- /dev/null +++ b/Robust/src/Benchmarks/Recovery/Spider/recovery/makefile @@ -0,0 +1,12 @@ +MAINCLASS=Spider +SUBCLASS=Query +SRC1=${MAINCLASS}.java +SRC2=Global${SUBCLASS}.java +SRC3=${SUBCLASS}Task.java +FLAGS= -recoverystats -recovery -dsm -dsmtask -32bit -nooptimize -debug -mainclass ${MAINCLASS} +default: + ../../../../buildscript ${FLAGS} -o ${MAINCLASS} ${SRC2} ${SRC3} ${SRC1} + +clean: + rm -rf tmpbuilddirectory + rm *.bin diff --git a/Robust/src/Benchmarks/Recovery/bm_args.txt b/Robust/src/Benchmarks/Recovery/bm_args.txt index 3aa95998..36796d88 100644 --- a/Robust/src/Benchmarks/Recovery/bm_args.txt +++ b/Robust/src/Benchmarks/Recovery/bm_args.txt @@ -1 +1 @@ -FileSystem:data +Spider:"www.uci.edu" "" 5 diff --git a/Robust/src/Benchmarks/Recovery/runjava.sh b/Robust/src/Benchmarks/Recovery/runjava.sh index d5e22949..7adb5eaa 100755 --- a/Robust/src/Benchmarks/Recovery/runjava.sh +++ b/Robust/src/Benchmarks/Recovery/runjava.sh @@ -1,5 +1,7 @@ # !/bin/sh BASEDIR=`pwd` +RECOVERYDIR='recovery' +JAVASINGLEDIR='java' ITERATIONS=10 WAITTIME=300 @@ -31,9 +33,9 @@ function runMachines { let "k= $NUM_MACHINE" echo ${BASEDIR}/${BM_DIR} > ~/.tmpdir - DIR=`echo ${BASEDIR}\/${BM_DIR}`; + DIR=`echo ${BASEDIR}\/${BM_DIR}\/${RECOVERYDIR}`; echo "DIR = $DIR"; - + # Run machines while [ $k -gt 1 ]; do echo "SSH into dc-${k}"