From 4f1d067f89a872866ac2505d5b2626a1b233a106 Mon Sep 17 00:00:00 2001 From: navid Date: Mon, 24 Nov 2008 20:46:53 +0000 Subject: [PATCH] *** empty log message *** --- .../TransactionalIO/dist/TransactionalIO.jar | Bin 154163 -> 153540 bytes .../core/ExtendedTransaction.java | 72 +-- .../core/TransactionalFile.java | 535 ++++++++---------- .../TransactionalIO/core/WriteOperations.java | 4 +- 4 files changed, 291 insertions(+), 320 deletions(-) diff --git a/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar b/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar index f34c2dbd32cc8f441ec15fc74e42d6a8ce292cc9..df7a33906d5685a8257043e6ed7dc2e84642c38f 100644 GIT binary patch delta 18874 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 F{2#t5lt=&o delta 19281 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 OLnW%7=WstU(Eks6Pg<7% diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java index d04a8720..e7f11488 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java @@ -45,9 +45,9 @@ public class ExtendedTransaction implements TransactionStatu { private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd); - // { - // System.load("/home/navid/libkooni.so"); - // } + { + System.load("/home/navid/libkooni.so"); + } private boolean flag = true; public TransactionStatu memorystate; @@ -253,31 +253,20 @@ public class ExtendedTransaction implements TransactionStatu { - public void addFile(TransactionalFile tf, long offstenumber) { + public void addFile(TransactionalFile tf, long offsetnumber/*, TransactionLocalFileAttributes tmp*/) { - - //tf.lockOffset(this); - - TransactionLocalFileAttributes tmp = new TransactionLocalFileAttributes(offstenumber/*, tf.getInodestate().commitedfilesize.get()*/); - - //tf.offsetlock.unlock(); - - - - Vector dummy; - - if (AccessedFiles.containsKey(tf.getInode())){ - dummy = (Vector) AccessedFiles.get(tf.getInode()); - } - else{ - dummy = new Vector(); - AccessedFiles.put(tf.getInode(), dummy); - } - - dummy.add(tf); - GlobaltoLocalMappings.put(tf, tmp); - merge_for_writes_done.put(tf.getInode(), Boolean.TRUE); + TransactionLocalFileAttributes tmp = new TransactionLocalFileAttributes(offsetnumber/*, tf.getInodestate().commitedfilesize.get()*/); + Vector dummy; + if (AccessedFiles.containsKey(tf.getInode())) { + dummy = (Vector) AccessedFiles.get(tf.getInode()); + } else { + dummy = new Vector(); + AccessedFiles.put(tf.getInode(), dummy); + } + dummy.add(tf); + GlobaltoLocalMappings.put(tf, tmp); + merge_for_writes_done.put(tf.getInode(), Boolean.TRUE); } @@ -394,16 +383,31 @@ public class ExtendedTransaction implements TransactionStatu { if (mode == BlockAccessModesEnum.READ){ - lock = block.getLock().readLock(); - } + 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); } return false; @@ -510,11 +514,11 @@ public class ExtendedTransaction implements TransactionStatu { long end; //synchronized(value.getOwnertransactionalFile().getCommitedoffset()){ - start = value.getRange().getStart() - value.getTFA().getCopylocaloffset() + value.getOwnerTF().getCommitedoffset().getOffsetnumber(); - end = value.getRange().getEnd() - value.getTFA().getCopylocaloffset() + value.getOwnerTF().getCommitedoffset().getOffsetnumber(); - if (value.getTFA().isUnknown_inital_offset_for_write()){ - value.getTFA().setLocaloffset(value.getTFA().getLocaloffset() - value.getTFA().getCopylocaloffset() + value.getOwnerTF().getCommitedoffset().getOffsetnumber()); - value.getTFA().setUnknown_inital_offset_for_write(false); + 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); } //} @@ -670,7 +674,7 @@ public class ExtendedTransaction implements TransactionStatu { // 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.getOwnerTF().file); + invokeNativepwrite(bytedata, writeop.getRange().getStart(), bytedata.length, writeop.getOwnertransactionalFile().file); // System.out.println(Thread.currentThread() + " " + bytedata); // } catch (IOException ex) { diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java index 435fa3d9..8c4a31a7 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java @@ -13,6 +13,7 @@ import TransactionalIO.benchmarks.benchmark; import TransactionalIO.core.ExtendedTransaction.Status; import TransactionalIO.interfaces.BlockAccessModesEnum; import TransactionalIO.interfaces.OffsetDependency; +import com.sun.org.apache.bcel.internal.generic.IFEQ; import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; @@ -39,11 +40,10 @@ import sun.misc.ConditionLock; public class TransactionalFile implements Comparable{ - private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd); + private native int nativepread(byte buff[], long offset, int size, FileDescriptor fd); { - System.load("/home/navid/libkooni.so"); } @@ -52,7 +52,8 @@ public class TransactionalFile implements Comparable{ private INode inode; private int sequenceNum = 0; public static int currenSeqNumforInode = 0; - + /* public AtomicLong commitedoffset; + public AtomicLong commitedfilesize;*/ public boolean to_be_created = false; public boolean writemode = false; public boolean appendmode = false; @@ -88,7 +89,7 @@ public class TransactionalFile implements Comparable{ sequenceNum = inodestate.seqNum; inodestate.seqNum++; - + if (mode.equals("rw")) { writemode = true; } else if (mode.equals("a")) { @@ -97,16 +98,7 @@ public class TransactionalFile implements Comparable{ if (inodestate != null) { synchronized (inodestate) { - try { - if (!appendmode) { - committedoffset = new GlobalOffset(0); - } else { - committedoffset = new GlobalOffset(file.length()); - } - - } catch (IOException ex) { - Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex); - } + committedoffset = new GlobalOffset(0); } } @@ -123,19 +115,6 @@ public class TransactionalFile implements Comparable{ } } - - 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() { @@ -151,12 +130,10 @@ public class TransactionalFile implements Comparable{ return inodestate; } - public INode getInode() { return inode; } - - + public void close() { try { file.close(); @@ -165,7 +142,7 @@ public class TransactionalFile implements Comparable{ } } - public long getFilePointer(){ + public long getFilePointer(){ ExtendedTransaction me = Wrapper.getTransaction(); TransactionLocalFileAttributes tmp = null; @@ -175,7 +152,7 @@ public class TransactionalFile implements Comparable{ } if (!(me.getGlobaltoLocalMappings().containsKey(this))){ - me.addFile(this, 0); + me.addFile(this, 0); } tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); @@ -183,29 +160,33 @@ public class TransactionalFile implements Comparable{ 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) - { + { + it = ((Vector) (me.getWriteBuffer().get(inode))).iterator(); while (it.hasNext()){ WriteOperations wrp = (WriteOperations) it.next(); - if (wrp.getTFA() == 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()); } - } + } + } @@ -215,9 +196,6 @@ public class TransactionalFile implements Comparable{ public void seek(long offset) { - if (appendmode) { - throw new PanicException("Cannot seek into a file opened in append mode"); - } ExtendedTransaction me = Wrapper.getTransaction(); if (me == null) { @@ -240,73 +218,56 @@ public class TransactionalFile implements Comparable{ tmp.setUnknown_inital_offset_for_write(false); tmp.setLocaloffset(offset); - } } public int read(byte[] b) { - + + ExtendedTransaction me = Wrapper.getTransaction(); 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)){ - + TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); tmp.setUnknown_inital_offset_for_write(false); - //make this transaction read dependent on this descriptor if it is not so already - if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.offsetdependency == OffsetDependency.NO_ACCESS) || (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_2)){ - + 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); - makeDependentonOffet(me, tmp); + + 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(); } - - // make all write operations by any transaction to this offset absolute and those transaction read - //dependent on the offset - Iterator it; - if (me.getWriteBuffer().get(inode) != null) - { - it = ((Vector) (me.getWriteBuffer().get(inode))).iterator(); - while (it.hasNext()){ - - WriteOperations wrp = (WriteOperations) it.next(); - if (wrp.isUnknownoffset()){ - wrp.setUnknownoffset(false); - - wrp.getOwnerTF().lockOffset(me); - makeWriteAbsolute(me, wrp); - wrp.getOwnerTF().offsetlock.unlock(); - - markAccessedBlocks(me, (int)wrp.getRange().getStart(), (int)(wrp.getRange().getEnd() - wrp.getRange().getStart()), BlockAccessModesEnum.WRITE); - - } - } - } - /* if (!(me.isWritesmerged())){ - mergeWrittenData(); - }*/ - - // merge the write by this transation to this descriptor before start reading from it + makeWritestDependent(me); + + if ((Boolean)me.merge_for_writes_done.get(inode) == Boolean.FALSE){ mergeWrittenData(me); } - - - // find the intersections of the data o be read with the - // transactions local buffer if any at all long loffset = tmp.getLocaloffset(); markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.READ); + Vector writebuffer; if ((me.getWriteBuffer().get(this.inode)) != null) writebuffer = (Vector) (me.getWriteBuffer().get(this.inode)); @@ -319,55 +280,44 @@ public class TransactionalFile implements Comparable{ Range[] intersectedrange = new Range[writebuffer.size()]; WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()]; - int number_of_intersections = 0; - boolean data_in_local_buffer = false; + int counter = 0; + boolean in_local_buffer = false; - it = writebuffer.iterator(); + Iterator it = writebuffer.iterator(); while (it.hasNext()) { WriteOperations wrp = (WriteOperations) it.next(); writerange = wrp.getRange(); if (writerange.includes(readrange)) { - markedwriteop[number_of_intersections] = wrp; - data_in_local_buffer = true; + markedwriteop[counter] = wrp; + in_local_buffer = true; break; } if (writerange.hasIntersection(readrange)) { - intersectedrange[number_of_intersections] = readrange.intersection(writerange); - markedwriteop[number_of_intersections] = wrp; + intersectedrange[counter] = readrange.intersection(writerange); + markedwriteop[counter] = wrp; - number_of_intersections++; + counter++; } } - - - if (data_in_local_buffer) { - // the to be read offset is written previously by the transaction itself - // so the read is done from localbuffer - result = readFromBuffer(b, tmp, markedwriteop[number_of_intersections],writerange); + if (in_local_buffer) { // the read one from local buffer + result = readFromBuffer(b, tmp, markedwriteop[counter],writerange); return result; } else{ - if (number_of_intersections == 0) { - // the whole range to be read should be donefrom the file itself, + if (counter == 0) { // all the read straight from file result = readFromFile(me, b, tmp); } - - else { - //some of the parts to read are in local buffer some should be done - //from the file - for (int i = 0; i < number_of_intersections; i++) { - - + 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]; - for (int j = 0; j < data.length; j++) { copydata[j] = data[j].byteValue(); } @@ -375,7 +325,7 @@ public class TransactionalFile implements Comparable{ result += Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart(); } - Range[] non_intersected_ranges = readrange.minus(intersectedrange, number_of_intersections); + Range[] non_intersected_ranges = readrange.minus(intersectedrange, counter); Vector occupiedblocks = new Vector(); for (int i = 0; i < non_intersected_ranges.length; i++) { int st = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getStart()); @@ -387,50 +337,71 @@ public class TransactionalFile implements Comparable{ } } - - 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) { - - BlockDataStructure 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); - } - me.getHeldblocklocks().add(block.getLock().readLock()); - break; - } + if (!(block.getReaders().contains(me))){ + block.getReaders().add(me); + } + locked = true; + //me.getHeldblocklocks().add(block.getLock().readLock()); + break; + } if (me.getStatus() == Status.ABORTED) { - throw new AbortedException(); + 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 { - //invokeNativepread(b, non_intersected_ranges[i].getStart(), size); + 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); } } - me.unlockAllLocks(); + + if (me.getStatus() == Status.ABORTED) { + for (int k = 0; k < occupiedblocks.size(); 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(); + } + // me.unlockAllLocks(); + offsetlock.unlock(); tmp.setLocaloffset(tmp.getLocaloffset() + result); } - + return result; } } else { // add to the readers list + me.addFile(this, 0); return read(b); } @@ -449,14 +420,16 @@ public class TransactionalFile implements Comparable{ if (me == null) // not a transaction - { + { + non_Transactional_Write(data); return; } - - if (me.getGlobaltoLocalMappings().containsKey(this)) - { + if (me.getGlobaltoLocalMappings().containsKey(this)) // + { + + Byte[] by = new Byte[size]; for (int i = 0; i < size; i++) { by[i] = Byte.valueOf(data[i]); @@ -469,7 +442,7 @@ public class TransactionalFile implements Comparable{ } 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); @@ -479,15 +452,16 @@ public class TransactionalFile implements Comparable{ tmp.setLocaloffset(tmp.getLocaloffset() + by.length); me.merge_for_writes_done.put(inode, Boolean.FALSE); + if (!(tmp.isUnknown_inital_offset_for_write())){ markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.WRITE); + } - if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) tmp.offsetdependency = OffsetDependency.WRITE_DEPENDENCY_1; - + } else { - me.addFile(this, 0); + me.addFile(this, 0); write(data); } } @@ -515,44 +489,64 @@ public class TransactionalFile implements Comparable{ map.put(Integer.valueOf(i), mode); } } - } - - - // reads the data directly from file, + 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++) { - lockBlock(me, st, k); - } - if (me.getStatus() == Status.ABORTED) { - for (int i=st; i<=end; i++){ - block = this.inodestate.getBlockDataStructure(Integer.valueOf(i)); + 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 (me.getStatus() == Status.ABORTED) { + int m; + if (locked){ + m = k+1; + } + else + m = k; + for (int i=st; i