*** empty log message ***
[IRC.git] / Robust / Transactions / TransactionalIO / src / TransactionalIO / core / TransactionalFile.java
index 8c4a31a7a721f04feb3a84db59602cc7a6dddf2c..2e460d66cd0115d56c543e0df91c712e1eee490e 100644 (file)
@@ -4,8 +4,6 @@
  */
 package TransactionalIO.core;
 
-
-
 import TransactionalIO.Utilities.Range;
 import TransactionalIO.exceptions.AbortedException;
 import TransactionalIO.exceptions.PanicException;
@@ -22,32 +20,26 @@ import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.SortedSet;
 import java.util.TreeMap;
-import java.util.TreeSet;
 import java.util.Vector;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import sun.misc.ConditionLock;
 
 /**
  *
  * @author navid
  */
+public class TransactionalFile implements Comparable {
 
-
-public class TransactionalFile implements Comparable{
-
-    
     private native int nativepread(byte buff[], long offset, int size, FileDescriptor fd);
+    private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd);
     
+
     {
         System.load("/home/navid/libkooni.so");
     }
-    
-    
     public RandomAccessFile file;
     private INode inode;
     private int sequenceNum = 0;
@@ -59,14 +51,13 @@ public class TransactionalFile implements Comparable{
     public boolean appendmode = false;
     public ReentrantLock offsetlock;
     private GlobalOffset committedoffset;
-    private GlobalINodeState inodestate ;
-    
-    
+    private GlobalINodeState inodestate;
+
     public TransactionalFile(String filename, String mode) {
-        
-       
+
+
         File f = new File(filename);
-  
+
         if ((!(f.exists()))) {
             to_be_created = true;
             file = null;
@@ -78,18 +69,18 @@ public class TransactionalFile implements Comparable{
                 offsetlock = new ReentrantLock();
                 file = new RandomAccessFile(f, mode);
             } catch (FileNotFoundException ex) {
+
                 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
             }
-      
+
         }
         inode = TransactionalFileWrapperFactory.getINodefromFileName(filename);
         inodestate = TransactionalFileWrapperFactory.createTransactionalFile(inode, filename, mode);
-        
-        
+
+
         sequenceNum = inodestate.seqNum;
         inodestate.seqNum++;
+
         if (mode.equals("rw")) {
             writemode = true;
         } else if (mode.equals("a")) {
@@ -98,30 +89,38 @@ public class TransactionalFile implements Comparable{
 
         if (inodestate != null) {
             synchronized (inodestate) {
-                 committedoffset = new GlobalOffset(0);
+                committedoffset = new GlobalOffset(0);
             }
         }
-        
-                
+
+
     }
 
     private int invokeNativepread(byte buff[], long offset, int size) {
         try {
             return nativepread(buff, offset, size, file.getFD());
         } catch (IOException ex) {
-            
+
             Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
             return -1;
         }
-        
+
+    }
+      public int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) {
+        try {
+            return nativepwrite(buff, offset, buff.length, file.getFD());
+        } catch (IOException ex) {
+
+            Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
+            return -1;
+        }
+
     }
 
-    
     public int getSequenceNum() {
         return sequenceNum;
     }
 
-    
     public GlobalOffset getCommitedoffset() {
         return committedoffset;
     }
@@ -142,80 +141,77 @@ public class TransactionalFile implements Comparable{
         }
     }
 
-    public long getFilePointer(){
-        
+    public long getFilePointer() {
+
         ExtendedTransaction me = Wrapper.getTransaction();
         TransactionLocalFileAttributes tmp = null;
-        
+
         if (me == null) {
             return non_Transactional_getFilePointer();
         }
-        
-        if (!(me.getGlobaltoLocalMappings().containsKey(this))){
-                me.addFile(this, 0);
+
+        if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
+            me.addFile(this, 0);
         }
-        
+
         tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
-        if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)){   
-             tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
-
-             long target;
-             lockOffset(me);
-                    if (!(this.committedoffset.getOffsetReaders().contains(me))){
-                        this.committedoffset.getOffsetReaders().add(me);
-            
-                    }
-             
-                    tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
-                    target = this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset();
-                    
-                    
-             offsetlock.unlock();         
-             Iterator it;
+        if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)) {
+            tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
+
+            long target;
+            lockOffset(me);
+
+            if (!(this.committedoffset.getOffsetReaders().contains(me))) {
+                this.committedoffset.getOffsetReaders().add(me);
+
+            }
+
+            tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
+            target = this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset();
+
+
+            offsetlock.unlock();
+            Iterator it;
+
+            if ((me.getWriteBuffer().get(inode)) != null) {
 
-             if ((me.getWriteBuffer().get(inode)) != null)
-             {
-                
                 it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
-                while (it.hasNext()){
+                while (it.hasNext()) {
                     WriteOperations wrp = (WriteOperations) it.next();
-                    if (wrp.getBelongingto()== tmp && wrp.isUnknownoffset())
+                    if (wrp.getBelongingto() == tmp && wrp.isUnknownoffset()) {
                         wrp.setUnknownoffset(false);
-                        wrp.getRange().setStart(target + wrp.getRange().getStart());
-                        wrp.getRange().setEnd(target + wrp.getRange().getEnd());
-                }   
-             }
-  
+                    }
+                    wrp.getRange().setStart(target + wrp.getRange().getStart());
+                    wrp.getRange().setEnd(target + wrp.getRange().getEnd());
+                }
+            }
+
         }
-        
-       
+
+
         tmp.setUnknown_inital_offset_for_write(false);
         return tmp.getLocaloffset();
     }
