2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
5 package TransactionalIO.core;
9 import TransactionalIO.Utilities.Range;
10 import TransactionalIO.exceptions.AbortedException;
11 import TransactionalIO.exceptions.PanicException;
12 import TransactionalIO.benchmarks.benchmark;
13 import TransactionalIO.core.ExtendedTransaction.Status;
14 import TransactionalIO.interfaces.BlockAccessModesEnum;
15 import TransactionalIO.interfaces.OffsetDependency;
16 import com.sun.org.apache.bcel.internal.generic.IFEQ;
18 import java.io.FileDescriptor;
19 import java.io.FileNotFoundException;
20 import java.io.IOException;
21 import java.io.RandomAccessFile;
22 import java.nio.ByteBuffer;
23 import java.util.Collections;
24 import java.util.Iterator;
25 import java.util.SortedSet;
26 import java.util.TreeMap;
27 import java.util.TreeSet;
28 import java.util.Vector;
29 import java.util.concurrent.locks.Lock;
30 import java.util.concurrent.locks.ReentrantLock;
31 import java.util.logging.Level;
32 import java.util.logging.Logger;
33 import sun.misc.ConditionLock;
41 public class TransactionalFile implements Comparable{
44 private native int nativepread(byte buff[], long offset, int size, FileDescriptor fd);
47 System.load("/home/navid/libkooni.so");
51 public RandomAccessFile file;
53 private int sequenceNum = 0;
54 public static int currenSeqNumforInode = 0;
55 /* public AtomicLong commitedoffset;
56 public AtomicLong commitedfilesize;*/
57 public boolean to_be_created = false;
58 public boolean writemode = false;
59 public boolean appendmode = false;
60 public ReentrantLock offsetlock;
61 private GlobalOffset committedoffset;
62 private GlobalINodeState inodestate ;
65 public TransactionalFile(String filename, String mode) {
68 File f = new File(filename);
70 if ((!(f.exists()))) {
78 offsetlock = new ReentrantLock();
79 file = new RandomAccessFile(f, mode);
80 } catch (FileNotFoundException ex) {
82 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
86 inode = TransactionalFileWrapperFactory.getINodefromFileName(filename);
87 inodestate = TransactionalFileWrapperFactory.createTransactionalFile(inode, filename, mode);
90 sequenceNum = inodestate.seqNum;
93 if (mode.equals("rw")) {
95 } else if (mode.equals("a")) {
99 if (inodestate != null) {
100 synchronized (inodestate) {
101 committedoffset = new GlobalOffset(0);
108 private int invokeNativepread(byte buff[], long offset, int size) {
110 return nativepread(buff, offset, size, file.getFD());
111 } catch (IOException ex) {
113 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
120 public int getSequenceNum() {
125 public GlobalOffset getCommitedoffset() {
126 return committedoffset;
129 public GlobalINodeState getInodestate() {
133 public INode getInode() {
137 public void close() {
140 } catch (IOException ex) {
141 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
145 public long getFilePointer(){
147 ExtendedTransaction me = Wrapper.getTransaction();
148 TransactionLocalFileAttributes tmp = null;
151 return non_Transactional_getFilePointer();
154 if (!(me.getGlobaltoLocalMappings().containsKey(this))){
158 tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
159 if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)){
160 tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
165 if (!(this.committedoffset.getOffsetReaders().contains(me))){
166 this.committedoffset.getOffsetReaders().add(me);
170 tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
171 target = this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset();
177 if ((me.getWriteBuffer().get(inode)) != null)
180 it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
181 while (it.hasNext()){
182 WriteOperations wrp = (WriteOperations) it.next();
183 if (wrp.getBelongingto()== tmp && wrp.isUnknownoffset())
184 wrp.setUnknownoffset(false);
185 wrp.getRange().setStart(target + wrp.getRange().getStart());
186 wrp.getRange().setEnd(target + wrp.getRange().getEnd());
193 tmp.setUnknown_inital_offset_for_write(false);
194 return tmp.getLocaloffset();
197 public void seek(long offset) {
199 ExtendedTransaction me = Wrapper.getTransaction();
202 non_Transactional_Seek(offset);
207 TransactionLocalFileAttributes tmp = null;
208 if (!(me.getGlobaltoLocalMappings().containsKey(this))){
209 me.addFile(this, offset);
211 tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
213 if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)
214 tmp.setOffsetdependency(OffsetDependency.NO_DEPENDENCY);
216 else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1)
217 tmp.setOffsetdependency(OffsetDependency.WRITE_DEPENDENCY_2);
219 tmp.setUnknown_inital_offset_for_write(false);
220 tmp.setLocaloffset(offset);
224 public int read(byte[] b) {
227 ExtendedTransaction me = Wrapper.getTransaction();
230 if (me == null) { // not a transaction, but any I/O operation even though within a non-transaction is considered a single opertion transactiion
231 return non_Transactional_Read(b);
234 if (me.getGlobaltoLocalMappings().containsKey(this)){
236 TransactionLocalFileAttributes tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
237 tmp.setUnknown_inital_offset_for_write(false);
239 OffsetDependency dep = tmp.getOffsetdependency();
240 if ((dep == OffsetDependency.WRITE_DEPENDENCY_1) ||
241 (dep == OffsetDependency.NO_ACCESS) ||
242 (dep == OffsetDependency.WRITE_DEPENDENCY_2))
244 tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
247 if (dep != OffsetDependency.WRITE_DEPENDENCY_2){
248 tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
251 if (!(this.committedoffset.getOffsetReaders().contains(me))){
252 this.committedoffset.getOffsetReaders().add(me);
260 makeWritestDependent(me);
263 if ((Boolean)me.merge_for_writes_done.get(inode) == Boolean.FALSE){
264 mergeWrittenData(me);
267 long loffset = tmp.getLocaloffset();
268 markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.READ);
272 if ((me.getWriteBuffer().get(this.inode)) != null)
273 writebuffer = (Vector) (me.getWriteBuffer().get(this.inode));
275 writebuffer = new Vector();
276 me.getWriteBuffer().put(this.inode, writebuffer);
278 Range readrange = new Range(loffset, loffset + size);
279 Range writerange = null;
280 Range[] intersectedrange = new Range[writebuffer.size()];
281 WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()];
284 boolean in_local_buffer = false;
287 Iterator it = writebuffer.iterator();
288 while (it.hasNext()) {
290 WriteOperations wrp = (WriteOperations) it.next();
291 writerange = wrp.getRange();
292 if (writerange.includes(readrange)) {
293 markedwriteop[counter] = wrp;
294 in_local_buffer = true;
298 if (writerange.hasIntersection(readrange)) {
299 intersectedrange[counter] = readrange.intersection(writerange);
300 markedwriteop[counter] = wrp;
306 if (in_local_buffer) { // the read one from local buffer
307 result = readFromBuffer(b, tmp, markedwriteop[counter],writerange);
313 if (counter == 0) { // all the read straight from file
314 result = readFromFile(me, b, tmp);
317 else { // some parts from file others from buffer
318 for (int i = 0; i < counter; i++) {
319 Byte[] data = markedwriteop[i].getData();
320 byte[] copydata = new byte[data.length];
321 for (int j = 0; j < data.length; j++) {
322 copydata[j] = data[j].byteValue();
324 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()));
325 result += Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart();
328 Range[] non_intersected_ranges = readrange.minus(intersectedrange, counter);
329 Vector occupiedblocks = new Vector();
330 for (int i = 0; i < non_intersected_ranges.length; i++) {
331 int st = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getStart());
332 int en = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getEnd());
333 for (int j = st; j <= en; j++) {
334 if (!(occupiedblocks.contains(Integer.valueOf(j)))) {
335 occupiedblocks.add(Integer.valueOf(j));
341 me.getHeldoffsetlocks().add(offsetlock);
342 boolean locked = false;
343 BlockDataStructure block;
344 for (int k = 0; k < occupiedblocks.size(); k++) { // locking the block locks
346 while (me.getStatus() == Status.ACTIVE) {
347 block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
348 block.getLock().readLock().lock();
349 if (!(block.getReaders().contains(me))){
350 block.getReaders().add(me);
353 //me.getHeldblocklocks().add(block.getLock().readLock());
356 if (me.getStatus() == Status.ABORTED) {
363 for (int i = 0; i < m; i++) {
364 block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));
365 me.getHeldblocklocks().add(block.getLock().readLock());
369 throw new AbortedException();
373 for (int i = 0; i < non_intersected_ranges.length; i++) {
376 file.seek(non_intersected_ranges[i].getStart());
377 int tmpsize = file.read(b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart()));
379 } catch (IOException ex) {
380 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
384 if (me.getStatus() == Status.ABORTED) {
385 for (int k = 0; k < occupiedblocks.size(); k++) {
386 block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));
387 me.getHeldblocklocks().add(block.getLock().readLock());
389 throw new AbortedException();
391 for (int k = 0; k < occupiedblocks.size(); k++) {
392 block = this.inodestate.getBlockDataStructure((Integer)(occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
393 block.getLock().readLock().unlock();
395 // me.unlockAllLocks();
397 tmp.setLocaloffset(tmp.getLocaloffset() + result);
403 } else { // add to the readers list
411 public void write(byte[] data) throws IOException {
414 throw new IOException();
418 ExtendedTransaction me = Wrapper.getTransaction();
419 int size = data.length;
422 if (me == null) // not a transaction
425 non_Transactional_Write(data);
429 if (me.getGlobaltoLocalMappings().containsKey(this)) //
433 Byte[] by = new Byte[size];
434 for (int i = 0; i < size; i++) {
435 by[i] = Byte.valueOf(data[i]);
437 TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getGlobaltoLocalMappings().get(this)));
440 if (((Vector)(me.getWriteBuffer().get(this.inode))) != null){
441 dummy = new Vector((Vector)(me.getWriteBuffer().get(this.inode)));
444 dummy = new Vector();
446 dummy.add(new WriteOperations(by, new Range(tmp.getLocaloffset(), tmp.getLocaloffset() + by.length), tmp.isUnknown_inital_offset_for_write(), this, tmp));
447 me.getWriteBuffer().put(this.inode, dummy);
449 long loffset = tmp.getLocaloffset();
452 tmp.setLocaloffset(tmp.getLocaloffset() + by.length);
454 me.merge_for_writes_done.put(inode, Boolean.FALSE);
456 if (!(tmp.isUnknown_inital_offset_for_write())){
457 markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.WRITE);
460 if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)
461 tmp.offsetdependency = OffsetDependency.WRITE_DEPENDENCY_1;
470 private void markAccessedBlocks(ExtendedTransaction me,long loffset, int size, BlockAccessModesEnum mode){
474 if (me.getAccessedBlocks().get(this.getInode()) != null)
475 map = (TreeMap) me.getAccessedBlocks().get(this.getInode());
478 me.getAccessedBlocks().put(this.inode, map);
480 int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(loffset);
481 int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(loffset, size);
482 for (int i = startblock; i <= targetblock; i++) {
483 if (map.containsKey(Integer.valueOf(i))){
484 if (map.get(Integer.valueOf(i)) != mode){
485 map.put(Integer.valueOf(i), BlockAccessModesEnum.READ_WRITE);
489 map.put(Integer.valueOf(i), mode);
494 private int readFromFile(ExtendedTransaction me, byte[] readdata, TransactionLocalFileAttributes tmp) {
496 int st = FileBlockManager.getCurrentFragmentIndexofTheFile(tmp.getLocaloffset());
497 int end = FileBlockManager.getTargetFragmentIndexofTheFile(tmp.getLocaloffset(), readdata.length);
499 BlockDataStructure block = null;
500 boolean locked = false;
501 for (int k = st; k <= end; k++) {
502 while (me.getStatus() == Status.ACTIVE) {
504 block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
506 block.getLock().readLock().lock();
508 if (!(block.getReaders().contains(me))){
509 block.getReaders().add(me);
514 if (me.getStatus() == Status.ABORTED) {
521 for (int i=st; i<m; i++){
522 block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
523 me.getHeldblocklocks().add(block.getLock().readLock());
526 throw new AbortedException();
531 size = invokeNativepread(readdata, tmp.getLocaloffset(), readdata.length);
532 tmp.setLocaloffset(tmp.getLocaloffset() + size);
536 if (me.getStatus() == Status.ABORTED) {
537 for (int i=st; i<=end; i++){
538 block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
539 me.getHeldblocklocks().add(block.getLock().readLock());
541 throw new AbortedException();
543 for (int k = st; k <= end; k++) {
544 block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
545 block.getLock().readLock().unlock();
552 private int readFromBuffer(byte[] readdata, TransactionLocalFileAttributes tmp, WriteOperations wrp, Range writerange) {
553 long loffset = tmp.getLocaloffset();
555 Byte[] data = (Byte[]) wrp.getData();
556 byte[] copydata = new byte[data.length];
558 for (int i = 0; i < data.length; i++) {
559 copydata[i] = data[i].byteValue();
561 System.arraycopy(copydata, (int) (loffset - writerange.getStart()), readdata, 0, readdata.length);
562 tmp.setLocaloffset(tmp.getLocaloffset() + readdata.length);
563 return readdata.length;
567 public void simpleWritetoBuffer(Byte[] data, Range newwriterange, TreeMap tm) {
568 tm.put(newwriterange, data);
571 public void unlockLocks(Vector heldlocks) {
572 for (int i = 0; i < heldlocks.size(); i++) {
573 ((Lock) heldlocks.get(i)).unlock();
577 public void setInode(INode inode) {
581 public void lockOffset(ExtendedTransaction me){
582 boolean locked = false;
583 while (me.getStatus() == Status.ACTIVE) { //locking the offset
589 if (me.getStatus() != Status.ACTIVE){
591 me.getHeldoffsetlocks().add(offsetlock);
592 throw new AbortedException();
597 public void mergeWrittenData(ExtendedTransaction me/*TreeMap target, byte[] data, Range to_be_merged_data_range*/){
599 boolean flag = false;
600 Vector vec = (Vector) me.getWriteBuffer().get(this.inode);
601 Range intersectedrange = new Range(0, 0);
602 Iterator it1 = vec.iterator();
604 WriteOperations wrp2;
605 Vector toberemoved = new Vector();
606 while (it1.hasNext()) {
607 wrp = (WriteOperations) (it1.next());
609 if (toberemoved.contains(wrp)){
613 Iterator it2 = vec.listIterator();
614 while (it2.hasNext()) {
616 wrp2 = (WriteOperations) (it2.next());
618 if ((wrp2 == wrp) || toberemoved.contains(wrp2)){
622 if (wrp.getRange().hasIntersection(wrp2.getRange())) {
624 intersectedrange = wrp2.getRange().intersection(wrp.getRange());
625 toberemoved.add(wrp2);
629 long startprefix = 0;
631 long startsuffix = 0;
634 int intermediatesize = 0;
635 Byte[] prefixdata = null;
636 Byte[] suffixdata = null;
637 boolean prefix = false;
638 boolean suffix = false;
642 if (wrp.getRange().getStart() < wrp2.getRange().getStart()) {
643 prefixdata = new Byte[(int) (wrp2.getRange().getStart() - wrp.getRange().getStart())];
644 prefixdata = (Byte[]) (wrp.getData());
645 startprefix = wrp.getRange().getStart();
646 prefixsize = (int)(intersectedrange.getStart() - startprefix);
647 intermediatesize = (int)(intersectedrange.getEnd() -intersectedrange.getStart());
651 else if (wrp2.getRange().getStart() <= wrp.getRange().getStart()) {
652 prefixdata = new Byte[(int) (wrp.getRange().getStart() - wrp2.getRange().getStart())];
653 prefixdata = (Byte[]) (wrp2.getData());
654 startprefix = wrp2.getRange().getStart();
655 prefixsize = (int)(intersectedrange.getStart() - startprefix);
656 intermediatesize = (int)(intersectedrange.getEnd() -intersectedrange.getStart());
660 if (wrp2.getRange().getEnd() >= wrp.getRange().getEnd()) {
662 suffixdata = new Byte[(int) (wrp2.getRange().getEnd() - intersectedrange.getEnd())];
663 suffixdata = (Byte[]) (wrp2.getData());
664 startsuffix = intersectedrange.getEnd() - wrp2.getRange().getStart();
665 suffixsize = (int)(wrp2.getRange().getEnd() - intersectedrange.getEnd());
667 endsuffix = wrp2.getRange().getEnd();
670 else if (wrp.getRange().getEnd() > wrp2.getRange().getEnd()) {
671 suffixdata = new Byte[(int) (wrp.getRange().getEnd() - intersectedrange.getEnd())];
672 suffixdata = (Byte[]) (wrp.getData());
673 startsuffix = intersectedrange.getEnd() - wrp.getRange().getStart();
674 suffixsize = (int)(wrp.getRange().getEnd() - intersectedrange.getEnd());
675 endsuffix = wrp.getRange().getEnd();
680 Byte[] data_to_insert;
682 if ((prefix) && (suffix)) {
683 data_to_insert = new Byte[(int) (endsuffix - startprefix)];
684 System.arraycopy(prefixdata, 0, data_to_insert, 0, prefixsize);
685 System.arraycopy(wrp2.getData(), (int)(intersectedrange.getStart() - wrp2.getRange().getStart()), data_to_insert, prefixsize, intermediatesize);
686 System.arraycopy(suffixdata, (int)startsuffix, data_to_insert, (prefixsize + intermediatesize), suffixsize);
687 wrp.setData(data_to_insert);
688 wrp.setRange(new Range(startprefix, endsuffix));
694 Iterator it = toberemoved.iterator();
696 vec.remove(it.next());
699 Collections.sort(vec);
700 me.merge_for_writes_done.put(inode, Boolean.TRUE);
704 public void non_Transactional_Write(byte[] data){
706 Vector heldlocks = new Vector();
708 int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
709 int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), data.length);
710 for (int i = startblock; i <= targetblock; i++) {
711 BlockDataStructure block =this.inodestate.getBlockDataStructure(i);
712 block.getLock().writeLock().lock();
713 heldlocks.add(block.getLock().writeLock());
719 file.seek(committedoffset.getOffsetnumber());
722 committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() +data.length);
724 } catch (IOException ex) {
725 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
727 unlockLocks(heldlocks);
732 public int non_Transactional_Read(byte[] b){
734 Vector heldlocks = new Vector();
739 startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
740 targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), size);
743 for (int i = startblock; i <= targetblock; i++) {
744 BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
745 block.getLock().readLock().lock();
746 heldlocks.add(block.getLock().readLock());
749 size = invokeNativepread(b, committedoffset.getOffsetnumber(), b.length);
750 committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() +size);
751 if (!(committedoffset.getOffsetReaders().isEmpty())){
752 Iterator it2 = committedoffset.getOffsetReaders().iterator(); // for visible readers strategy
753 while ( it2.hasNext())
755 ExtendedTransaction tr = (ExtendedTransaction) it2.next();
758 committedoffset.getOffsetReaders().clear();
761 unlockLocks(heldlocks);
770 public void non_Transactional_Seek(long offset){
772 committedoffset.setOffsetnumber(offset);
776 public long non_Transactional_getFilePointer(){
780 offset = committedoffset.getOffsetnumber();
786 public int compareTo(Object arg0) {
787 TransactionalFile tf = (TransactionalFile) arg0;
788 if (this.inode.getNumber() < tf.inode.getNumber())
790 else if (this.inode.getNumber() > tf.inode.getNumber())
793 if (this.sequenceNum < tf.sequenceNum)
800 public void makeWritestDependent(ExtendedTransaction me){// make the writes absolute and dependent on ofset value
802 if (me.getWriteBuffer().get(inode) != null)
804 it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
805 while (it.hasNext()){
807 WriteOperations wrp = (WriteOperations) it.next();
808 if (wrp.isUnknownoffset()){
809 wrp.setUnknownoffset(false);
810 wrp.getOwnertransactionalFile().lockOffset(me);
812 wrp.getRange().setStart(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber()
813 - wrp.getBelongingto().getCopylocaloffset()
814 + wrp.getRange().getStart());
815 wrp.getRange().setEnd(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber()
816 - wrp.getBelongingto().getCopylocaloffset()
817 + wrp.getRange().getEnd());
818 if ((wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) ||
819 (wrp.getBelongingto().offsetdependency == OffsetDependency.NO_ACCESS) ||
820 (wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_2)){
821 wrp.getBelongingto().setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
822 wrp.getBelongingto().setUnknown_inital_offset_for_write(false);
823 if (!(wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().contains(me)))
824 wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().add(me);
825 wrp.getBelongingto().setLocaloffset(wrp.getBelongingto().getLocaloffset() + wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset());
827 wrp.getOwnertransactionalFile().offsetlock.unlock();
828 markAccessedBlocks(me, (int)wrp.getRange().getStart(), (int)(wrp.getRange().getEnd() - wrp.getRange().getStart()), BlockAccessModesEnum.WRITE);
839 // for block versioning mechanism
840 /*if (!(validateBlocksVersions(startblock, targetblock))) { ////check to see if version are still valid
842 throw new AbortedException();
846 int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(k))).intValue();
847 while (me.getStatus() == Status.ACTIVE) {
848 BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
849 if (block.getLock().tryLock()) {
850 heldlocks.add(block.getLock());
851 if (!(block.getVersion().get() == expvalue)) { // for block versioning mechanism
859 me.getContentionManager().resolveConflict(me, block.getOwner());
862 if (me.getStatus() == Status.ABORTED) {
863 unlockLocks(heldlocks);
865 throw new AbortedException();
871 /* public boolean validateBlocksVersions(int startblock, int targetblock) { // For Block Versioning Mechanism
872 boolean valid = true;
873 ExtendedTransaction me = ExtendedTransaction.getTransaction();
874 TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getFilesAccesses().get(this.getInode())));
875 for (int i = startblock; i <= targetblock; i++) {
876 int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(i))).intValue();
877 BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(i)));
878 if (expvalue != block.getVersion().get()) {