From 8d08e020229ffec1429c3e02a9e53555d446239b Mon Sep 17 00:00:00 2001 From: navid Date: Mon, 24 Nov 2008 22:25:12 +0000 Subject: [PATCH] *** empty log message *** --- Robust/Transactions/NativeFunctions.c | 77 ++ .../TransactionalIO/dist/TransactionalIO.jar | Bin 153540 -> 152858 bytes .../core/ExtendedTransaction.java | 897 ++++++----------- .../core/TransactionalFile.java | 909 +++++++++--------- 4 files changed, 802 insertions(+), 1081 deletions(-) create mode 100644 Robust/Transactions/NativeFunctions.c diff --git a/Robust/Transactions/NativeFunctions.c b/Robust/Transactions/NativeFunctions.c new file mode 100644 index 00000000..61465771 --- /dev/null +++ b/Robust/Transactions/NativeFunctions.c @@ -0,0 +1,77 @@ +/* + * File: HelloWorld.cpp + * Author: navid + * + * Created on September 3, 2008, 2:17 PM + */ + + #include + #include + #include + #include + #include + #include + #include + #include "NativeFunctions.h" + + JNIEXPORT jlong JNICALL Java_TransactionalIO_core_TransactionalFileWrapperFactory_getINodeNative + (JNIEnv *env, jobject obj, jstring filename) + { + struct stat status_buf; + jlong inodenum; + // stat("/home/navid/myfile.txt",&status_buf); + char *str = (*env)->GetStringUTFChars(env, filename, 0); +// printf("\n"); +// printf("File Name is: %s \n", str); + if (stat(str,&status_buf)<0) + inodenum = -1; + else + { +// printf("Inode number is: %lu \n", status_buf.st_ino); + inodenum = status_buf.st_ino; + } + (*env)->ReleaseStringUTFChars(env, filename, str); + return inodenum; + } + + + JNIEXPORT jint JNICALL Java_TransactionalIO_core_TransactionalFile_nativepread(JNIEnv *env, jobject obj2, jbyteArray buff, jlong offset, jint size, jobject fobj ) { + signed char str[200]; + size_t nativesize = size; + off_t nativeoffset =offset; + + + jclass cls2 = (*env) ->GetObjectClass(env, fobj); + + + jfieldID fid3 = (*env)->GetFieldID(env, cls2,"fd", "I"); + + jobject fp = (*env)->GetIntField(env, fobj, fid3); + + int res = pread((int)fp, str,nativesize ,nativeoffset); + + (*env) -> SetByteArrayRegion(env, buff, 0, res, str); + + return res; + } + + JNIEXPORT jint JNICALL Java_TransactionalIO_core_ExtendedTransaction_nativepwrite(JNIEnv *env, jobject obj2, jbyteArray buff, jlong offset, jint size, jobject fobj ) { + + jbyteArray str; + size_t nativesize = (*env)->GetArrayLength(env, buff); + off_t nativeoffset =offset; + + + jclass cls2 = (*env) ->GetObjectClass(env, fobj); + + str = (*env) -> GetByteArrayElements(env, buff, NULL); + + jfieldID fid3 = (*env)->GetFieldID(env, cls2,"fd", "I"); + + jobject fp = (*env)->GetIntField(env, fobj, fid3); + + int res = pwrite((int)fp, str,nativesize ,nativeoffset); + + + return res; + } diff --git a/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar b/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar index df7a33906d5685a8257043e6ed7dc2e84642c38f..ee602652716c101db6cc1c1948166b66351270ef 100644 GIT binary patch delta 19402 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%0A#O%M@k zf3_`O`-N^j>WiGHXN<}-nswsH$2SHd3rjNaXJu4s^rA7Uqj9Rcu8l5$SwH&N7?s&n zb|QhiK;XPupjh8O``GQ}57R_5#{$9=Lpl20NNyOtZv+Qq(dp3}#;W>8-Uwaa#jbjB zG^eM;A#GcpInwFWWE?^vUmFvhHcm}ZG(LK0oGMcvO_FDBw9j~~dhZ2x;lA;zpIR~9 zd2=DBM>8g1gI=3$*G!wB`lxMlbRlwRMt1ZqyfwC7#LpF delta 19831 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 diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java index e7f11488..9a9ce7b6 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java @@ -4,10 +4,6 @@ */ package TransactionalIO.core; - - - - import TransactionalIO.exceptions.AbortedException; import TransactionalIO.benchmarks.benchmark; import TransactionalIO.benchmarks.customhandler; @@ -41,62 +37,48 @@ import java.util.logging.Logger; * @author navid */ public class ExtendedTransaction implements TransactionStatu { - - + private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd); + { System.load("/home/navid/libkooni.so"); } - private boolean flag = true; - public TransactionStatu memorystate; + public TransactionStatu memorystate; private PropertyChangeSupport changes = new PropertyChangeSupport(this); public int starttime; public int endtime; - public TreeMap msg = new TreeMap(); public int numberofwrites; public int numberofreads; - - public enum Status {ABORTED, ACTIVE, COMMITTED}; + + public enum Status { + + ABORTED, ACTIVE, COMMITTED + }; private boolean writesmerged = true; - //private Vector heldoffsetlocks; - private Vector heldoffsetlocks; - + private Vector heldoffsetlocks; //private Vector heldblocklocks; private Vector heldblocklocks; - //private HashMap> AccessedFiles; - private HashMap AccessedFiles; - - + private HashMap AccessedFiles; //private HashMap > accessedBlocks; - private HashMap accessedBlocks; - - //private HashMap LocaltoGlobalMappings; + private HashMap accessedBlocks; + //private HashMap LocaltoGlobalMappings; private HashMap GlobaltoLocalMappings; - public HashMap merge_for_writes_done; - - - - private HashMap writeBuffer; - private ContentionManager contentionmanager; private /*volatile*/ Status status; - private int id; - - public ExtendedTransaction() { - // super(); - // id = Integer.valueOf(Thread.currentThread().getName().substring(7)); - heldblocklocks = new Vector() ; - heldoffsetlocks= new Vector(); + // super(); + // id = Integer.valueOf(Thread.currentThread().getName().substring(7)); + heldblocklocks = new Vector(); + heldoffsetlocks = new Vector(); AccessedFiles = new HashMap(); GlobaltoLocalMappings = new HashMap/**/(); writeBuffer = new HashMap(); @@ -104,92 +86,56 @@ public class ExtendedTransaction implements TransactionStatu { accessedBlocks = new HashMap(); merge_for_writes_done = new HashMap(); writesmerged = true; - // setContentionmanager(new BaseManager()); + // setContentionmanager(new BaseManager()); // beginTransaction(); - + } - - public ExtendedTransaction(TransactionStatu memorystate){ + + public ExtendedTransaction(TransactionStatu memorystate) { this(); - /* heldblocklocks = new Vector() ; - heldoffsetlocks= new Vector(); - AccessedFiles = new HashMap(); - GlobaltoLocalMappings = new HashMap(); - writeBuffer = new HashMap(); - status = Status.ACTIVE; - accessedBlocks = new HashMap(); - merge_for_writes_done = new HashMap(); - writesmerged = true;*/ - this.memorystate = memorystate ; + + this.memorystate = memorystate; } - - private int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) { + + private int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) { try { - //System.out.println(buff.length); - // System.out.println(offset); return nativepwrite(buff, offset, buff.length, file.getFD()); } catch (IOException ex) { - + Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex); return -1; } - + } - - public void beginTransaction(){ + + public void beginTransaction() { this.addPropertyChangeListener(new customhandler(Status.ABORTED)); } - - - - + public void abort() { - synchronized(this){ - // Status oldst = getStatus(); - /* synchronized(benchmark.lock){ - System.out.println("be ga raftim 0"); - }*/ + synchronized (this) { + this.status = Status.ABORTED; - if (this.memorystate !=null && !(this.memorystate).isAborted()){ - /* synchronized(benchmark.lock){ - System.out.println(Thread.currentThread() +" be ga raftim 1 file"); - }*/ + if (this.memorystate != null && !(this.memorystate).isAborted()) { this.memorystate.abortThisSystem(); - /* synchronized(benchmark.lock){ - System.out.println(Thread.currentThread() + " be ga raftim 2 file"); - }*/ } - // Thread[] group = new Thread[30]; - // Thread.currentThread().enumerate(group); - // group[this.id].interrupt(); - /*synchronized(benchmark.lock){ - System.out.println("/////////////"); - System.out.println(Thread.currentThread() + " " +Thread.currentThread().enumerate(group)); - System.out.println(Thread.currentThread() + " " +group[0]); - System.out.println(Thread.currentThread() + " " +group[1]); - System.out.println(Thread.currentThread() + " " +group[2]); - System.out.println("/////////////"); - }*/ - - - // this.changes.firePropertyChange("status", oldst, Status.ABORTED); + } } - + public Status getStatus() { return status; } - + public boolean isActive() { return this.getStatus() == Status.ACTIVE; } - - + public boolean isAborted() { return this.getStatus() == Status.ABORTED; } - + public ContentionManager getContentionmanager() { return contentionmanager; } @@ -197,16 +143,15 @@ public class ExtendedTransaction implements TransactionStatu { public void setContentionmanager(ContentionManager contentionmanager) { this.contentionmanager = contentionmanager; } - public HashMap getWriteBuffer() { return writeBuffer; } - + public HashMap getAccessedFiles() { return AccessedFiles; } - + public boolean isWritesmerged() { return writesmerged; } @@ -215,11 +160,6 @@ public class ExtendedTransaction implements TransactionStatu { this.writesmerged = writesmerged; } - - - - - public HashMap getGlobaltoLocalMappings() { return GlobaltoLocalMappings; } @@ -228,31 +168,26 @@ public class ExtendedTransaction implements TransactionStatu { return accessedBlocks; } - - public ContentionManager getBlockContentionManager(){ + public ContentionManager getBlockContentionManager() { return ManagerRepository.getBlockcm(); } - - public ContentionManager getOffsetContentionManager(){ + + public ContentionManager getOffsetContentionManager() { return ManagerRepository.getOffsetcm(); } - + public TreeMap getSortedFileAccessMap(HashMap hmap) { /*TreeMap sortedMap = new TreeMap(hmap); return sortedMap;*/ return new TreeMap(hmap); } - - - public void setStatus(Status st){ + + public void setStatus(Status st) { Status oldst = getStatus(); this.status = st; this.changes.firePropertyChange("status", oldst, st); } - - - public void addFile(TransactionalFile tf, long offsetnumber/*, TransactionLocalFileAttributes tmp*/) { TransactionLocalFileAttributes tmp = new TransactionLocalFileAttributes(offsetnumber/*, tf.getInodestate().commitedfilesize.get()*/); @@ -269,294 +204,122 @@ public class ExtendedTransaction implements TransactionStatu { merge_for_writes_done.put(tf.getInode(), Boolean.TRUE); } - public boolean lockOffsets() { /// Locking offsets for File Descriptors TreeMap hm = getSortedFileAccessMap(AccessedFiles); - Iterator iter = hm.keySet().iterator(); - + Iterator iter = hm.keySet().iterator(); + while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) { INode key = (INode) iter.next(); - + Vector vec = (Vector) AccessedFiles.get(key); Collections.sort(vec); Iterator it = vec.iterator(); - while (it.hasNext()){ + while (it.hasNext()) { TransactionalFile value = (TransactionalFile) it.next(); - while (this.getStatus() ==Status.ACTIVE){ - //if (value.offsetlock.tryLock()) { + while (this.getStatus() == Status.ACTIVE) { value.offsetlock.lock(); - - // synchronized(value.getCommitedoffset()){ - // value.getCommitedoffset().setOffsetOwner(this); - - // this.msg.put(System.nanoTime(), Thread.currentThread().getName() + " Locked the offset lock in commit for file " + value.getInode() + " from descriptor "+ value.getSequenceNum() +"\n"); - heldoffsetlocks.add(value.offsetlock); - - //else - // getContentionmanager().resolveConflict(this, value.getCommitedoffset()); - break; - //} - } - if (this.getStatus() != Status.ACTIVE){ - - - return false; - } - } - // outercounter++; - } - if (this.getStatus() != Status.ACTIVE){ - - - return false; - } - return true; - } - - /*public boolean commit() { /// Locking offsets for File Descriptors - Map hm = getSortedFileAccessMap(FilesAccesses); - //lock phase - Iterator iter = hm.keySet().iterator(); - TransactionLocalFileAttributes value; - while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) { - INode key = (INode) iter.next(); - value = (TransactionLocalFileAttributes) hm.get(key); - synchronized(value.getCurrentcommitedoffset()){ - if (value.offsetlock.tryLock()) { - value.getCurrentcommitedoffset().setOffsetOwner(this); - heldblocklocks.add(value.offsetlock); - Iterator it = value.getCurrentcommitedoffset().getOffsetReaders().iterator(); // for in-place aborting visible readers strategy - while (it.hasNext()) - { - ExtendedTransaction tr = (ExtendedTransaction) it.next(); - tr.abort(); - } + heldoffsetlocks.add(value.offsetlock); + break; + } - } - } - getOffsetContentionManager().resolveConflict(this, value.getCurrentcommitedoffset().getOffsetOwner()); - } - return true; - } */ - - /*public boolean commit() { /// Locking offsets for File Descriptors with checking strategy + if (this.getStatus() != Status.ACTIVE) { + - Map hm = getSortedFileAccessMap(FilesAccesses); - //lock phase - Iterator iter = hm.keySet().iterator(); - TransactionLocalFileAttributes value; - while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) { - INode key = (INode) iter.next(); - value = (TransactionLocalFileAttributes) hm.get(key); - - if (value.isValidatelocaloffset()) { - if (value.getCopylocaloffset() == value.currentcommitedoffset.getOffsetnumber()) { - value.offsetlock.lock(); - heldoffsetlocks.add(value.offsetlock); - if (!(value.getCopylocaloffset() == value.currentcommitedoffset.getOffsetnumber())) { - unlockAllLocks(); - return false; - } - } else { - unlockAllLocks(); return false; } - } else { - value.offsetlock.lock(); - heldoffsetlocks.add(value.offsetlock); } + } - }*/ + if (this.getStatus() != Status.ACTIVE) { - + return false; + } + return true; + } public boolean lockBlock(BlockDataStructure block, BlockAccessModesEnum mode/*, GlobalINodeState adapter, BlockAccessModesEnum mode, int expvalue, INode inode, TransactionLocalFileAttributes tf*/) { - - //boolean locked = false; Lock lock; - - - - if (mode == BlockAccessModesEnum.READ){ - lock = block.getLock().readLock(); - - - } - else { - + if (mode == BlockAccessModesEnum.READ) { + lock = block.getLock().readLock(); + } else { + lock = block.getLock().writeLock(); - } - + while (this.getStatus() == Status.ACTIVE) { - //synchronized(block){ - - // if (lock.tryLock()) { - lock.lock(); - // synchronized(benchmark.lock){ - // System.out.println(Thread.currentThread() + " Lock the block lock for " + lock +" number " + block.getBlocknumber()); - // } - heldblocklocks.add(lock); - // block.setOwner(this); - return true; - // } - - - //getContentionmanager().resolveConflict(this, block); + lock.lock(); + heldblocklocks.add(lock); + return true; } - return false; } - /* - public boolean lockBlock(BlockDataStructure block, Adapter adapter, BlockAccessModesEnum mode, int expvalue) { // from here for visible readers strategy - while (this.getStatus() == Status.ACTIVE) { - if (lock.tryLock()) { - Thread.onAbortOnce(new Runnable() { - - public void run() { - lock.unlock(); - } - }); - - heldblocklocks.add(lock); - - synchronized (adapter) { - block.setOwner(this); - // Iterator it = block.getReaders().iterator(); - // while (it.hasNext()) - // { - // ExtendedTransaction tr = (ExtendedTransaction) it.next(); - // tr.abort(); - // } - } - - return true; - } else { - getBlockContentionManager().resolveConflict(this, block.getOwner()); - } - } - return false;*/ - - - /* - public boolean lockBlock(BlockDataStructure block, Adapter adapter, BlockAccessModesEnum mode, int expvalue) { // versioning strat - while (this.getStatus() == Status.ACTIVE) { - if (lock.tryLock()) { - Thread.onAbortOnce(new Runnable() { - - public void run() { - lock.unlock(); - } - }); - - heldblocklocks.add(lock); - if (mode != BlockAccessModesEnum.WRITE) { egy - if (block.getVersion().get() != expvalue) { - unlockAllLocks(); - return false; - } - } - synchronized (adapter) { - block.setOwner(this); - } - - return true; - } else { - getContentionManager().resolveConflict(this, block.getOwner()); - } - } - return false; - }*/ public void prepareCommit() { - if (this.status != Status.ACTIVE) + if (this.status != Status.ACTIVE) { throw new AbortedException(); - + } boolean ok = true; - if (!lockOffsets()) - { -// unlockAllLocks(); - // this.msg.put(System.nanoTime(),Thread.currentThread().getName() + " Aborted \n"); - /* synchronized(benchmark.lock){ - benchmark.msg += Thread.currentThread().getName() + " Aborted in prepare commit\n"; - }*/ - //Thread.currentThread().stop(); + if (!lockOffsets()) { throw new AbortedException(); } - + /////////////////////////// - - + + Map hm = getWriteBuffer(); - + Iterator iter = hm.keySet().iterator(); WriteOperations value; Vector vec = new Vector(); while (iter.hasNext() && (this.getStatus() == Status.ACTIVE) && ok) { - //int expvalue = 0; - INode key = (INode) iter.next(); vec = (Vector) hm.get(key); Collections.sort(vec); Iterator it = vec.iterator(); - while (it.hasNext()){ - + while (it.hasNext()) { + value = (WriteOperations) it.next(); - if (value.isUnknownoffset()){ - + if (value.isUnknownoffset()) { + long start; long end; - - //synchronized(value.getOwnertransactionalFile().getCommitedoffset()){ - start = value.getRange().getStart() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber(); - end = value.getRange().getEnd() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber(); - if (value.getBelongingto().isUnknown_inital_offset_for_write()){ - value.getBelongingto().setLocaloffset(value.getBelongingto().getLocaloffset() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber()); - value.getBelongingto().setUnknown_inital_offset_for_write(false); - } - - //} - // System.out.println("start write " + start); - /// System.out.println("end write " + end); + start = value.getRange().getStart() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber(); + end = value.getRange().getEnd() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber(); + if (value.getBelongingto().isUnknown_inital_offset_for_write()) { + value.getBelongingto().setLocaloffset(value.getBelongingto().getLocaloffset() - value.getBelongingto().getCopylocaloffset() + value.getOwnertransactionalFile().getCommitedoffset().getOffsetnumber()); + value.getBelongingto().setUnknown_inital_offset_for_write(false); + } + int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(start); int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(start, value.getRange().getEnd() - value.getRange().getStart()); - + TreeMap sset; - if (this.getAccessedBlocks().get(key) != null){ - sset = (TreeMap) this.getAccessedBlocks().get(key); + if (this.getAccessedBlocks().get(key) != null) { + sset = (TreeMap) this.getAccessedBlocks().get(key); + } else { + sset = new TreeMap(); + this.getAccessedBlocks().put(key, sset); } - - else{ - sset = new TreeMap(); - this.getAccessedBlocks().put(key, sset); - } - + for (int i = startblock; i <= targetblock; i++) { - if (sset.containsKey(Integer.valueOf(i))){ - if (sset.get(Integer.valueOf(i)) != BlockAccessModesEnum.WRITE) + if (sset.containsKey(Integer.valueOf(i))) { + if (sset.get(Integer.valueOf(i)) != BlockAccessModesEnum.WRITE) { sset.put(Integer.valueOf(i), BlockAccessModesEnum.READ_WRITE); - } - else + } + } else { sset.put(Integer.valueOf(i), BlockAccessModesEnum.WRITE); - - // tt.add(Integer.valueOf(i)); + } } - + value.getRange().setStart(start); value.getRange().setEnd(end); - - // System.out.println(Thread.currentThread().); - // System.out.println(value.getRange().getStart()); - // System.out.println(value.getRange().getEnd()); - // System.out.println("---------------"); - //this.getAccessedBlocks().put(value.getOwnertransactionalFile().getInode(), sset); } } @@ -564,250 +327,83 @@ public class ExtendedTransaction implements TransactionStatu { Iterator it = this.getAccessedBlocks().keySet().iterator(); while (it.hasNext() && (this.getStatus() == Status.ACTIVE)) { - INode inode = (INode) it.next(); - GlobalINodeState inodestate = TransactionalFileWrapperFactory.getTateransactionalFileINodeState(inode); - TreeMap vec2 = (TreeMap) this.getAccessedBlocks().get(inode); - Iterator iter2 = vec2.keySet().iterator(); - while(iter2.hasNext()){ - Integer num = (Integer) iter2.next(); - - //BlockDataStructure blockobj = (BlockDataStructure) inodestate.lockmap.get(num); - BlockDataStructure blockobj; - // if (((BlockAccessModesEnum)vec2.get(num)) == BlockAccessModesEnum.WRITE){ - blockobj = inodestate.getBlockDataStructure(num); - // } - // else - // blockobj = (BlockDataStructure) inodestate.lockmap.get(num); - - ok = this.lockBlock(blockobj, (BlockAccessModesEnum)vec2.get(num)); - if (ok == false) - break; - /* synchronized(benchmark.lock){ - benchmark.msg += Thread.currentThread().getName() + " Locked the Block Number " + blockobj.getBlocknumber() +" for " + inode + "\n"; - }*/ - // this.msg.put(System.nanoTime(), Thread.currentThread().getName() + " Locked the Block Number " + blockobj.getBlocknumber() + " for file " + inode + "\n"); - } - } - - if (this.getStatus() != Status.ACTIVE){ - // unlockAllLocks(); - // this.msg.put(System.nanoTime(), Thread.currentThread().getName() + " Aborted \n"); - /* synchronized(benchmark.lock){ - benchmark.msg += Thread.currentThread().getName() + " Aborted \n"; - }*/ - // Thread.currentThread().stop(); - throw new AbortedException(); - } - abortAllReaders(); - - // } - //expvalue = ((Integer) value.getBlockversions().get(it)).intValue(); //for versioning strategy - /*if (!(value.isValidatelocaloffset())) { - if (((BlockAccessModesEnum) (value.getAccesedblocks().get(blockno))) != BlockAccessModesEnum.WRITE) { //versioning strategy - - /if (blockobj.getVersion().get() == expvalue) { - - ok = this.lock(blockobj, value.adapter, (BlockAccessModesEnum) (value.getAccesedblocks().get(blockno)), expvalue); - if (ok == false) { - // unlockAllLocks(); - break; - } - } else { - ok = false; - break; - } - } else { - - ok = this.lock(blockobj, value.adapter, (BlockAccessModesEnum) (value.getAccesedblocks().get(blockno)), expvalue); - if (ok == false) { - break; - } - } - } - - - if (!(ok)) { - unlockAllLocks(); - throw new AbortedException(); - }*/ - } - - public void commitChanges(){ - - // this.msg.put(System.nanoTime(), Thread.currentThread().getName() + " is committing \n"); - - - - //synchronized(benchmark.lock){ - // System.out.println(Thread.currentThread().getName() + " is commiting"); - //} - - - Map hm = getWriteBuffer(); - Iterator iter = hm.keySet().iterator(); - Iterator it; - WriteOperations writeop; - Vector vec; - while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) { - INode key = (INode) iter.next(); - - vec = (Vector) hm.get(key); - Collections.sort(vec); - it = vec.iterator(); - while (it.hasNext()){ - - - //value = (WriteOperations) it.next(); - // writeop = (WriteOperations) writeBuffer.get(key); - writeop = (WriteOperations) it.next(); - // System.out.println(writeop); - Byte[] data = new Byte[(int) (writeop.getRange().getEnd() - writeop.getRange().getStart())]; - byte[] bytedata = new byte[(int) (writeop.getRange().getEnd() - writeop.getRange().getStart())]; - data = (Byte[]) writeop.getData(); - - for (int i = 0; i < data.length; i++) { - bytedata[i] = data[i]; - } - - // try { - // - // writeop.getOwnertransactionalFile().file.seek(writeop.getRange().getStart()); - // System.out.println(Thread.currentThread() + " range " + writeop.getRange().getStart()); - // writeop.getOwnertransactionalFile().file.write(bytedata); - invokeNativepwrite(bytedata, writeop.getRange().getStart(), bytedata.length, writeop.getOwnertransactionalFile().file); - // System.out.println(Thread.currentThread() + " " + bytedata); - - // } catch (IOException ex) { - // Logger.getLogger(ExtendedTransaction.class.getName()).log(Level.SEVERE, null, ex); - // } - // - + INode inode = (INode) it.next(); + GlobalINodeState inodestate = TransactionalFileWrapperFactory.getTateransactionalFileINodeState(inode); + TreeMap vec2 = (TreeMap) this.getAccessedBlocks().get(inode); + Iterator iter2 = vec2.keySet().iterator(); + while (iter2.hasNext()) { + Integer num = (Integer) iter2.next(); + + BlockDataStructure blockobj = inodestate.getBlockDataStructure(num); + + ok = this.lockBlock(blockobj, (BlockAccessModesEnum) vec2.get(num)); + if (ok == false) { + break; } } - - /*if (((FileAccessModesEum) (this.FilesAccessModes.get(key))) == FileAccessModesEum.APPEND) { - try { - Range range = (Range) value.getWrittendata().firstKey(); - - - //synchronized(value.adapter){ - //value.f.seek(value.adapter.commitedfilesize.get()); - value.f.seek(value.getFilelength()); - //} - - Byte[] data = new Byte[(int) (range.getEnd() - range.getStart())]; - byte[] bytedata = new byte[(int) (range.getEnd() - range.getStart())]; - data = (Byte[]) value.getWrittendata().get(range); + } - for (int i = 0; i < data.length; i++) { - bytedata[i] = data[i]; - } - value.f.write(bytedata); + if (this.getStatus() != Status.ACTIVE) { - } catch (IOException ex) { - Logger.getLogger(ExtendedTransaction.class.getName()).log(Level.SEVERE, null, ex); - } + throw new AbortedException(); + } + abortAllReaders(); - } else if (((FileAccessModesEum) (this.FilesAccessModes.get(key))) == FileAccessModesEum.READ) { - continue; - } - else if (value.relocatablewrite && value.getContinious_written_data() != null){ - - - } - else if (!(value.getNon_Speculative_Writtendata().isEmpty())) { - int tobeaddedoffset = 0; + } - if (value.isValidatelocaloffset()) { - tobeaddedoffset = 0; - } else { - tobeaddedoffset = (int) (value.getCurrentcommitedoffset().getOffsetnumber() - value.getCopylocaloffset()); - } - Iterator it = value.getNon_Speculative_Writtendata().keySet().iterator(); - int counter = 0; - while (it.hasNext() && (this.getStatus() == Status.ACTIVE)) { - try { - Range range = (Range) it.next(); + public void commitChanges() { - - value.f.seek(range.getStart() + tobeaddedoffset); + Map hm = getWriteBuffer(); + Iterator iter = hm.keySet().iterator(); + Iterator it; + WriteOperations writeop; + Vector vec; + while (iter.hasNext() && (this.getStatus() == Status.ACTIVE)) { + INode key = (INode) iter.next(); - Byte[] data = new Byte[(int) (range.getEnd() - range.getStart())]; - byte[] bytedata = new byte[(int) (range.getEnd() - range.getStart())]; - data = (Byte[]) value.getNon_Speculative_Writtendata().get(range); + vec = (Vector) hm.get(key); + Collections.sort(vec); + it = vec.iterator(); + while (it.hasNext()) { - for (int i = 0; i < data.length; i++) { - bytedata[i] = data[i]; - } - value.f.write(bytedata); - counter++; + writeop = (WriteOperations) it.next(); + Byte[] data = new Byte[(int) (writeop.getRange().getEnd() - writeop.getRange().getStart())]; + byte[] bytedata = new byte[(int) (writeop.getRange().getEnd() - writeop.getRange().getStart())]; + data = (Byte[]) writeop.getData(); - } catch (IOException ex) { - Logger.getLogger(ExtendedTransaction.class.getName()).log(Level.SEVERE, null, ex); - } - } - } else { - continue; + for (int i = 0; i < data.length; i++) { + bytedata[i] = data[i]; } + invokeNativepwrite(bytedata, writeop.getRange().getStart(), bytedata.length, writeop.getOwnertransactionalFile().file); } + } - - iter = hm.keySet().iterator(); - while (iter.hasNext() ) { - INode key = (INode) iter.next(); - value = (TransactionLocalFileAttributes) hm.get(key); - Iterator it = value.getAccesedblocks().keySet().iterator(); - - while (it.hasNext()) { - Integer blockno = (Integer) it.next(); - synchronized (value.adapter) { - //BlockDataStructure blockobj = (BlockDataStructure) value.adapter.lockmap.get(blockno); - //blockobj.getVersion().getAndIncrement(); for versioning strategy - //value.getCurrentcommitedoffset().setOffsetnumber(value.getLocaloffset()); - //value.adapter.commitedfilesize.getAndSet(value.getFilelength()); - } - } - }*/ Iterator k = GlobaltoLocalMappings.keySet().iterator(); - while (k.hasNext()){ + while (k.hasNext()) { TransactionalFile trf = (TransactionalFile) (k.next()); - // synchronized(trf.getCommitedoffset()){ - trf.getCommitedoffset().setOffsetnumber(((TransactionLocalFileAttributes)GlobaltoLocalMappings.get(trf)).getLocaloffset()); - /*synchronized(benchmark.lock){ - System.out.println(Thread.currentThread() + " KIRIR " +GlobaltoLocalMappings.get(trf).getLocaloffset()); - }*/ - // } + trf.getCommitedoffset().setOffsetnumber(((TransactionLocalFileAttributes) GlobaltoLocalMappings.get(trf)).getLocaloffset()); } - //unlockAllLocks(); - } public void unlockAllLocks() { Iterator it = heldblocklocks.iterator(); while (it.hasNext()) { - - Lock lock = (Lock) it.next(); - lock.unlock(); - - /*synchronized(benchmark.lock){ - System.out.println(Thread.currentThread().getName() + " Released the block lock for " + lock); - }*/ + + Lock lock = (Lock) it.next(); + lock.unlock(); } heldblocklocks.clear(); - + it = heldoffsetlocks.iterator(); while (it.hasNext()) { - ReentrantLock lock = (ReentrantLock) it.next(); - lock.unlock(); - // synchronized(benchmark.lock){ - // System.out.println(Thread.currentThread().getName() + " Released the offset lock for "+ lock +"\n"); - // } + ReentrantLock lock = (ReentrantLock) it.next(); + lock.unlock(); } heldoffsetlocks.clear(); } - - public void abortAllReaders(){ + + public void abortAllReaders() { TreeMap hm = getSortedFileAccessMap(AccessedFiles); //lock phase Iterator iter = hm.keySet().iterator(); @@ -816,86 +412,60 @@ public class ExtendedTransaction implements TransactionStatu { INode key = (INode) iter.next(); Vector vec = (Vector) AccessedFiles.get(key); Iterator it = vec.iterator(); - while (it.hasNext()) - { - - value = (TransactionalFile)it.next(); - - //value = (TransactionalFile) hm.get(key); - //System.out.println(value.getCommitedoffset().getOffsetReaders()); - - Iterator it2 = value.getCommitedoffset().getOffsetReaders().iterator(); // for visible readers strategy - while ( it2.hasNext()) - { - - ExtendedTransaction tr = (ExtendedTransaction) it2.next(); - if (tr != this) - tr.abort(); + while (it.hasNext()) { + + value = (TransactionalFile) it.next(); + Iterator it2 = value.getCommitedoffset().getOffsetReaders().iterator(); // for visible readers strategy + + while (it2.hasNext()) { + ExtendedTransaction tr = (ExtendedTransaction) it2.next(); + if (tr != this) { + tr.abort(); } - value.getCommitedoffset().getOffsetReaders().clear(); - //} + } + value.getCommitedoffset().getOffsetReaders().clear(); } - - - + TreeMap vec2; - if (accessedBlocks.get(key) != null){ + if (accessedBlocks.get(key) != null) { vec2 = (TreeMap) accessedBlocks.get(key); - } - else{ + } else { vec2 = new TreeMap(); } GlobalINodeState inodestate = TransactionalFileWrapperFactory.getTateransactionalFileINodeState(key); Iterator it2 = vec2.keySet().iterator(); - - while (it2.hasNext()) - { - - Integer num = (Integer)it2.next(); - if (vec2.get(num) != BlockAccessModesEnum.READ) - { - BlockDataStructure blockobj = (BlockDataStructure) inodestate.getBlockDataStructure(num);//lockmap.get(num); - Iterator it4 = blockobj.getReaders().iterator(); // from here for visible readers strategy - - while (it4.hasNext()) - { - + + while (it2.hasNext()) { + + Integer num = (Integer) it2.next(); + if (vec2.get(num) != BlockAccessModesEnum.READ) { + BlockDataStructure blockobj = (BlockDataStructure) inodestate.getBlockDataStructure(num);//lockmap.get(num); + + Iterator it4 = blockobj.getReaders().iterator(); // from here for visible readers strategy + + while (it4.hasNext()) { + ExtendedTransaction tr = (ExtendedTransaction) it4.next(); - if (this != tr) + if (this != tr) { tr.abort(); + } } blockobj.getReaders().clear(); - + } } - - - - - /* SortedSet sst = (SortedSet) this.getAccessedBlocks().get(key); - Iterator it3 = sst.iterator(); - while (it3.hasNext()){ - Integer num = (Integer)it.next(); - BlockDataStructure blockobj = (BlockDataStructure) value.getInodestate().lockmap.get(num); - Iterator it4 = blockobj.getReaders().iterator(); // from here for visible readers strategy - while (it4.hasNext()) - { - ExtendedTransaction tr = (ExtendedTransaction) it3.next(); - tr.abort(); - } - }*/ - + } } - - public void addPropertyChangeListener(PropertyChangeListener listener){ - this.changes.addPropertyChangeListener("status",listener); + + public void addPropertyChangeListener(PropertyChangeListener listener) { + this.changes.addPropertyChangeListener("status", listener); } - - public void removePropertyChangeListener(PropertyChangeListener listener){ - this.changes.removePropertyChangeListener("status",listener); + + public void removePropertyChangeListener(PropertyChangeListener listener) { + this.changes.removePropertyChangeListener("status", listener); } public TransactionStatu getOtherSystem() { @@ -927,18 +497,101 @@ public class ExtendedTransaction implements TransactionStatu { } public boolean isCommitted() { - if (this.status == Status.COMMITTED) + if (this.status == Status.COMMITTED) { return true; - - return false; - + } + return false; + } - - - } - - +/* +public boolean lockBlock(BlockDataStructure block, Adapter adapter, BlockAccessModesEnum mode, int expvalue) { // from here for visible readers strategy +while (this.getStatus() == Status.ACTIVE) { +if (lock.tryLock()) { +Thread.onAbortOnce(new Runnable() { + +public void run() { +lock.unlock(); +} +}); + +heldblocklocks.add(lock); + +synchronized (adapter) { +block.setOwner(this); +// Iterator it = block.getReaders().iterator(); +// while (it.hasNext()) +// { +// ExtendedTransaction tr = (ExtendedTransaction) it.next(); +// tr.abort(); +// } +} + +return true; +} else { +getBlockContentionManager().resolveConflict(this, block.getOwner()); +} +} +return false;*/ +/* +public boolean lockBlock(BlockDataStructure block, Adapter adapter, BlockAccessModesEnum mode, int expvalue) { // versioning strat +while (this.getStatus() == Status.ACTIVE) { +if (lock.tryLock()) { +Thread.onAbortOnce(new Runnable() { + +public void run() { +lock.unlock(); +} +}); + +heldblocklocks.add(lock); +if (mode != BlockAccessModesEnum.WRITE) { egy +if (block.getVersion().get() != expvalue) { +unlockAllLocks(); +return false; +} +} +synchronized (adapter) { +block.setOwner(this); +} + +return true; +} else { +getContentionManager().resolveConflict(this, block.getOwner()); +} +} +return false; +}*/ +// } +//expvalue = ((Integer) value.getBlockversions().get(it)).intValue(); //for versioning strategy + /*if (!(value.isValidatelocaloffset())) { +if (((BlockAccessModesEnum) (value.getAccesedblocks().get(blockno))) != BlockAccessModesEnum.WRITE) { //versioning strategy + +/if (blockobj.getVersion().get() == expvalue) { + +ok = this.lock(blockobj, value.adapter, (BlockAccessModesEnum) (value.getAccesedblocks().get(blockno)), expvalue); +if (ok == false) { +// unlockAllLocks(); +break; +} +} else { +ok = false; +break; +} +} else { + +ok = this.lock(blockobj, value.adapter, (BlockAccessModesEnum) (value.getAccesedblocks().get(blockno)), expvalue); +if (ok == false) { +break; +} +} +} + + +if (!(ok)) { +unlockAllLocks(); +throw new AbortedException(); +}*/ diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java index 8c4a31a7..2e460d66 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java @@ -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= 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; +}*/ -- 2.34.1