-    
+
     public void seek(long offset) {
 
         ExtendedTransaction me = Wrapper.getTransaction();
-        
+
         if (me == null) {
             non_Transactional_Seek(offset);
             return;
-        }
-        
-        else {
-           TransactionLocalFileAttributes tmp = null;
-            if (!(me.getGlobaltoLocalMappings().containsKey(this))){
+        } else {
+            TransactionLocalFileAttributes tmp = null;
+            if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
                 me.addFile(this, offset);
             }
             tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
-            
-            if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)
+
+            if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) {
                 tmp.setOffsetdependency(OffsetDependency.NO_DEPENDENCY);
-            
-            else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1)
+            } else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) {
                 tmp.setOffsetdependency(OffsetDependency.WRITE_DEPENDENCY_2);
-            
+            }
             tmp.setUnknown_inital_offset_for_write(false);
             tmp.setLocaloffset(offset);
         }
@@ -228,50 +224,53 @@ public class TransactionalFile implements Comparable{
         int size = b.length;
         int result = 0;
         if (me == null) {  // not a transaction, but any I/O operation even though within a non-transaction is considered a single opertion transactiion 
+
             return non_Transactional_Read(b);
         }
+        if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
+            me.addFile(this, 0);
+        }
         
-        if (me.getGlobaltoLocalMappings().containsKey(this)){
-      
+        if (me.getGlobaltoLocalMappings().containsKey(this)) {
+
             TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
             tmp.setUnknown_inital_offset_for_write(false);
-            
+
             OffsetDependency dep = tmp.getOffsetdependency();
-            if ((dep == OffsetDependency.WRITE_DEPENDENCY_1) || 
-                    (dep == OffsetDependency.NO_ACCESS) || 
-                    (dep == OffsetDependency.WRITE_DEPENDENCY_2))
-            {
-               tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);  
-               lockOffset(me);
-               
-                    if (dep != OffsetDependency.WRITE_DEPENDENCY_2){     
-                        tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset()); 
-                    }
-                    
-                    if (!(this.committedoffset.getOffsetReaders().contains(me))){
-                        this.committedoffset.getOffsetReaders().add(me);
-               
-                    }
-               
-               offsetlock.unlock();
+            if ((dep == OffsetDependency.WRITE_DEPENDENCY_1) ||
+                    (dep == OffsetDependency.NO_ACCESS) ||
+                    (dep == OffsetDependency.WRITE_DEPENDENCY_2)) {
+                tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
+                lockOffset(me);
+
+                if (dep != OffsetDependency.WRITE_DEPENDENCY_2) {
+                    tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
+                }
+
+                if (!(this.committedoffset.getOffsetReaders().contains(me))) {
+                    this.committedoffset.getOffsetReaders().add(me);
+
+                }
+
+                offsetlock.unlock();
             }
-            
-            
+
+
             makeWritestDependent(me);
-    
-            
-            if ((Boolean)me.merge_for_writes_done.get(inode) == Boolean.FALSE){
-                 mergeWrittenData(me);
+
+
+            if ((Boolean) me.merge_for_writes_done.get(inode) == Boolean.FALSE) {
+                mergeWrittenData(me);
             }
-               
+
             long loffset = tmp.getLocaloffset();
             markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.READ);
-   
+
 
             Vector writebuffer;
-            if ((me.getWriteBuffer().get(this.inode)) != null)
+            if ((me.getWriteBuffer().get(this.inode)) != null) {
                 writebuffer = (Vector) (me.getWriteBuffer().get(this.inode));
-            else {
+            else {
                 writebuffer = new Vector();
                 me.getWriteBuffer().put(this.inode, writebuffer);
             }
@@ -279,14 +278,14 @@ public class TransactionalFile implements Comparable{
             Range writerange = null;
             Range[] intersectedrange = new Range[writebuffer.size()];
             WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()];
-            
+
             int counter = 0;
             boolean in_local_buffer = false;
-            
-                    
+
+
             Iterator it = writebuffer.iterator();
             while (it.hasNext()) {
-                
+
                 WriteOperations wrp = (WriteOperations) it.next();
                 writerange = wrp.getRange();
                 if (writerange.includes(readrange)) {
@@ -298,23 +297,23 @@ public class TransactionalFile implements Comparable{
                 if (writerange.hasIntersection(readrange)) {
                     intersectedrange[counter] = readrange.intersection(writerange);
                     markedwriteop[counter] = wrp;
-                   
+
                     counter++;
                 }
             }
 
             if (in_local_buffer) { // the read one from local buffer
-                result = readFromBuffer(b, tmp, markedwriteop[counter],writerange);    
+
+                result = readFromBuffer(b, tmp, markedwriteop[counter], writerange);
                 return result;
-            }
-            
-            else{
                 
+            } else {
+
                 if (counter == 0) { // all the read straight from file
+
                     result = readFromFile(me, b, tmp);
-                }
-                
-                else {    // some parts from file others from buffer
+                } else {    // some parts from file others from buffer
+
                     for (int i = 0; i < counter; i++) {
                         Byte[] data = markedwriteop[i].getData();
                         byte[] copydata = new byte[data.length];
@@ -337,72 +336,76 @@ public class TransactionalFile implements Comparable{
                         }
                     }
 
-                    lockOffset(me);
+                  //  lockOffset(me);
+                    
                     me.getHeldoffsetlocks().add(offsetlock);
                     boolean locked = false;
                     BlockDataStructure block;
                     for (int k = 0; k < occupiedblocks.size(); k++) {   // locking the block locks
-                    
-                       while (me.getStatus() == Status.ACTIVE) {                          
-                            block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
+
+                        while (me.getStatus() == Status.ACTIVE) {
+                            block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
+
                             block.getLock().readLock().lock();
-                                if (!(block.getReaders().contains(me))){
-                                    block.getReaders().add(me);
-                                 }
-                                 locked = true;
-                                 //me.getHeldblocklocks().add(block.getLock().readLock());
-                                 break;
-                       }
-                       if (me.getStatus() == Status.ABORTED) {
-                           int m;
-                           if (locked) {
-                               m = k + 1;
-                           } else {
-                               m = k;
-                           }
-                           for (int i = 0; i < m; i++) {
-                               block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));
-                               me.getHeldblocklocks().add(block.getLock().readLock());
-                           }
-
-                           locked = false;
-                           throw new AbortedException();
+                            if (!(block.getReaders().contains(me))) {
+                                block.getReaders().add(me);
+                            }
+                            locked = true;
+                            //me.getHeldblocklocks().add(block.getLock().readLock());
+                            break;
+                        }
+                        if (me.getStatus() == Status.ABORTED) {
+                            int m;
+                            if (locked) {
+                                m = k + 1;
+                            } else {
+                                m = k;
+                            }
+                            for (int i = 0; i < m; i++) {
+                                block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));
+                                me.getHeldblocklocks().add(block.getLock().readLock());
+                            }
+
+                            locked = false;
+                            throw new AbortedException();
                         }
                     }
-                   
+
                     for (int i = 0; i < non_intersected_ranges.length; i++) {
-                        try {
-                    
-                            file.seek(non_intersected_ranges[i].getStart());
-                            int tmpsize = file.read(b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart()));
+                     //   try {
+                            int sizetoread = (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart());
+                            byte[] tmpdt =  new byte[(int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart())];
+                            int tmpsize = invokeNativepread(tmpdt, non_intersected_ranges[i].getStart(), sizetoread);
+                            System.arraycopy(tmpdt, 0, b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), sizetoread);
+                            //file.seek(non_intersected_ranges[i].getStart());
+                            //int tmpsize = file.read(b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart()));
                             result += tmpsize;
-                        } catch (IOException ex) {
-                            Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
-                        }
+                      //  } catch (IOException ex) {
+                        //    Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
+                       // }
                     }
-                    
-                     if (me.getStatus() == Status.ABORTED) {
+
+                    if (me.getStatus() == Status.ABORTED) {
                         for (int k = 0; k < occupiedblocks.size(); k++) {
-                            block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));
+                            block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));
                             me.getHeldblocklocks().add(block.getLock().readLock());
                         }
                         throw new AbortedException();
                     }
                     for (int k = 0; k < occupiedblocks.size(); k++) {
-                          block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
-                          block.getLock().readLock().unlock();
+                        block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
+
+                        block.getLock().readLock().unlock();
                     }
