updates
authornavid <navid>
Thu, 8 Jan 2009 01:06:38 +0000 (01:06 +0000)
committernavid <navid>
Thu, 8 Jan 2009 01:06:38 +0000 (01:06 +0000)
Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/benchmark.java
Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/thread1.java
Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java
Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java

index c08091c136a6f301420bcf785039db3b59f91752..4d9702317ff9e46624b17a54aa246b2716a89178 100644 (file)
@@ -51,9 +51,13 @@ public class benchmark {
         try {
             byte[] data = new byte[1];
             char[] name = new char[20];
-            RandomAccessFile file = new RandomAccessFile("/scratch/TransactionalIO/FinancialTransactionBenchmarkFiles/namelist.text", "rw");
+            /*RandomAccessFile file = new RandomAccessFile("/scratch/TransactionalIO/FinancialTransactionBenchmarkFiles/namelist.text", "rw");
             RandomAccessFile file2 = new RandomAccessFile("/scratch/TransactionalIO/FinancialTransactionBenchmarkFiles/financialtransaction.text", "rw");
-            RandomAccessFile file3 = new RandomAccessFile("/scratch/TransactionalIO/FinancialTransactionBenchmarkFiles/accountbalance.text", "rw");
+            RandomAccessFile file3 = new RandomAccessFile("/scratch/TransactionalIO/FinancialTransactionBenchmarkFiles/accountbalance.text", "rw");*/
+            RandomAccessFile file = new RandomAccessFile("/home/navid/namelist.text", "rw");
+            RandomAccessFile file2 = new RandomAccessFile("/home/navid/financialtransaction.text", "rw");
+            RandomAccessFile file3 = new RandomAccessFile("/home/navid/accountbalance.text", "rw");
+            
             
            
           stocks  = new String[20];
@@ -192,9 +196,61 @@ public class benchmark {
 
 
 
-           preparenamelist();
+            preparenamelist();
             count = 0;
             m = Collections.synchronizedMap(TransactionalFiles);
+            TransactionalFile tr = new TransactionalFile("/home/navid/randomwords.text", "rw");
+            m.put(String.valueOf(count), tr);
+            count++;
+            TransactionalFile tr2 = new TransactionalFile("/home/navid/input.text", "rw");
+            m.put(String.valueOf(count), tr2);
+            count++;
+            TransactionalFile tr3 = new TransactionalFile("/home/navid/iliad.text", "rw");
+            m.put(String.valueOf(count), tr3);
+            count++;
+            TransactionalFile tr4 = new TransactionalFile("/home/navid/counter_benchmark_output.text", "rw");
+            m.put(String.valueOf(count), tr4);
+            count++;
+
+            TransactionalFile tr5 = new TransactionalFile("/home/navid/financialtransaction.text", "rw");
+            m.put(String.valueOf(count), tr5);
+
+            count++;
+
+            TransactionalFile tr6 = new TransactionalFile("/home/navid/accountbalance.text", "rw");
+            m.put(String.valueOf(count), tr6);
+
+            count++;
+
+            TransactionalFile tr7 = new TransactionalFile("/home/navid/financialtransactionlog.text", "rw");
+            m.put(String.valueOf(count), tr7);
+
+            count++;
+
+            RandomAccessFile tr8 = new RandomAccessFile("/home/navid/accountbalance.text", "rw");
+            m.put(String.valueOf(count), tr8);
+//
+            count++;
+
+            RandomAccessFile tr9 = new RandomAccessFile("/home/navid/financialtransactionlog.text", "rw");
+            m.put(String.valueOf(count), tr9);
+
+            count++;
+
+            int index = 97;
+            for (int i = 0; i < 26; i++) {
+                     
+                //m.put(String.valueOf((char) (index+i)), new RandomAccessFile("/home/navid/" + String.valueOf((char) (index+i)) + ".text", "rw"));
+           
+                      m.put(String.valueOf((char) (index+i)), new TransactionalFile("/home/navid/" + String.valueOf((char) (index+i)) + ".text", "rw"));
+
+                           count++;
+            }
+                 
+               
+            m.put(100, new RandomAccessFile("/home/navid/counter_benchmark_output.text", "rw"));   
+            /*count = 0;
+            m = Collections.synchronizedMap(TransactionalFiles);
             TransactionalFile tr = new TransactionalFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/randomwords.text", "rw");
             m.put(String.valueOf(count), tr);
             count++;
@@ -238,11 +294,13 @@ public class benchmark {
            
             m.put(String.valueOf((char) (index+i)), new TransactionalFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/"
 + String.valueOf((char) (index+i)) + ".text", "rw"));
-                count++;
-            /*   m.put(String.valueOf((char) (index+i)), new RandomAccessFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/"
+                //count++;*/
+          /*     m.put(String.valueOf((char) (index+i)), new RandomAccessFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/"
 + String.valueOf((char) (index+i)) + ".text", "rw"));
                 count++;*/
-            }
+            //}
+           
+           
             count = 0;
             m2 = Collections.synchronizedMap(hotwords);
             m2.put(Integer.valueOf(count), "Polydamas");
index fe63b8a46eec3c0b1df2c3e15832411495c5ac73..2d410d9b99210e8dc5f1fa6f3d9da2894844ab6b 100644 (file)
@@ -62,7 +62,7 @@ public class thread1 implements TransactionalProgram{
                 f1 = (TransactionalFile)benchmark.m.get("0");
             byte[] b = new byte[20];
             byte[] data = new byte[1];
-            char[] holder = new char[40];
+            char[] holder = new char[30];
    
             
            long toseek = (Integer.valueOf(Thread.currentThread().getName().substring(7)))%20 * 20448; 
@@ -95,394 +95,6 @@ public class thread1 implements TransactionalProgram{
                     Logger.getLogger(thread1.class.getName()).log(Level.SEVERE, null, ex);
                 }
            }
-        
-          
-           // for (int k=0; k< i; k++)
-           //     System.out.println(Thread.currentThread() + " " +holder[k]);
-          //  f1.seek(40);
-          //  System.out.println("current offset " +f1.getFilePointer());
-          //  f1.write(b);
-          //  f1.write(b);
-            
-            
-          //  f1.write(b);
-            //
-          
-          
-          /*  for (int i =0; i< 2000; i++){
-                
-                String str = "Number: " + (Integer.valueOf(Thread.currentThread().getName().substring(7))*200+i) +"\nType: " + v.get((int)(Math.random()*6)) + "\n\n";
-                byte[] buff; 
-                char[] charar =  new char[str.length()];
-                charar = str.toCharArray();
-                buff = new byte[str.length()];
-                for (int j=0; j<str.length(); j++)
-                    buff[j] = (byte) charar[j];
-                
-                f1.write(buff);
-            }*/
-            
-      /*      f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-          //  f1.seek(0);
-           // f1.seek(0);
-         //   f1.getFilePointer();
-           // synchronized(benchmark.lock){
-              //   /*System.out.println(Thread.currentThread() +" 1-offset " + *///f1.getFilePointer();
-            //}
-          //      synchronized(benchmark.lock){
-          // f1.getFilePointer();
-            //   }
-           /// f1.read(bread);
-    /*        f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);*/
-            /*f1.read(bread);
-           // f1.seek(0);
-            
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);*/
-            
-          /*  f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);
-            f1.write(b);*/
-         //   f1.seek(0);
-          //  f1.read(bread2);
-          /*  synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread2[j]); 
-                }*/
-           // f1.read(bread);
-               /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-           //f1.read(bread);
-            //*synchronized(benchmark.lock){
-       //         for (int j =0; j<20; j++)
-          //          System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-          //      }*/
-             //  f1.read(bread);
-           /*    synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-               //  f1.read(bread);
-           /*      synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-             //f1.read(bread);
-       /*      synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-              //f1.read(bread);
-              /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-               //f1.read(bread);
-               /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-               /*
-               f1.read(bread);
-                 f1.read(bread2);
-            f1.read(bread);
-            f1.read(bread);
-               f1.read(bread);
-                 f1.read(bread2);
-             f1.read(bread);
-              f1.read(bread);
-               f1.read(bread);
-               f1.read(bread);
-            
-                 f1.read(bread2);
-            f1.read(bread);
-            f1.read(bread);
-               f1.read(bread);
-                 f1.read(bread2);
-             f1.read(bread);
-              f1.read(bread);
-               f1.read(bread);
-               f1.read(bread);
-            
-            
-             
-           // f1.seek(0);
-          /*      synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }
-                 synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread2[j]); 
-                }
-            */
-           /* synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 2-offset " + f1.getFilePointer());
-            }*/
-            /*f1.write(b);
-            f1.write(b);
-           // f1.seek(0);
-           
-            f1.write(b);
-            f1.write(b);*/
-            
-            
-             /* synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 3-offset " + f1.getFilePointer());
-            }*/
-           // f1.seek(50);
-           /* synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 4-offset " + f1.getFilePointer());
-            }*/
-               // f1.read(bread);
-            /*    synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]); 
-                }*/
-               // f1.read(bread);
-                /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);
-                }*/
-               // f1.read(bread);
-                /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);
-                }*/
-               // f1.read(bread);
-                /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);
-                }*/
-                
-                //f1.read(bread);
-                /*synchronized(benchmark.lock){
-                for (int j =0; j<20; j++)
-                    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);
-                }*/
-            /*  synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 5-offset " + f1.getFilePointer());
-            }*/
-            //System.out.println("offset " + f1.getFilePointer());
-           /* for (int j =0; j<20; j++)
-                System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);*/
-           /* f1.read(bread);
-            System.out.println("offset " + f1.getFilePointer());*/
-           // for (int j =0; j<20; j++)
-            //    System.out.println(j+1 + "-" +Thread.currentThread() + "   " + (char)bread[j]);
-          //  f1.write(b);
-         /*    synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 6-offset " + f1.getFilePointer());
-            }*/
-            //f1.read(bread);
-            /*  synchronized(benchmark.lock){
-                 System.out.println(Thread.currentThread() +" 5-offset " + f1.getFilePointer());
-            }*/
-           // System.out.println("offset " + f1.getFilePointer());
-            /*f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);
-            f1.read(bread);*/
-           // f1.write(b);
-           // f1.write(b);
-            
-         
-        
-          //  f1.seek(40);
-            
-            //   for (int j =0; j<10; j++)
-            //    System.out.println((char) b[j]);
-
-//        } catch (IOException ex) {
-   //       Logger.getLogger(thread1.class.getName()).log(Level.SEVERE, null, ex);
-   //     }
-       // TransactionalFile f1 = new TransactionalFile("/home/navid/output1.txt", "rw");
-       // TransactionalFile f1 = new TransactionalFile("/home/navid/output1.txt", "rw");
-       // TransactionalFile f1 = new TransactionalFile("/home/navid/output1.txt", "rw");
     }
     
 
