From b37b75fcdfb0773d444d0ff31f98775adcbefda5 Mon Sep 17 00:00:00 2001 From: navid Date: Wed, 26 Nov 2008 19:42:56 +0000 Subject: [PATCH] *** empty log message *** --- .../TransactionalIO/dist/TransactionalIO.jar | Bin 152858 -> 152620 bytes .../benchmarks/MainforLocks.java | 7 +- .../TransactionalIO/benchmarks/benchmark.java | 5 +- .../benchmarks/lockthread1.java | 2 +- .../core/ExtendedTransaction.java | 80 ++- .../core/TransactionalFile.java | 469 +++++++++--------- 6 files changed, 265 insertions(+), 298 deletions(-) diff --git a/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar b/Robust/Transactions/TransactionalIO/dist/TransactionalIO.jar index ee602652716c101db6cc1c1948166b66351270ef..51b9a453168352a66d6fd3bb841a2966e8fbd830 100644 GIT binary patch delta 18693 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 delta 18790 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 E9}b%V5dZ)H diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/MainforLocks.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/MainforLocks.java index e74f4978..1ff5da75 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/MainforLocks.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/MainforLocks.java @@ -8,6 +8,7 @@ package TransactionalIO.benchmarks; import TransactionalIO.core.TransactionalFile; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.RandomAccessFile; import java.util.logging.Level; import java.util.logging.Logger; @@ -130,11 +131,11 @@ public class MainforLocks { System.out.println((endttime - starttime) / 1000000); int index =97; for (int j = 0; j < 26; j++) { - ((TransactionalFile)(benchmark.m.get(String.valueOf((char) (index+j))))).close(); + ((RandomAccessFile)(benchmark.m.get(String.valueOf((char) (index+j))))).close(); } - } catch (InterruptedException ex) { + } catch (IOException ex) { Logger.getLogger(MainforLocks.class.getName()).log(Level.SEVERE, null, ex); - } catch (FileNotFoundException ex) { + } catch (InterruptedException ex) { Logger.getLogger(MainforLocks.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/benchmark.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/benchmark.java index 1e848a4a..c08091c1 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/benchmark.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/benchmark.java @@ -236,9 +236,12 @@ public class benchmark { int index = 97; for (int i = 0; i < 26; i++) { - m.put(String.valueOf((char) (index+i)), new TransactionalFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/" + m.put(String.valueOf((char) (index+i)), new TransactionalFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/" + String.valueOf((char) (index+i)) + ".text", "rw")); count++; + /* m.put(String.valueOf((char) (index+i)), new RandomAccessFile("/scratch/TransactionalIO/PureIOBenchmarkFiles/" ++ String.valueOf((char) (index+i)) + ".text", "rw")); + count++;*/ } count = 0; m2 = Collections.synchronizedMap(hotwords); diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/lockthread1.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/lockthread1.java index 9d5ca4dc..787f576f 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/lockthread1.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/benchmarks/lockthread1.java @@ -69,7 +69,7 @@ public class lockthread1 extends Thread{ byte[] towrite = new byte[String.valueOf(holder, 0, i).length()]; towrite = String.valueOf(holder, 0, i).getBytes(); try { - ((TransactionalFile) (benchmark.m.get(String.valueOf(holder,0,i).toLowerCase().substring(0, 1)))).file.write(towrite); + ((RandomAccessFile) (benchmark.m.get(String.valueOf(holder,0,i).toLowerCase().substring(0, 1)))).write(towrite); } catch (IOException ex) { Logger.getLogger(thread1.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java index 9a9ce7b6..916298e5 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/ExtendedTransaction.java @@ -71,7 +71,7 @@ public class ExtendedTransaction implements TransactionStatu { public HashMap merge_for_writes_done; private HashMap writeBuffer; private ContentionManager contentionmanager; - private /*volatile*/ Status status; + private volatile Status status; private int id; public ExtendedTransaction() { @@ -114,14 +114,11 @@ public class ExtendedTransaction implements TransactionStatu { public void abort() { synchronized (this) { - this.status = Status.ABORTED; if (this.memorystate != null && !(this.memorystate).isAborted()) { this.memorystate.abortThisSystem(); } - } - } public Status getStatus() { @@ -209,33 +206,21 @@ public class ExtendedTransaction implements TransactionStatu { TreeMap hm = getSortedFileAccessMap(AccessedFiles); 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() && this.getStatus() == Status.ACTIVE) { TransactionalFile value = (TransactionalFile) it.next(); - while (this.getStatus() == Status.ACTIVE) { - value.offsetlock.lock(); - - heldoffsetlocks.add(value.offsetlock); - break; - - } - if (this.getStatus() != Status.ACTIVE) { - - - return false; - } + value.offsetlock.lock(); + heldoffsetlocks.add(value.offsetlock); + break; } - } - if (this.getStatus() != Status.ACTIVE) { - + if (this.getStatus() != Status.ACTIVE) { return false; } return true; @@ -250,13 +235,11 @@ public class ExtendedTransaction implements TransactionStatu { lock = block.getLock().writeLock(); } - - while (this.getStatus() == Status.ACTIVE) { - lock.lock(); - heldblocklocks.add(lock); - return true; - } - return false; + + lock.lock(); + heldblocklocks.add(lock); + return true; + } public void prepareCommit() { @@ -324,24 +307,24 @@ 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 = inodestate.getBlockDataStructure(num); - - ok = this.lockBlock(blockobj, (BlockAccessModesEnum) vec2.get(num)); - if (ok == false) { - break; + BlockDataStructure[] blocks = new BlockDataStructure[100]; + if (this.getStatus() == Status.ACTIVE) + 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() && this.getStatus() == Status.ACTIVE) { + Integer num = (Integer) iter2.next(); + BlockDataStructure blockobj = inodestate.getBlockDataStructure(num); + this.lockBlock(blockobj, (BlockAccessModesEnum) vec2.get(num)); + } } - } if (this.getStatus() != Status.ACTIVE) { @@ -393,14 +376,14 @@ public class ExtendedTransaction implements TransactionStatu { Lock lock = (Lock) it.next(); lock.unlock(); } - heldblocklocks.clear(); + // heldblocklocks.clear(); it = heldoffsetlocks.iterator(); while (it.hasNext()) { ReentrantLock lock = (ReentrantLock) it.next(); lock.unlock(); } - heldoffsetlocks.clear(); + // heldoffsetlocks.clear(); } public void abortAllReaders() { @@ -440,8 +423,8 @@ public class ExtendedTransaction implements TransactionStatu { Integer num = (Integer) it2.next(); if (vec2.get(num) != BlockAccessModesEnum.READ) { - BlockDataStructure blockobj = (BlockDataStructure) inodestate.getBlockDataStructure(num);//lockmap.get(num); - + BlockDataStructure blockobj = (BlockDataStructure) inodestate.getBlockDataStructure(num); + //lockmap.get(num); Iterator it4 = blockobj.getReaders().iterator(); // from here for visible readers strategy while (it4.hasNext()) { @@ -452,7 +435,6 @@ public class ExtendedTransaction implements TransactionStatu { } } blockobj.getReaders().clear(); - } } diff --git a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java index 2e460d66..b0723a73 100644 --- a/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java +++ b/Robust/Transactions/TransactionalIO/src/TransactionalIO/core/TransactionalFile.java @@ -34,6 +34,7 @@ import java.util.logging.Logger; 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); @@ -106,7 +107,8 @@ public class TransactionalFile implements Comparable { } } - public int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) { + + public int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) { try { return nativepwrite(buff, offset, buff.length, file.getFD()); } catch (IOException ex) { @@ -144,7 +146,6 @@ public class TransactionalFile implements Comparable { public long getFilePointer() { ExtendedTransaction me = Wrapper.getTransaction(); - TransactionLocalFileAttributes tmp = null; if (me == null) { return non_Transactional_getFilePointer(); @@ -154,7 +155,7 @@ public class TransactionalFile implements Comparable { me.addFile(this, 0); } - tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); + TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)) { tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY); @@ -163,14 +164,13 @@ public class TransactionalFile implements Comparable { 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) { @@ -200,21 +200,22 @@ public class TransactionalFile implements Comparable { if (me == null) { non_Transactional_Seek(offset); return; - } 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) { - tmp.setOffsetdependency(OffsetDependency.NO_DEPENDENCY); - } else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) { - tmp.setOffsetdependency(OffsetDependency.WRITE_DEPENDENCY_2); - } - tmp.setUnknown_inital_offset_for_write(false); - tmp.setLocaloffset(offset); + if (!(me.getGlobaltoLocalMappings().containsKey(this))) { + me.addFile(this, offset); } + + TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); + + if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) { + tmp.setOffsetdependency(OffsetDependency.NO_DEPENDENCY); + } else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) { + tmp.setOffsetdependency(OffsetDependency.WRITE_DEPENDENCY_2); + } + tmp.setUnknown_inital_offset_for_write(false); + tmp.setLocaloffset(offset); + } public int read(byte[] b) { @@ -227,186 +228,170 @@ public class TransactionalFile implements Comparable { return non_Transactional_Read(b); } + if (!(me.getGlobaltoLocalMappings().containsKey(this))) { me.addFile(this, 0); } - - if (me.getGlobaltoLocalMappings().containsKey(this)) { - TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); - tmp.setUnknown_inital_offset_for_write(false); + // if (me.getGlobaltoLocalMappings().containsKey(this)) { - 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); + TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this); + tmp.setUnknown_inital_offset_for_write(false); - if (dep != OffsetDependency.WRITE_DEPENDENCY_2) { - tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset()); - } + 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 (!(this.committedoffset.getOffsetReaders().contains(me))) { - this.committedoffset.getOffsetReaders().add(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(); } + offsetlock.unlock(); + } + if (me.getWriteBuffer().get(inode) != null) { makeWritestDependent(me); + } + if ((Boolean) me.merge_for_writes_done.get(inode) == Boolean.FALSE) { + mergeWrittenData(me); + } + long loffset = tmp.getLocaloffset(); + markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.READ); - 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 = null; + if ((me.getWriteBuffer().get(this.inode)) != null) { + writebuffer = (Vector) (me.getWriteBuffer().get(this.inode)); + } else { + result = readFromFile(me, b, tmp); + return result; + //writebuffer = new Vector(); + //me.getWriteBuffer().put(this.inode, writebuffer); - Vector writebuffer; - if ((me.getWriteBuffer().get(this.inode)) != null) { - writebuffer = (Vector) (me.getWriteBuffer().get(this.inode)); - } else { - writebuffer = new Vector(); - me.getWriteBuffer().put(this.inode, writebuffer); - } - Range readrange = new Range(loffset, loffset + size); - Range writerange = null; - Range[] intersectedrange = new Range[writebuffer.size()]; - WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()]; + } + Range readrange = new Range(loffset, loffset + size); + Range writerange = null; + Range[] intersectedrange = new Range[writebuffer.size()]; + WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()]; - int counter = 0; - boolean in_local_buffer = false; + int counter = 0; + boolean in_local_buffer = false; - Iterator it = writebuffer.iterator(); - while (it.hasNext()) { + Iterator it = writebuffer.iterator(); + while (it.hasNext()) { - WriteOperations wrp = (WriteOperations) it.next(); - writerange = wrp.getRange(); - if (writerange.includes(readrange)) { - markedwriteop[counter] = wrp; - in_local_buffer = true; - break; - } + WriteOperations wrp = (WriteOperations) it.next(); + writerange = wrp.getRange(); + if (writerange.includes(readrange)) { + markedwriteop[counter] = wrp; + in_local_buffer = true; + break; + } - if (writerange.hasIntersection(readrange)) { - intersectedrange[counter] = readrange.intersection(writerange); - markedwriteop[counter] = wrp; + if (writerange.hasIntersection(readrange)) { + intersectedrange[counter] = readrange.intersection(writerange); + markedwriteop[counter] = wrp; - counter++; - } + counter++; } + } - if (in_local_buffer) { // the read one from local buffer + if (in_local_buffer) { // the read one from local buffer - result = readFromBuffer(b, tmp, markedwriteop[counter], writerange); - return result; - - } else { + result = readFromBuffer(b, tmp, markedwriteop[counter], writerange); + return result; - if (counter == 0) { // all the read straight from file + } else { - result = readFromFile(me, b, tmp); - } else { // some parts from file others from buffer + if (counter == 0) { // all the read straight from file - 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(); - } - System.arraycopy(copydata, (int) (intersectedrange[i].getStart() - markedwriteop[i].getRange().getStart()), b, (int) (intersectedrange[i].getStart() - readrange.getStart()), (int) (Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart())); - result += Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart(); - } + result = readFromFile(me, b, tmp); + } else { // some parts from file others from buffer - 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()); - int en = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getEnd()); - for (int j = st; j <= en; j++) { - if (!(occupiedblocks.contains(Integer.valueOf(j)))) { - occupiedblocks.add(Integer.valueOf(j)); - } - } + 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(); } + System.arraycopy(copydata, (int) (intersectedrange[i].getStart() - markedwriteop[i].getRange().getStart()), b, (int) (intersectedrange[i].getStart() - readrange.getStart()), (int) (Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart())); + result += Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart(); + } - // 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))); - - 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(); + 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()); + int en = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getEnd()); + for (int j = st; j <= en; j++) { + if (!(occupiedblocks.contains(Integer.valueOf(j)))) { + occupiedblocks.add(Integer.valueOf(j)); } } + } - for (int i = 0; i < non_intersected_ranges.length; i++) { - // 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); - // } - } + // lockOffset(me); + + me.getHeldoffsetlocks().add(offsetlock); + BlockDataStructure block; + int k; + for (k = 0; k < occupiedblocks.size() && me.getStatus() == Status.ACTIVE; k++) { // locking the block locks + block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k))); - if (me.getStatus() == Status.ABORTED) { - for (int k = 0; k < occupiedblocks.size(); k++) { + block.getLock().readLock().lock(); + if (!(block.getReaders().contains(me))) { + block.getReaders().add(me); + } + + } + if (k