2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
5 package TransactionalIO.core;
7 import TransactionalIO.Utilities.Range;
8 import TransactionalIO.exceptions.AbortedException;
9 import TransactionalIO.exceptions.PanicException;
10 import TransactionalIO.benchmarks.benchmark;
11 import TransactionalIO.core.ExtendedTransaction.Status;
12 import TransactionalIO.interfaces.BlockAccessModesEnum;
13 import TransactionalIO.interfaces.OffsetDependency;
14 import com.sun.org.apache.bcel.internal.generic.IFEQ;
16 import java.io.FileDescriptor;
17 import java.io.FileNotFoundException;
18 import java.io.IOException;
19 import java.io.RandomAccessFile;
20 import java.nio.ByteBuffer;
21 import java.util.Collections;
22 import java.util.Iterator;
23 import java.util.TreeMap;
24 import java.util.Vector;
25 import java.util.concurrent.locks.Lock;
26 import java.util.concurrent.locks.ReentrantLock;
27 import java.util.logging.Level;
28 import java.util.logging.Logger;
34 public class TransactionalFile implements Comparable {
36 private native int nativepread(byte buff[], long offset, int size, FileDescriptor fd);
37 private native int nativepwrite(byte buff[], long offset, int size, FileDescriptor fd);
41 System.load("/home/navid/libkooni.so");
43 public RandomAccessFile file;
45 private int sequenceNum = 0;
46 public static int currenSeqNumforInode = 0;
47 /* public AtomicLong commitedoffset;
48 public AtomicLong commitedfilesize;*/
49 public boolean to_be_created = false;
50 public boolean writemode = false;
51 public boolean appendmode = false;
52 public ReentrantLock offsetlock;
53 private GlobalOffset committedoffset;
54 private GlobalINodeState inodestate;
56 public TransactionalFile(String filename, String mode) {
59 File f = new File(filename);
61 if ((!(f.exists()))) {
69 offsetlock = new ReentrantLock();
70 file = new RandomAccessFile(f, mode);
71 } catch (FileNotFoundException ex) {
73 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
77 inode = TransactionalFileWrapperFactory.getINodefromFileName(filename);
78 inodestate = TransactionalFileWrapperFactory.createTransactionalFile(inode, filename, mode);
81 sequenceNum = inodestate.seqNum;
84 if (mode.equals("rw")) {
86 } else if (mode.equals("a")) {
90 if (inodestate != null) {
91 synchronized (inodestate) {
92 committedoffset = new GlobalOffset(0);
99 private int invokeNativepread(byte buff[], long offset, int size) {
101 return nativepread(buff, offset, size, file.getFD());
102 } catch (IOException ex) {
104 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
109 public int invokeNativepwrite(byte buff[], long offset, int size, RandomAccessFile file) {
111 return nativepwrite(buff, offset, buff.length, file.getFD());
112 } catch (IOException ex) {
114 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
120 public int getSequenceNum() {
124 public GlobalOffset getCommitedoffset() {
125 return committedoffset;
128 public GlobalINodeState getInodestate() {
132 public INode getInode() {
136 public void close() {
139 } catch (IOException ex) {
140 Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
144 public long getFilePointer() {
146 ExtendedTransaction me = Wrapper.getTransaction();
147 TransactionLocalFileAttributes tmp = null;
150 return non_Transactional_getFilePointer();
153 if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
157 tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
158 if ((tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) || (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS)) {
159 tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
164 if (!(this.committedoffset.getOffsetReaders().contains(me))) {
165 this.committedoffset.getOffsetReaders().add(me);
169 tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
170 target = this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset();
176 if ((me.getWriteBuffer().get(inode)) != null) {
178 it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
179 while (it.hasNext()) {
180 WriteOperations wrp = (WriteOperations) it.next();
181 if (wrp.getBelongingto() == tmp && wrp.isUnknownoffset()) {
182 wrp.setUnknownoffset(false);
184 wrp.getRange().setStart(target + wrp.getRange().getStart());
185 wrp.getRange().setEnd(target + wrp.getRange().getEnd());
192 tmp.setUnknown_inital_offset_for_write(false);
193 return tmp.getLocaloffset();
196 public void seek(long offset) {
198 ExtendedTransaction me = Wrapper.getTransaction();
201 non_Transactional_Seek(offset);
204 TransactionLocalFileAttributes tmp = null;
205 if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
206 me.addFile(this, offset);
208 tmp = (TransactionLocalFileAttributes) me.getGlobaltoLocalMappings().get(this);
210 if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) {
211 tmp.setOffsetdependency(OffsetDependency.NO_DEPENDENCY);
212 } else if (tmp.getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) {
213 tmp.setOffsetdependency(OffsetDependency.WRITE_DEPENDENCY_2);
215 tmp.setUnknown_inital_offset_for_write(false);
216 tmp.setLocaloffset(offset);
220 public int read(byte[] b) {
223 ExtendedTransaction me = Wrapper.getTransaction();
226 if (me == null) { // not a transaction, but any I/O operation even though within a non-transaction is considered a single opertion transactiion
228 return non_Transactional_Read(b);
230 if (!(me.getGlobaltoLocalMappings().containsKey(this))) {
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)) {
243 tmp.setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
246 if (dep != OffsetDependency.WRITE_DEPENDENCY_2) {
247 tmp.setLocaloffset(tmp.getLocaloffset() + this.committedoffset.getOffsetnumber() - tmp.getCopylocaloffset());
250 if (!(this.committedoffset.getOffsetReaders().contains(me))) {
251 this.committedoffset.getOffsetReaders().add(me);
259 makeWritestDependent(me);
262 if ((Boolean) me.merge_for_writes_done.get(inode) == Boolean.FALSE) {
263 mergeWrittenData(me);
266 long loffset = tmp.getLocaloffset();
267 markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.READ);
271 if ((me.getWriteBuffer().get(this.inode)) != null) {
272 writebuffer = (Vector) (me.getWriteBuffer().get(this.inode));
274 writebuffer = new Vector();
275 me.getWriteBuffer().put(this.inode, writebuffer);
277 Range readrange = new Range(loffset, loffset + size);
278 Range writerange = null;
279 Range[] intersectedrange = new Range[writebuffer.size()];
280 WriteOperations[] markedwriteop = new WriteOperations[writebuffer.size()];
283 boolean in_local_buffer = false;
286 Iterator it = writebuffer.iterator();
287 while (it.hasNext()) {
289 WriteOperations wrp = (WriteOperations) it.next();
290 writerange = wrp.getRange();
291 if (writerange.includes(readrange)) {
292 markedwriteop[counter] = wrp;
293 in_local_buffer = true;
297 if (writerange.hasIntersection(readrange)) {
298 intersectedrange[counter] = readrange.intersection(writerange);
299 markedwriteop[counter] = wrp;
305 if (in_local_buffer) { // the read one from local buffer
307 result = readFromBuffer(b, tmp, markedwriteop[counter], writerange);
312 if (counter == 0) { // all the read straight from file
314 result = readFromFile(me, b, tmp);
315 } else { // some parts from file others from buffer
317 for (int i = 0; i < counter; i++) {
318 Byte[] data = markedwriteop[i].getData();
319 byte[] copydata = new byte[data.length];
320 for (int j = 0; j < data.length; j++) {
321 copydata[j] = data[j].byteValue();
323 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()));
324 result += Math.min(intersectedrange[i].getEnd(), readrange.getEnd()) - intersectedrange[i].getStart();
327 Range[] non_intersected_ranges = readrange.minus(intersectedrange, counter);
328 Vector occupiedblocks = new Vector();
329 for (int i = 0; i < non_intersected_ranges.length; i++) {
330 int st = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getStart());
331 int en = FileBlockManager.getCurrentFragmentIndexofTheFile(non_intersected_ranges[i].getEnd());
332 for (int j = st; j <= en; j++) {
333 if (!(occupiedblocks.contains(Integer.valueOf(j)))) {
334 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)));
349 block.getLock().readLock().lock();
350 if (!(block.getReaders().contains(me))) {
351 block.getReaders().add(me);
354 //me.getHeldblocklocks().add(block.getLock().readLock());
357 if (me.getStatus() == Status.ABORTED) {
364 for (int i = 0; i < m; i++) {
365 block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));
366 me.getHeldblocklocks().add(block.getLock().readLock());
370 throw new AbortedException();
374 for (int i = 0; i < non_intersected_ranges.length; i++) {
376 int sizetoread = (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart());
377 byte[] tmpdt = new byte[(int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart())];
378 int tmpsize = invokeNativepread(tmpdt, non_intersected_ranges[i].getStart(), sizetoread);
379 System.arraycopy(tmpdt, 0, b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), sizetoread);
380 //file.seek(non_intersected_ranges[i].getStart());
381 //int tmpsize = file.read(b, (int) (non_intersected_ranges[i].getStart() - readrange.getStart()), (int) (non_intersected_ranges[i].getEnd() - non_intersected_ranges[i].getStart()));
383 // } catch (IOException ex) {
384 // Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
388 if (me.getStatus() == Status.ABORTED) {
389 for (int k = 0; k < occupiedblocks.size(); k++) {
390 block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));
391 me.getHeldblocklocks().add(block.getLock().readLock());
393 throw new AbortedException();
395 for (int k = 0; k < occupiedblocks.size(); k++) {
396 block = this.inodestate.getBlockDataStructure((Integer) (occupiedblocks.get(k)));//(BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
398 block.getLock().readLock().unlock();
400 // offsetlock.unlock();
401 tmp.setLocaloffset(tmp.getLocaloffset() + result);
407 } else { // add to the readers list
408 // me.addFile(this, 0);
414 public void write(byte[] data) throws IOException {
417 throw new IOException();
421 ExtendedTransaction me = Wrapper.getTransaction();
422 int size = data.length;
425 if (me == null) // not a transaction
428 non_Transactional_Write(data);
432 if (me.getGlobaltoLocalMappings().containsKey(this)) //
436 Byte[] by = new Byte[size];
437 for (int i = 0; i < size; i++) {
438 by[i] = Byte.valueOf(data[i]);
440 TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getGlobaltoLocalMappings().get(this)));
443 if (((Vector) (me.getWriteBuffer().get(this.inode))) != null) {
444 dummy = new Vector((Vector) (me.getWriteBuffer().get(this.inode)));
446 dummy = new Vector();
448 dummy.add(new WriteOperations(by, new Range(tmp.getLocaloffset(), tmp.getLocaloffset() + by.length), tmp.isUnknown_inital_offset_for_write(), this, tmp));
449 me.getWriteBuffer().put(this.inode, dummy);
451 long loffset = tmp.getLocaloffset();
454 tmp.setLocaloffset(tmp.getLocaloffset() + by.length);
456 me.merge_for_writes_done.put(inode, Boolean.FALSE);
458 if (!(tmp.isUnknown_inital_offset_for_write())) {
459 markAccessedBlocks(me, loffset, size, BlockAccessModesEnum.WRITE);
462 if (tmp.getOffsetdependency() == OffsetDependency.NO_ACCESS) {
463 tmp.offsetdependency = OffsetDependency.WRITE_DEPENDENCY_1;
471 private void markAccessedBlocks(ExtendedTransaction me, long loffset, int size, BlockAccessModesEnum mode) {
475 if (me.getAccessedBlocks().get(this.getInode()) != null) {
476 map = (TreeMap) me.getAccessedBlocks().get(this.getInode());
479 me.getAccessedBlocks().put(this.inode, map);
481 int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(loffset);
482 int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(loffset, size);
483 for (int i = startblock; i <= targetblock; i++) {
484 if (map.containsKey(Integer.valueOf(i))) {
485 if (map.get(Integer.valueOf(i)) != mode) {
486 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);
537 if (me.getStatus() == Status.ABORTED) {
538 for (int i = st; i <= end; i++) {
539 block = this.inodestate.getBlockDataStructure(Integer.valueOf(i));
540 me.getHeldblocklocks().add(block.getLock().readLock());
542 throw new AbortedException();
544 for (int k = st; k <= end; k++) {
545 block = this.inodestate.getBlockDataStructure(Integer.valueOf(k));
546 block.getLock().readLock().unlock();
553 private int readFromBuffer(byte[] readdata, TransactionLocalFileAttributes tmp, WriteOperations wrp, Range writerange) {
554 long loffset = tmp.getLocaloffset();
556 Byte[] data = (Byte[]) wrp.getData();
557 byte[] copydata = new byte[data.length];
559 for (int i = 0; i < data.length; i++) {
560 copydata[i] = data[i].byteValue();
562 System.arraycopy(copydata, (int) (loffset - writerange.getStart()), readdata, 0, readdata.length);
563 tmp.setLocaloffset(tmp.getLocaloffset() + readdata.length);
564 return readdata.length;
568 public void simpleWritetoBuffer(Byte[] data, Range newwriterange, TreeMap tm) {
569 tm.put(newwriterange, data);
572 public void unlockLocks(Vector heldlocks) {
573 for (int i = 0; i < heldlocks.size(); i++) {
574 ((Lock) heldlocks.get(i)).unlock();
578 public void setInode(INode inode) {
582 public void lockOffset(ExtendedTransaction me) {
583 boolean locked = false;
584 while (me.getStatus() == Status.ACTIVE) { //locking the offset
591 if (me.getStatus() != Status.ACTIVE) {
593 me.getHeldoffsetlocks().add(offsetlock);
595 throw new AbortedException();
600 public void mergeWrittenData(ExtendedTransaction me/*TreeMap target, byte[] data, Range to_be_merged_data_range*/) {
602 boolean flag = false;
603 Vector vec = (Vector) me.getWriteBuffer().get(this.inode);
604 Range intersectedrange = new Range(0, 0);
605 Iterator it1 = vec.iterator();
607 WriteOperations wrp2;
608 Vector toberemoved = new Vector();
609 while (it1.hasNext()) {
610 wrp = (WriteOperations) (it1.next());
612 if (toberemoved.contains(wrp)) {
616 Iterator it2 = vec.listIterator();
617 while (it2.hasNext()) {
619 wrp2 = (WriteOperations) (it2.next());
621 if ((wrp2 == wrp) || toberemoved.contains(wrp2)) {
625 if (wrp.getRange().hasIntersection(wrp2.getRange())) {
627 intersectedrange = wrp2.getRange().intersection(wrp.getRange());
628 toberemoved.add(wrp2);
632 long startprefix = 0;
634 long startsuffix = 0;
637 int intermediatesize = 0;
638 Byte[] prefixdata = null;
639 Byte[] suffixdata = null;
640 boolean prefix = false;
641 boolean suffix = false;
645 if (wrp.getRange().getStart() < wrp2.getRange().getStart()) {
646 prefixdata = new Byte[(int) (wrp2.getRange().getStart() - wrp.getRange().getStart())];
647 prefixdata = (Byte[]) (wrp.getData());
648 startprefix = wrp.getRange().getStart();
649 prefixsize = (int) (intersectedrange.getStart() - startprefix);
650 intermediatesize = (int) (intersectedrange.getEnd() - intersectedrange.getStart());
652 } else if (wrp2.getRange().getStart() <= wrp.getRange().getStart()) {
653 prefixdata = new Byte[(int) (wrp.getRange().getStart() - wrp2.getRange().getStart())];
654 prefixdata = (Byte[]) (wrp2.getData());
655 startprefix = wrp2.getRange().getStart();
656 prefixsize = (int) (intersectedrange.getStart() - startprefix);
657 intermediatesize = (int) (intersectedrange.getEnd() - intersectedrange.getStart());
661 if (wrp2.getRange().getEnd() >= wrp.getRange().getEnd()) {
663 suffixdata = new Byte[(int) (wrp2.getRange().getEnd() - intersectedrange.getEnd())];
664 suffixdata = (Byte[]) (wrp2.getData());
665 startsuffix = intersectedrange.getEnd() - wrp2.getRange().getStart();
666 suffixsize = (int) (wrp2.getRange().getEnd() - intersectedrange.getEnd());
668 endsuffix = wrp2.getRange().getEnd();
669 } else if (wrp.getRange().getEnd() > wrp2.getRange().getEnd()) {
670 suffixdata = new Byte[(int) (wrp.getRange().getEnd() - intersectedrange.getEnd())];
671 suffixdata = (Byte[]) (wrp.getData());
672 startsuffix = intersectedrange.getEnd() - wrp.getRange().getStart();
673 suffixsize = (int) (wrp.getRange().getEnd() - intersectedrange.getEnd());
674 endsuffix = wrp.getRange().getEnd();
679 Byte[] data_to_insert;
681 if ((prefix) && (suffix)) {
682 data_to_insert = new Byte[(int) (endsuffix - startprefix)];
683 System.arraycopy(prefixdata, 0, data_to_insert, 0, prefixsize);
684 System.arraycopy(wrp2.getData(), (int) (intersectedrange.getStart() - wrp2.getRange().getStart()), data_to_insert, prefixsize, intermediatesize);
685 System.arraycopy(suffixdata, (int) startsuffix, data_to_insert, (prefixsize + intermediatesize), suffixsize);
686 wrp.setData(data_to_insert);
687 wrp.setRange(new Range(startprefix, endsuffix));
693 Iterator it = toberemoved.iterator();
694 while (it.hasNext()) {
695 vec.remove(it.next());
698 Collections.sort(vec);
699 me.merge_for_writes_done.put(inode, Boolean.TRUE);
703 public void non_Transactional_Write(byte[] data) {
705 Vector heldlocks = new Vector();
707 int startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
708 int targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), data.length);
709 for (int i = startblock; i <= targetblock; i++) {
710 BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
711 block.getLock().writeLock().lock();
712 heldlocks.add(block.getLock().writeLock());
717 invokeNativepwrite(data, committedoffset.getOffsetnumber(), data.length, file);
718 //file.seek(committedoffset.getOffsetnumber());
720 committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() + data.length);
722 //} catch (IOException ex) {
723 // Logger.getLogger(TransactionalFile.class.getName()).log(Level.SEVERE, null, ex);
725 unlockLocks(heldlocks);
730 public int non_Transactional_Read(byte[] b) {
732 Vector heldlocks = new Vector();
737 startblock = FileBlockManager.getCurrentFragmentIndexofTheFile(committedoffset.getOffsetnumber());
738 targetblock = FileBlockManager.getTargetFragmentIndexofTheFile(committedoffset.getOffsetnumber(), size);
741 for (int i = startblock; i <= targetblock; i++) {
742 BlockDataStructure block = this.inodestate.getBlockDataStructure(i);
743 block.getLock().readLock().lock();
744 heldlocks.add(block.getLock().readLock());
747 size = invokeNativepread(b, committedoffset.getOffsetnumber(), b.length);
748 committedoffset.setOffsetnumber(committedoffset.getOffsetnumber() + size);
749 if (!(committedoffset.getOffsetReaders().isEmpty())) {
750 Iterator it2 = committedoffset.getOffsetReaders().iterator(); // for visible readers strategy
752 while (it2.hasNext()) {
753 ExtendedTransaction tr = (ExtendedTransaction) it2.next();
756 committedoffset.getOffsetReaders().clear();
759 unlockLocks(heldlocks);
768 public void non_Transactional_Seek(long offset) {
770 committedoffset.setOffsetnumber(offset);
774 public long non_Transactional_getFilePointer() {
778 offset = committedoffset.getOffsetnumber();
784 public int compareTo(Object arg0) {
785 TransactionalFile tf = (TransactionalFile) arg0;
786 if (this.inode.getNumber() < tf.inode.getNumber()) {
788 } else if (this.inode.getNumber() > tf.inode.getNumber()) {
791 if (this.sequenceNum < tf.sequenceNum) {
799 public void makeWritestDependent(ExtendedTransaction me) {// make the writes absolute and dependent on ofset value
802 if (me.getWriteBuffer().get(inode) != null) {
803 it = ((Vector) (me.getWriteBuffer().get(inode))).iterator();
804 while (it.hasNext()) {
806 WriteOperations wrp = (WriteOperations) it.next();
807 if (wrp.isUnknownoffset()) {
808 wrp.setUnknownoffset(false);
809 wrp.getOwnertransactionalFile().lockOffset(me);
811 wrp.getRange().setStart(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset() + wrp.getRange().getStart());
812 wrp.getRange().setEnd(wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset() + wrp.getRange().getEnd());
813 if ((wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_1) ||
814 (wrp.getBelongingto().offsetdependency == OffsetDependency.NO_ACCESS) ||
815 (wrp.getBelongingto().getOffsetdependency() == OffsetDependency.WRITE_DEPENDENCY_2)) {
816 wrp.getBelongingto().setOffsetdependency(OffsetDependency.READ_DEPENDENCY);
817 wrp.getBelongingto().setUnknown_inital_offset_for_write(false);
818 if (!(wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().contains(me))) {
819 wrp.getOwnertransactionalFile().committedoffset.getOffsetReaders().add(me);
821 wrp.getBelongingto().setLocaloffset(wrp.getBelongingto().getLocaloffset() + wrp.getOwnertransactionalFile().committedoffset.getOffsetnumber() - wrp.getBelongingto().getCopylocaloffset());
823 wrp.getOwnertransactionalFile().offsetlock.unlock();
824 markAccessedBlocks(me, (int) wrp.getRange().getStart(), (int) (wrp.getRange().getEnd() - wrp.getRange().getStart()), BlockAccessModesEnum.WRITE);
832 // for block versioning mechanism
833 /*if (!(validateBlocksVersions(startblock, targetblock))) { ////check to see if version are still valid
835 throw new AbortedException();
839 int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(k))).intValue();
840 while (me.getStatus() == Status.ACTIVE) {
841 BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(k)));
842 if (block.getLock().tryLock()) {
843 heldlocks.add(block.getLock());
844 if (!(block.getVersion().get() == expvalue)) { // for block versioning mechanism
852 me.getContentionManager().resolveConflict(me, block.getOwner());
855 if (me.getStatus() == Status.ABORTED) {
856 unlockLocks(heldlocks);
858 throw new AbortedException();
862 /* public boolean validateBlocksVersions(int startblock, int targetblock) { // For Block Versioning Mechanism
863 boolean valid = true;
864 ExtendedTransaction me = ExtendedTransaction.getTransaction();
865 TransactionLocalFileAttributes tmp = ((TransactionLocalFileAttributes) (me.getFilesAccesses().get(this.getInode())));
866 for (int i = startblock; i <= targetblock; i++) {
867 int expvalue = ((Integer) tmp.getBlockversions().get(Integer.valueOf(i))).intValue();
868 BlockDataStructure block = ((BlockDataStructure) tmp.adapter.lockmap.get(Integer.valueOf(i)));
869 if (expvalue != block.getVersion().get()) {