-                //    me.unlockAllLocks();
-                    offsetlock.unlock();
+                   // offsetlock.unlock();
                     tmp.setLocaloffset(tmp.getLocaloffset() + result);
                 }
-            
+
                 return result;
             }
 
-        } else {           // add to the readers list  
-            
-            me.addFile(this, 0);
+        } else {           // add to the readers list 
+         //   me.addFile(this, 0);
             return read(b);
         }
 
@@ -421,15 +424,15 @@ public class TransactionalFile implements Comparable{
 
         if (me == null) // not a transaction 
         {
-            
+
             non_Transactional_Write(data);
             return;
         }
+
         if (me.getGlobaltoLocalMappings().containsKey(this)) // 
         {
-            
-            
+
+
             Byte[] by = new Byte[size];
             for (int i = 0; i < size; i++) {
                 by[i] = Byte.valueOf(data[i]);
@@ -437,88 +440,85 @@ public class TransactionalFile implements Comparable{
             TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getGlobaltoLocalMappings().get(this)));
 
             Vector dummy;
-            if (((Vector)(me.getWriteBuffer().get(this.inode))) != null){
-                dummy = new Vector((Vector)(me.getWriteBuffer().get(this.inode)));
-            }
-            else 
+            if (((Vector) (me.getWriteBuffer().get(this.inode))) != null) {
+                dummy = new Vector((Vector) (me.getWriteBuffer().get(this.inode)));
+            } else {
                 dummy = new Vector();
-       
+            }
             dummy.add(new WriteOperations(by, new Range(tmp.getLocaloffset(), tmp.getLocaloffset() + by.length), tmp.isUnknown_inital_offset_for_write(), this, tmp));
             me.getWriteBuffer().put(this.inode, dummy);
-            
+
             long loffset = tmp.getLocaloffset();
-             
-             
+
+
             tmp.setLocaloffset(tmp.getLocaloffset() + by.length);
-            
+
             me.merge_for_writes_done.put(inode, Boolean.FALSE);
-            if (!(tmp.isUnknown_inital_offset_for_write())){
+
+            if (!(tmp.isUnknown_inital_offset_for_write())) {
                 markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.WRITE);
 
             }
-            if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)
+            if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) {
                 tmp.offsetdependency = OffsetDependency.WRITE_DEPENDENCY_1;
-            
+            }
         } else {
             me.addFile(this, 0);
             write(data);
         }
     }
 
