comparison src/main/java/alice/jungle/transaction/NetworkTransactionManager.java @ 193:89c15aa2bc6d

change transaction
author tatsuki
date Fri, 20 Mar 2015 16:18:42 +0900
parents 5d0734fd859d
children fd4064e110bd
comparison
equal deleted inserted replaced
192:3202a2a427b1 193:89c15aa2bc6d
1 package alice.jungle.transaction; 1 package alice.jungle.transaction;
2 2
3 import java.util.Iterator; 3 import java.util.Iterator;
4 import java.util.concurrent.atomic.AtomicReference;
4 5
6 import fj.data.TreeMap;
5 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; 7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
6 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; 8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter;
7 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; 9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result;
8 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; 10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext;
9 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; 11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
10 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; 12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog;
11 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; 13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
12 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference;
13 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation;
14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet;
15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; 14 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext;
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; 15 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager;
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext;
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; 17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; 18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError;
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; 19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; 20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
23 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index;
24 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager;
25 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; 21 import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex;
26 22
27 public class NetworkTransactionManager implements TransactionManager { 23 public class NetworkTransactionManager implements TransactionManager {
28 24 private final AtomicReference<TreeContext> repository;
29 private final AtomicReservableReference<TreeContext> repository;
30 private final TreeContext tip; 25 private final TreeContext tip;
31 private final ChangeListWriter writer; 26 private final ChangeListWriter writer;
32 private final String uuid; 27 private final String uuid;
33 private final String treeName; 28 private final String treeName;
34 29
35 public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip, 30 public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip,
36 AtomicReservableReference<TreeContext> _repository, String _uuid) { 31 AtomicReference<TreeContext> _repository, String _uuid) {
37 repository = _repository; 32 repository = _repository;
38 tip = _tip; 33 tip = _tip;
39 writer = _writer; 34 writer = _writer;
40 uuid = _uuid; 35 uuid = _uuid;
41 treeName = _treeName; 36 treeName = _treeName;
42 } 37 }
43 38
44 @Override 39 @Override
45 public Either<Error, TransactionManager> commit(TreeNode _newRoot, final TreeOperationLog _log) { 40 public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) {
46 ChangeSet cs = tip.getChangeSet(); 41 long currentRevision = tip.revision();
47 long currentRevision = cs.revision();
48 long nextRevision = currentRevision + 1; 42 long nextRevision = currentRevision + 1;
49 43
50 ChangeList list = new ChangeList() { 44 ChangeList list = new ChangeList() {
51 @Override 45 @Override
52 public Iterator<TreeOperation> iterator() { 46 public Iterator<TreeOperation> iterator() {
62 public String getTreeName() { 56 public String getTreeName() {
63 return treeName; 57 return treeName;
64 } 58 }
65 }; 59 };
66 60
67 IndexManager indexManager = new IndexManager(repository.getReservation()); 61 InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
68 InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true); 62 traverser.createIndex();
69 traverser.createIndex(); 63 TreeMap<String, TreeMap<String, TreeMap<TreeNode, TreeNode>>> index = traverser.getIndex();
70 Index index = traverser.getIndex(); 64 ParentIndex parentIndex = traverser.getParentIndex();
71 ParentIndex parentIndex = traverser.getParentIndex(); 65 TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, treeName, nextRevision,index,parentIndex.getParentIndex());
72 DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, treeName, nextRevision, index.getIndex(), parentIndex.getParentIndex());
73 66
74 DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs);
75 67
76 @SuppressWarnings("rawtypes") 68 if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) {
77 Reservation reservation = repository.makeReservation(tip, newContext); 69 TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newTreeContext, repository, uuid);
78 if (reservation == null) { 70 return DefaultEither.newB(txManager);
71 }
72
79 return DefaultEither.newA((Error) new DefaultError()); 73 return DefaultEither.newA((Error) new DefaultError());
80 } 74
81 Result r = writer.write(list);
82 if (r != Result.SUCCESS) {
83 return DefaultEither.newA((Error) new DefaultError());
84 }
85 reservation.confirm();
86 TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid);
87 return DefaultEither.newB(txManager);
88 } 75 }
89 76
90 @Override 77 @Override
91 public long getRevision() { 78 public long getRevision() {
92 ChangeSet cs = tip.getChangeSet(); 79 return tip.revision();
93 return cs.revision();
94 } 80 }
95 81
96 @Override 82 @Override
97 public String getUUID() { 83 public String getUUID() {
98 return uuid; 84 return uuid;