index 916298e53662e6c242250d96c4ae4ae55a5abdb1..79f3f086ec229159011a51f2e0712e9dff663696 100644 (file)
@@ -38,7 +38,7 @@ import java.util.logging.Logger;
  */
 public class ExtendedTransaction implements TransactionStatu {
 
-    private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd);
+    private static native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd);
     
 
     {
@@ -73,6 +73,13 @@ public class ExtendedTransaction implements TransactionStatu {
     private ContentionManager contentionmanager;
     private volatile Status status;
     private int id;
+    
+    
+    public ReentrantLock[] toholoffsetlocks;
+    public int offsetcount = 0;
+    
+    public Lock[] toholdblocklocks;
+    public int blockcount = 0;
 
     public ExtendedTransaction() {
         //  super();
@@ -97,7 +104,7 @@ public class ExtendedTransaction implements TransactionStatu {
         this.memorystate = memorystate;
     }
 
-    private int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) {
+    public static int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) {
         try {
             return nativepwrite(buff, offset, buff.length, file.getFD());
         } catch (IOException ex) {
@@ -203,24 +210,40 @@ public class ExtendedTransaction implements TransactionStatu {
 
     public boolean lockOffsets() {   /// Locking offsets for File Descriptors
 
-
+      //  toholoffsetlocks = new ReentrantLock[30];
+        
         TreeMap hm = getSortedFileAccessMap(AccessedFiles);
         Iterator iter = hm.keySet().iterator();
-        
+        offsetcount = 0;
         while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) {
             INode key = (INode) iter.next();
             Vector vec = (Vector) AccessedFiles.get(key);
+            
+       /*     if (vec.size() == 1){
+                TransactionalFile tf = ((TransactionalFile)vec.firstElement());
+                tf.offsetlock.lock();
+             //   toholoffsetlocks[offsetcount] = tf.offsetlock;
+            //   offsetcount++;
+                heldoffsetlocks.add(tf.offsetlock);
+                continue;
+            }*/
+            
             Collections.sort(vec);
             Iterator it = vec.iterator();
-            while (it.hasNext() && this.getStatus() == Status.ACTIVE) {
+            while (it.hasNext() /*&& this.getStatus() == Status.ACTIVE*/) {
                 TransactionalFile value = (TransactionalFile) it.next();
-                value.offsetlock.lock();
+               value.offsetlock.lock();
+             //   toholoffsetlocks[offsetcount] = value.offsetlock;
+            //    offsetcount++;
                 heldoffsetlocks.add(value.offsetlock);
                 break;
             }
         }
 
         if (this.getStatus() != Status.ACTIVE) {
+         //   for (int j=0; j<offsetcount; j++){
+         //       heldoffsetlocks.add(toholoffsetlocks[j]);
+         //   }
             return false;
         }
         return true;
@@ -237,6 +260,8 @@ public class ExtendedTransaction implements TransactionStatu {
         }
         
         lock.lock();
+      //  toholdblocklocks[blockcount] = lock;
+      //  blockcount++;
         heldblocklocks.add(lock);
         return true;
        
@@ -308,10 +333,11 @@ public class ExtendedTransaction implements TransactionStatu {
 
         }
         
+        //toholdblocklocks = new Lock[100];
         
         Iterator it = this.getAccessedBlocks().keySet().iterator();
         BlockDataStructure[] blocks = new BlockDataStructure[100];
-        if (this.getStatus() == Status.ACTIVE)
+        //if (this.getStatus() == Status.ACTIVE)
             while (it.hasNext() /*&& (this.getStatus() == Status.ACTIVE)*/) {
                 INode inode = (INode) it.next();
                 GlobalINodeState inodestate = TransactionalFileWrapperFactory.getTateransactionalFileINodeState(inode);
@@ -327,7 +353,8 @@ public class ExtendedTransaction implements TransactionStatu {
             }
 
         if (this.getStatus() != Status.ACTIVE) {
-
+        //    for (int i=0; i<blockcount; i++)
+        //        heldblocklocks.add(toholdblocklocks[i]); 
             throw new AbortedException();
         }
         abortAllReaders();
@@ -341,7 +368,7 @@ public class ExtendedTransaction implements TransactionStatu {
         Iterator it;
         WriteOperations writeop;
         Vector vec;
-        while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) {
+        while (iter.hasNext()) {
             INode key = (INode) iter.next();
 
             vec = (Vector) hm.get(key);
@@ -366,6 +393,14 @@ public class ExtendedTransaction implements TransactionStatu {
             TransactionalFile trf = (TransactionalFile) (k.next());
             trf.getCommitedoffset().setOffsetnumber(((TransactionLocalFileAttributes) GlobaltoLocalMappings.get(trf)).getLocaloffset());
         }
+        
+        
+      /*  for (int i =0; i<blockcount; i++){
+            toholdblocklocks[i].unlock();
+        }
+        for (int i =0; i<offsetcount; i++){
+            toholoffsetlocks[i].unlock();
+        }*/
     }
 
     public void unlockAllLocks() {
@@ -376,14 +411,14 @@ public class ExtendedTransaction implements TransactionStatu {
             Lock lock = (Lock) it.next();
             lock.unlock();
         }
-   //     heldblocklocks.clear();
+        heldblocklocks.clear();
 
         it = heldoffsetlocks.iterator();
         while (it.hasNext()) {
             ReentrantLock lock = (ReentrantLock) it.next();
             lock.unlock();
         }
-    //    heldoffsetlocks.clear();
+        heldoffsetlocks.clear();
     }
 
     public void abortAllReaders() {
index b0723a73ea890c7c9029712f8c05a87f63e66439..547fd416e4034867a2efb73f2490ebab22710400 100644 (file)
@@ -23,7 +23,10 @@ import java.util.Iterator;
 import java.util.TreeMap;
 import java.util.Vector;
 import java.util.concurrent.locks.Lock;
+
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -53,7 +56,46 @@ public class TransactionalFile implements Comparable {
     public ReentrantLock offsetlock;
     private GlobalOffset committedoffset;
     private GlobalINodeState inodestate;
+    Lock[] locks;
+
+    public TransactionalFile(File f, String mode) {
+        
+        if ((!(f.exists()))) {
+            to_be_created = true;
+            file = null;
+
+        } else {
+
+            try {
+
+                offsetlock = new ReentrantLock();
+                file = new RandomAccessFile(f, mode);
+            } catch (FileNotFoundException ex) {
+
+                Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
+            }
+
+        }
+        inode = TransactionalFileWrapperFactory.getINodefromFileName(f.getAbsolutePath());
+        inodestate = TransactionalFileWrapperFactory.createTransactionalFile(inode, f.getAbsolutePath(), mode);
+
+
+        sequenceNum = inodestate.seqNum;
+        inodestate.seqNum++;
+
+        if (mode.equals("rw")) {
+            writemode = true;
+        } else if (mode.equals("a")) {
+            appendmode = true;
+        }
 
+        if (inodestate != null) {
+            synchronized (inodestate) {
+                committedoffset = new GlobalOffset(0);
+            }
+        }
+    }
+    
     public TransactionalFile(String filename, String mode) {
 
 
@@ -229,11 +271,10 @@ public class TransactionalFile implements Comparable {
             return non_Transactional_Read(b);
         }
 
-        if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
+        if (!(me.getGlobaltoLocalMappings().containsKey(this))) { // if this is the first time the file is accessed by the transcation
             me.addFile(this, 0);
         }
 
-        // if (me.getGlobaltoLocalMappings().containsKey(this)) {
 
         TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
         tmp.setUnknown_inital_offset_for_write(false);
@@ -455,6 +496,7 @@ public class TransactionalFile implements Comparable {
 
     private void markAccessedBlocks(ExtendedTransaction me, long loffset, int size, BlockAccessModesEnum mode) {
 
+
         TreeMap map;
 
         if (me.getAccessedBlocks().get(this.getInode()) != null) {
@@ -463,8 +505,8 @@ public class TransactionalFile implements Comparable {
             map = new TreeMap();
             me.getAccessedBlocks().put(this.inode, map);
         }
-        int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(loffset);
-        int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(loffset, size);
+        int startblock = (int) ((loffset / Defaults.FILEFRAGMENTSIZE));//FileBlockManager.getCurrentFragmentIndexofTheFile(loffset);
+        int targetblock = (int) (((size + loffset) / Defaults.FILEFRAGMENTSIZE));//FileBlockManager.getTargetFragmentIndexofTheFile(loffset, size);
         for (int i = startblock; i <= targetblock; i++) {
             if (map.get(Integer.valueOf(i)) == null) {
                   map.put(Integer.valueOf(i), mode);
@@ -482,12 +524,17 @@ public class TransactionalFile implements Comparable {
         int end =(int) (((tmp.getLocaloffset() + readdata.length) / Defaults.FILEFRAGMENTSIZE));
 
         BlockDataStructure block = null;
+        
+        Lock[] locks = new Lock[end -st +1];
+        
         int k;
+        //int cou = st;
 
-        for (k = st; k <= end && me.getStatus() == Status.ACTIVE; k++) {
+        for (k = st; k <= end /*&& me.getStatus() == Status.ACTIVE*/; k++) {
             block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
-
             block.getLock().readLock().lock();
+            
+          //  locks[k-st] = block.getLock().readLock();
             if (!(block.getReaders().contains(me))) {
                 block.getReaders().add(me);
             }
@@ -497,9 +544,12 @@ public class TransactionalFile implements Comparable {
         //whether this improves performance
         if (k<=end) {
             //We aborted here if k is less than or equal to end
+            me.blockcount = k - st;
             for (int i = st; i < k; i++) {
-                block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
-                me.getHeldblocklocks().add(block.getLock().readLock());
+               // block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
+               me.getHeldblocklocks().add(block.getLock().readLock());
+                //me.toholdblocklocks[i-st] = this.inodestate.getBlockDataStructure(Integer.valueOf(i)).getLock().readLock();
+               // me.getHeldblocklocks().add(locks[i-st]);
             }
             throw new AbortedException();
         }
@@ -516,9 +566,12 @@ public class TransactionalFile implements Comparable {
 
         //Needed to make sure that transaction only sees consistent data
         if (me.getStatus() == Status.ABORTED) {
+            me.blockcount = end - st + 1;
             for (int i = st; i <= end; i++) {
                 block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
+               // me.toholdblocklocks[i-st] = this.inodestate.getBlockDataStructure(Integer.valueOf(i)).getLock().readLock();
                 me.getHeldblocklocks().add(block.getLock().readLock());
+              //  me.getHeldblocklocks().add(locks[i-st]);
             }
             throw new AbortedException();
         }
@@ -527,6 +580,7 @@ public class TransactionalFile implements Comparable {
         for (k = st; k <= end; k++) {
             block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
             block.getLock().readLock().unlock();
+            //locks[k-st].unlock();
         }
         return size;
     }
@@ -686,42 +740,50 @@ public class TransactionalFile implements Comparable {
         offsetlock.lock();
         int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
         int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), data.length);
+        
+        
+        WriteLock[] blocksar;
+        blocksar = new WriteLock[targetblock-startblock+1];
         for (int i = startblock; i <= targetblock; i++) {
             BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
             block.getLock().writeLock().lock();
-            heldlocks.add(block.getLock().writeLock());
-
+            blocksar[i-startblock] = block.getLock().writeLock();
+            //heldlocks.add(block.getLock().writeLock());
         }
 
         try {
-            invokeNativepwrite(data, committedoffset.getOffsetnumber(), data.length, file);
+            ExtendedTransaction.invokeNativepwrite(data, committedoffset.getOffsetnumber(), data.length, file);
             //file.seek(committedoffset.getOffsetnumber());
             //file.write(data);
             committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() + data.length);
 
-        //} catch (IOException ex) {
-        //  Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
-            unlockLocks(heldlocks);
+         //   unlockLocks(heldlocks);
+            for (int i = startblock; i <= targetblock; i++) {
+                blocksar[i-startblock].unlock();
+            }
             offsetlock.unlock();
         }
     }
 
     public int non_Transactional_Read(byte[] b) {
         int size = -1;
-        Vector heldlocks = new Vector();
-        boolean flag = true;
+
+        
         offsetlock.lock();
+        
         int startblock;
         int targetblock;
         startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
         targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), size);
 
-
+        ReadLock[] blocksar;
+        blocksar = new ReadLock[targetblock-startblock+1];
+        
         for (int i = startblock; i <= targetblock; i++) {
             BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
             block.getLock().readLock().lock();
-            heldlocks.add(block.getLock().readLock());
+            blocksar[i-startblock] = block.getLock().readLock();
         }
 
         size = invokeNativepread(b, committedoffset.getOffsetnumber(), b.length);
@@ -735,8 +797,12 @@ public class TransactionalFile implements Comparable {
             }
             committedoffset.getOffsetReaders().clear();
         }
-
-        unlockLocks(heldlocks);
+        
+        for (int i = startblock; i <= targetblock; i++) {
+            blocksar[i-startblock].unlock();
+        }
+        
+        //unlockLocks(heldlocks);
         offsetlock.unlock();
         if (size == 0) {
             size = -1;