-    
-    private void markAccessedBlocks(ExtendedTransaction me,long loffset, int size, BlockAccessModesEnum mode){
-        
+    private void markAccessedBlocks(ExtendedTransaction me, long loffset, int size, BlockAccessModesEnum mode) {
+
         TreeMap map;
-        
-        if (me.getAccessedBlocks().get(this.getInode()) != null)
+
+        if (me.getAccessedBlocks().get(this.getInode()) != null) {
             map = (TreeMap) me.getAccessedBlocks().get(this.getInode());
-        else{ 
+        } else {
             map = new TreeMap();
             me.getAccessedBlocks().put(this.inode, map);
         }
         int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(loffset);
         int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(loffset, size);
         for (int i = startblock; i <= targetblock; i++) {
-            if (map.containsKey(Integer.valueOf(i))){
-                 if (map.get(Integer.valueOf(i)) != mode){ 
+            if (map.containsKey(Integer.valueOf(i))) {
+                if (map.get(Integer.valueOf(i)) != mode) {
                     map.put(Integer.valueOf(i), BlockAccessModesEnum.READ_WRITE);
-                 }
-            }
-            else{
-                  map.put(Integer.valueOf(i), mode);
+                }
+            } else {
+                map.put(Integer.valueOf(i), mode);
             }
         }
     }
-        
+
     private int readFromFile(ExtendedTransaction me, byte[] readdata, TransactionLocalFileAttributes tmp) {
 
         int st = FileBlockManager.getCurrentFragmentIndexofTheFile(tmp.getLocaloffset());
         int end = FileBlockManager.getTargetFragmentIndexofTheFile(tmp.getLocaloffset(), readdata.length);
-        
-         BlockDataStructure block = null;
-         boolean locked = false;
+
+        BlockDataStructure block = null;
+        boolean locked = false;
         for (int k = st; k <= end; k++) {
             while (me.getStatus() == Status.ACTIVE) {
-                
+
                 block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
-      
+
                 block.getLock().readLock().lock();
-                
-                        if (!(block.getReaders().contains(me))){
-                            block.getReaders().add(me);
-                        }
-                        locked = true;
-                     break;
+
+                if (!(block.getReaders().contains(me))) {
+                    block.getReaders().add(me);
+                }
+                locked = true;
+                break;
             }
             if (me.getStatus() == Status.ABORTED) {
                 int m;
-                if (locked){
-                    m = k+1;
-                }
-                else 
+                if (locked) {
+                    m = k + 1;
+                } else {
                     m = k;
-                for (int i=st; i<m; i++){
+                }
+                for (int i = st; i < m; i++) {
                     block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
                     me.getHeldblocklocks().add(block.getLock().readLock());
                 }
@@ -526,23 +526,24 @@ public class TransactionalFile implements Comparable{
                 throw new AbortedException();
             }
         }
-        
-       int size = -1;
-           size = invokeNativepread(readdata, tmp.getLocaloffset(), readdata.length);
-           tmp.setLocaloffset(tmp.getLocaloffset() + size);
-            
-           if (size == 0)
-                size = -1;
-       if (me.getStatus() == Status.ABORTED) {
-                  for (int i=st; i<=end; i++){
-                    block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
-                    me.getHeldblocklocks().add(block.getLock().readLock());
-             }
-                throw new AbortedException();
+
+        int size = -1;
+        size = invokeNativepread(readdata, tmp.getLocaloffset(), readdata.length);
+        tmp.setLocaloffset(tmp.getLocaloffset() + size);
+
+        if (size == 0) {
+            size = -1;
+        }
+        if (me.getStatus() == Status.ABORTED) {
+            for (int i = st; i <= end; i++) {
+                block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
+                me.getHeldblocklocks().add(block.getLock().readLock());
+            }
+            throw new AbortedException();
         }
         for (int k = st; k <= end; k++) {
-                    block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
-                    block.getLock().readLock().unlock();
+            block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
+            block.getLock().readLock().unlock();
         }
         return size;
 
@@ -577,311 +578,301 @@ public class TransactionalFile implements Comparable{
     public void setInode(INode inode) {
         this.inode = inode;
     }
-    
-    public void lockOffset(ExtendedTransaction me){
-            boolean locked = false;
-            while (me.getStatus() == Status.ACTIVE) {                        //locking the offset
-               offsetlock.lock();
-               locked = true;
-               break;
-            }
-            
-            if (me.getStatus() != Status.ACTIVE){
-               if (locked)
-                    me.getHeldoffsetlocks().add(offsetlock);
-                throw new AbortedException();
+
+    public void lockOffset(ExtendedTransaction me) {
+        boolean locked = false;
+        while (me.getStatus() == Status.ACTIVE) {                        //locking the offset
+
+            offsetlock.lock();
+            locked = true;
+            break;
+        }
+
+        if (me.getStatus() != Status.ACTIVE) {
+            if (locked) {
+                me.getHeldoffsetlocks().add(offsetlock);
             }
+            throw new AbortedException();
+        }
 
     }
-    
-    public void mergeWrittenData(ExtendedTransaction me/*TreeMap target, byte[] data, Range to_be_merged_data_range*/){
-            
-            boolean flag = false;
-            Vector vec = (Vector) me.getWriteBuffer().get(this.inode);     
-            Range intersectedrange = new Range(0, 0);
-            Iterator it1 = vec.iterator();
-            WriteOperations wrp;
-            WriteOperations wrp2;
-            Vector toberemoved = new Vector();
-            while (it1.hasNext()) {
-                wrp = (WriteOperations) (it1.next());
-                
-                if (toberemoved.contains(wrp)){
+
+    public void mergeWrittenData(ExtendedTransaction me/*TreeMap target, byte[] data, Range to_be_merged_data_range*/) {
+
+        boolean flag = false;
+        Vector vec = (Vector) me.getWriteBuffer().get(this.inode);
+        Range intersectedrange = new Range(0, 0);
+        Iterator it1 = vec.iterator();
+        WriteOperations wrp;
+        WriteOperations wrp2;
+        Vector toberemoved = new Vector();
+        while (it1.hasNext()) {
+            wrp = (WriteOperations) (it1.next());
+
+            if (toberemoved.contains(wrp)) {
+                continue;
+            }
+
+            Iterator it2 = vec.listIterator();
+            while (it2.hasNext()) {
+                flag = false;
+                wrp2 = (WriteOperations) (it2.next());
+
+                if ((wrp2 == wrp) || toberemoved.contains(wrp2)) {
                     continue;
                 }
-                    
-                Iterator it2 = vec.listIterator();
-                while (it2.hasNext()) {
-                    flag = false;
-                    wrp2 = (WriteOperations) (it2.next());
-            
-                    if ((wrp2 == wrp) || toberemoved.contains(wrp2)){
-                        continue;
-                    }
-                        
-                    if (wrp.getRange().hasIntersection(wrp2.getRange())) {
-                        flag = true;
-                        intersectedrange = wrp2.getRange().intersection(wrp.getRange());
-                        toberemoved.add(wrp2);
-                    }
-                    
-                    
-                    long startprefix = 0;
-                    long endsuffix = 0;
-                    long startsuffix = 0;
-                    int prefixsize = 0;
-                    int suffixsize = 0;
-                    int intermediatesize = 0;
-                    Byte[] prefixdata = null;
-                    Byte[] suffixdata = null;
-                    boolean prefix = false;
-                    boolean suffix = false;
-                    if (flag){
-                        
-                        
-                        if (wrp.getRange().getStart() < wrp2.getRange().getStart()) {
-                             prefixdata = new Byte[(int) (wrp2.getRange().getStart() - wrp.getRange().getStart())];
-                             prefixdata = (Byte[]) (wrp.getData());
-                             startprefix = wrp.getRange().getStart();
-                             prefixsize = (int)(intersectedrange.getStart() - startprefix);
-                             intermediatesize = (int)(intersectedrange.getEnd() -intersectedrange.getStart());
-                             prefix = true;   
-                        }
 
-                        else if (wrp2.getRange().getStart() <= wrp.getRange().getStart()) {
-                             prefixdata = new Byte[(int) (wrp.getRange().getStart() - wrp2.getRange().getStart())];
-                             prefixdata = (Byte[]) (wrp2.getData());
-                             startprefix = wrp2.getRange().getStart();
-                             prefixsize = (int)(intersectedrange.getStart() - startprefix);
-                             intermediatesize = (int)(intersectedrange.getEnd() -intersectedrange.getStart());
-                             prefix = true;
-                        }
+                if (wrp.getRange().hasIntersection(wrp2.getRange())) {
+                    flag = true;
+                    intersectedrange = wrp2.getRange().intersection(wrp.getRange());
+                    toberemoved.add(wrp2);
+                }
 
-                        if (wrp2.getRange().getEnd() >= wrp.getRange().getEnd()) {
 
-                             suffixdata = new Byte[(int) (wrp2.getRange().getEnd() - intersectedrange.getEnd())];
-                             suffixdata = (Byte[]) (wrp2.getData());
-                             startsuffix = intersectedrange.getEnd() - wrp2.getRange().getStart();
-                             suffixsize = (int)(wrp2.getRange().getEnd() - intersectedrange.getEnd());
-                             suffix = true;
-                             endsuffix = wrp2.getRange().getEnd();
-                        }
+                long startprefix = 0;
+                long endsuffix = 0;
+                long startsuffix = 0;
+                int prefixsize = 0;
+                int suffixsize = 0;
+                int intermediatesize = 0;
+                Byte[] prefixdata = null;
+                Byte[] suffixdata = null;
+                boolean prefix = false;
+                boolean suffix = false;
+                if (flag) {
+
+
+                    if (wrp.getRange().getStart() < wrp2.getRange().getStart()) {
+                        prefixdata = new Byte[(int) (wrp2.getRange().getStart() - wrp.getRange().getStart())];
+                        prefixdata = (Byte[]) (wrp.getData());
+                        startprefix = wrp.getRange().getStart();
+                        prefixsize = (int) (intersectedrange.getStart() - startprefix);
+                        intermediatesize = (int) (intersectedrange.getEnd() - intersectedrange.getStart());
+                        prefix = true;
+                    } else if (wrp2.getRange().getStart() <= wrp.getRange().getStart()) {
+                        prefixdata = new Byte[(int) (wrp.getRange().getStart() - wrp2.getRange().getStart())];
+                        prefixdata = (Byte[]) (wrp2.getData());
+                        startprefix = wrp2.getRange().getStart();
+                        prefixsize = (int) (intersectedrange.getStart() - startprefix);
+                        intermediatesize = (int) (intersectedrange.getEnd() - intersectedrange.getStart());
+                        prefix = true;
+                    }
 
-                        else if (wrp.getRange().getEnd() > wrp2.getRange().getEnd()) {
-                             suffixdata = new Byte[(int) (wrp.getRange().getEnd() - intersectedrange.getEnd())];
-                             suffixdata = (Byte[]) (wrp.getData());
-                             startsuffix = intersectedrange.getEnd() - wrp.getRange().getStart();
-                             suffixsize = (int)(wrp.getRange().getEnd() - intersectedrange.getEnd());
-                             endsuffix = wrp.getRange().getEnd();
-                             suffix = true;
+                    if (wrp2.getRange().getEnd() >= wrp.getRange().getEnd()) {
+
+                        suffixdata = new Byte[(int) (wrp2.getRange().getEnd() - intersectedrange.getEnd())];
+                        suffixdata = (Byte[]) (wrp2.getData());
+                        startsuffix = intersectedrange.getEnd() - wrp2.getRange().getStart();
+                        suffixsize = (int) (wrp2.getRange().getEnd() - intersectedrange.getEnd());
+                        suffix = true;
+                        endsuffix = wrp2.getRange().getEnd();
+                    } else if (wrp.getRange().getEnd() > wrp2.getRange().getEnd()) {
+                        suffixdata = new Byte[(int) (wrp.getRange().getEnd() - intersectedrange.getEnd())];
+                        suffixdata = (Byte[]) (wrp.getData());
+                        startsuffix = intersectedrange.getEnd() - wrp.getRange().getStart();
+                        suffixsize = (int) (wrp.getRange().getEnd() - intersectedrange.getEnd());
+                        endsuffix = wrp.getRange().getEnd();
+                        suffix = true;
 
-                        }
-               
-                        Byte[] data_to_insert;
-
-                        if ((prefix) && (suffix)) {
-                            data_to_insert = new Byte[(int) (endsuffix - startprefix)];
-                            System.arraycopy(prefixdata, 0, data_to_insert, 0, prefixsize);
-                            System.arraycopy(wrp2.getData(), (int)(intersectedrange.getStart() - wrp2.getRange().getStart()), data_to_insert, prefixsize, intermediatesize);
-                            System.arraycopy(suffixdata, (int)startsuffix, data_to_insert, (prefixsize + intermediatesize), suffixsize);
-                            wrp.setData(data_to_insert);
-                            wrp.setRange(new Range(startprefix, endsuffix));
-                        }
-                       
                     }
+
+                    Byte[] data_to_insert;
+
+                    if ((prefix) && (suffix)) {
+                        data_to_insert = new Byte[(int) (endsuffix - startprefix)];
+                        System.arraycopy(prefixdata, 0, data_to_insert, 0, prefixsize);
+                        System.arraycopy(wrp2.getData(), (int) (intersectedrange.getStart() - wrp2.getRange().getStart()), data_to_insert, prefixsize, intermediatesize);
+                        System.arraycopy(suffixdata, (int) startsuffix, data_to_insert, (prefixsize + intermediatesize), suffixsize);
+                        wrp.setData(data_to_insert);
+                        wrp.setRange(new Range(startprefix, endsuffix));
+                    }
+
                 }
             }
-            Iterator it = toberemoved.iterator();
-            while (it.hasNext())
-                vec.remove(it.next());
-            
-            toberemoved.clear();
-            Collections.sort(vec);
-            me.merge_for_writes_done.put(inode, Boolean.TRUE);
+        }
+        Iterator it = toberemoved.iterator();
+        while (it.hasNext()) {
+            vec.remove(it.next());
+        }
+        toberemoved.clear();
+        Collections.sort(vec);
+        me.merge_for_writes_done.put(inode, Boolean.TRUE);
 
     }
-    
-    public void non_Transactional_Write(byte[] data){
-        
-            Vector heldlocks = new Vector();
-            offsetlock.lock();
-            int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
-            int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), data.length);
-            for (int i = startblock; i <= targetblock; i++) {
-                BlockDataStructure block =this.inodestate.getBlockDataStructure(i);
-                block.getLock().writeLock().lock(); 
-                    heldlocks.add(block.getLock().writeLock());
-            }
 
-                try {
+    public void non_Transactional_Write(byte[] data) {
 
-                    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);
-                    offsetlock.unlock();
-                }
+        Vector heldlocks = new Vector();
+        offsetlock.lock();
+        int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
+        int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), data.length);
+        for (int i = startblock; i <= targetblock; i++) {
+            BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
+            block.getLock().writeLock().lock();
+            heldlocks.add(block.getLock().writeLock());
+
+        }
+
+        try {
+            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);
+            offsetlock.unlock();
+        }
     }
-    
-    public int non_Transactional_Read(byte[] b){
+
+    public int non_Transactional_Read(byte[] b) {
         int size = -1;
         Vector heldlocks = new Vector();
         boolean flag = true;
         offsetlock.lock();
-        int startblock;    
-        int targetblock; 
+        int startblock;
+        int targetblock;
         startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
         targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), size);
 
 
         for (int i = startblock; i <= targetblock; i++) {
             BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
-            block.getLock().readLock().lock();    
-                heldlocks.add(block.getLock().readLock());
+            block.getLock().readLock().lock();
+            heldlocks.add(block.getLock().readLock());
         }
 
         size = invokeNativepread(b, committedoffset.getOffsetnumber(), b.length);
-        committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() +size);
-        if (!(committedoffset.getOffsetReaders().isEmpty())){
-            Iterator it2 =  committedoffset.getOffsetReaders().iterator(); // for visible readers strategy
-            while ( it2.hasNext())
-            {
+        committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() + size);
+        if (!(committedoffset.getOffsetReaders().isEmpty())) {
+            Iterator it2 = committedoffset.getOffsetReaders().iterator(); // for visible readers strategy
+
+            while (it2.hasNext()) {
                 ExtendedTransaction tr = (ExtendedTransaction) it2.next();
                 tr.abort();
-            }   
-             committedoffset.getOffsetReaders().clear();
+            }
+            committedoffset.getOffsetReaders().clear();
         }
 
         unlockLocks(heldlocks);
         offsetlock.unlock();
-        if (size == 0)
+        if (size == 0) {
             size = -1;
-
-    return size;
+        }
+        return size;
 
     }
-    
-    public void non_Transactional_Seek(long offset){
+
+    public void non_Transactional_Seek(long offset) {
         offsetlock.lock();
-                committedoffset.setOffsetnumber(offset); 
+        committedoffset.setOffsetnumber(offset);
         offsetlock.unlock();
     }
 
-    public long non_Transactional_getFilePointer(){
+    public long non_Transactional_getFilePointer() {
         long offset = -1;
-        
+
         offsetlock.lock();
-            offset = committedoffset.getOffsetnumber();
+        offset = committedoffset.getOffsetnumber();
         offsetlock.unlock();
-        
+
         return offset;
     }
-    
+
     public int compareTo(Object arg0) {
         TransactionalFile tf = (TransactionalFile) arg0;
-        if (this.inode.getNumber() < tf.inode.getNumber())
+        if (this.inode.getNumber() < tf.inode.getNumber()) {
             return -1;
-        else if (this.inode.getNumber() > tf.inode.getNumber())
+        } else if (this.inode.getNumber() > tf.inode.getNumber()) {
             return 1;
-        else {
-            if (this.sequenceNum < tf.sequenceNum)
+        else {
+            if (this.sequenceNum < tf.sequenceNum) {
                 return -1;
-            else 
+            } else {
                 return 1;
+            }
         }
     }
-    
-    public void makeWritestDependent(ExtendedTransaction me){// make the writes absolute and dependent on ofset value
+
+    public void makeWritestDependent(ExtendedTransaction me) {// make the writes absolute and dependent on ofset value
+
         Iterator it;
-        if (me.getWriteBuffer().get(inode) != null)
-        {
+        if (me.getWriteBuffer().get(inode) != null) {
             it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
-            while (it.hasNext()){
+            while (it.hasNext()) {
 
-                  WriteOperations wrp = (WriteOperations) it.next();
-                  if (wrp.isUnknownoffset()){
+                WriteOperations wrp = (WriteOperations) it.next();
+                if (wrp.isUnknownoffset()) {
                     wrp.setUnknownoffset(false);
                     wrp.getOwnertransactionalFile().lockOffset(me);
 
-                        wrp.getRange().setStart(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() 
-                                - wrp.getBelongingto().getCopylocaloffset()
-                                + wrp.getRange().getStart());
-                        wrp.getRange().setEnd(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber()
-                                - wrp.getBelongingto().getCopylocaloffset()
-                                + wrp.getRange().getEnd());
-                        if ((wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) ||
-                                (wrp.getBelongingto().offsetdependency == OffsetDependency.NO_ACCESS) ||
-                                (wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_2)){
-                            wrp.getBelongingto().setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
-                            wrp.getBelongingto().setUnknown_inital_offset_for_write(false);
-                            if (!(wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().contains(me)))
-                                wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().add(me);
-                            wrp.getBelongingto().setLocaloffset(wrp.getBelongingto().getLocaloffset() + wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset());
+                    wrp.getRange().setStart(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset() + wrp.getRange().getStart());
+                    wrp.getRange().setEnd(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset() + wrp.getRange().getEnd());
+                    if ((wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) ||
+                            (wrp.getBelongingto().offsetdependency == OffsetDependency.NO_ACCESS) ||
+                            (wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_2)) {
+                        wrp.getBelongingto().setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
+                        wrp.getBelongingto().setUnknown_inital_offset_for_write(false);
+                        if (!(wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().contains(me))) {
+                            wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().add(me);
                         }
-                     wrp.getOwnertransactionalFile().offsetlock.unlock();  
-                     markAccessedBlocks(me, (int)wrp.getRange().getStart(), (int)(wrp.getRange().getEnd() - wrp.getRange().getStart()), BlockAccessModesEnum.WRITE);
+                        wrp.getBelongingto().setLocaloffset(wrp.getBelongingto().getLocaloffset() + wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset());
+                    }
+                    wrp.getOwnertransactionalFile().offsetlock.unlock();
+                    markAccessedBlocks(me, (int) wrp.getRange().getStart(), (int) (wrp.getRange().getEnd() - wrp.getRange().getStart()), BlockAccessModesEnum.WRITE);
 
-                  }
+                }
             }
         }
-        
+
     }
+}
+// for block versioning mechanism
+            /*if (!(validateBlocksVersions(startblock, targetblock))) { ////check to see if version are still valid 
 
+throw new AbortedException();
+
+}*/
+/*  
+int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(k))).intValue();
+while (me.getStatus() == Status.ACTIVE) {
+BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
+if (block.getLock().tryLock()) {
+heldlocks.add(block.getLock());
+if (!(block.getVersion().get() == expvalue)) {  // for block versioning mechanism
+me.abort();
 } 
-
-
-        // for block versioning mechanism
-            /*if (!(validateBlocksVersions(startblock, targetblock))) { ////check to see if version are still valid 
-            
-                    throw new AbortedException();
-            
-            }*/
-                       /*  
-                        int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(k))).intValue();
-                        while (me.getStatus() == Status.ACTIVE) {
-                            BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
-                            if (block.getLock().tryLock()) {
-                                heldlocks.add(block.getLock());
-                                if (!(block.getVersion().get() == expvalue)) {  // for block versioning mechanism
-                                        me.abort();
-                                } 
-                                else {
-                                        break;
-                                }
-                            } 
-                            else {
-                                    me.getContentionManager().resolveConflict(me, block.getOwner());
-                            }
-                        }
-                      if (me.getStatus() == Status.ABORTED) {
-                            unlockLocks(heldlocks);
-                            offsetlock.unlock();
-                            throw new AbortedException();
-                        }
-                    }
-                   }*/
-    
-    
+else {
+break;
+}
+} 
+else {
+me.getContentionManager().resolveConflict(me, block.getOwner());
+}
+}
+if (me.getStatus() == Status.ABORTED) {
+unlockLocks(heldlocks);
+offsetlock.unlock();
+throw new AbortedException();
+}
+}
+}*/
 /*    public boolean validateBlocksVersions(int startblock, int targetblock) { // For Block Versioning Mechanism
-        boolean valid = true;
-        ExtendedTransaction me = ExtendedTransaction.getTransaction();
-        TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getFilesAccesses().get(this.getInode())));
-        for (int i = startblock; i <= targetblock; i++) {
-            int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(i))).intValue();
-            BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(i)));
-            if (expvalue != block.getVersion().get()) {
-                valid = false;
-                break;
-            }
-        }
-
-        return valid;
-    }*/
+boolean valid = true;
+ExtendedTransaction me = ExtendedTransaction.getTransaction();
+TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getFilesAccesses().get(this.getInode())));
+for (int i = startblock; i <= targetblock; i++) {
+int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(i))).intValue();
+BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(i)));
+if (expvalue != block.getVersion().get()) {
+valid = false;
+break;
+}
+}
+
+return valid;
+}*/