annotate src/main/java/jp/ac/u_ryukyu/ie/cr/jungle/transaction/DefaultTransactionManager.java @ 0:44465893e8b8

first Commit
author Kazuma
date Wed, 30 Nov 2016 01:47:55 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.jungle.transaction;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
2
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
3
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
4 import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeListWriter;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
5 import jp.ac.u_ryukyu.ie.cr.jungle.store.TreeContext;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
6 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.logger.TreeOperationLog;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.jungle.store.operations.TreeOperation;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.jungle.persistent.ChangeList;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.InterfaceTraverser;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultEither;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.jungle.util.DefaultError;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
15
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
16 import java.util.Iterator;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
17 import java.util.concurrent.atomic.AtomicReference;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
18
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
19 public class DefaultTransactionManager implements TransactionManager {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
20 private final AtomicReference<TreeContext> repository;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
21 private final TreeContext tip;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
22 private final ChangeListWriter writer;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
23 private final String uuid;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
24
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
25 public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip,
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
26 AtomicReference<TreeContext> _repository, String _uuid) {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
27 repository = _repository;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
28 tip = _tip;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
29 writer = _writer;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
30 uuid = _uuid;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
31 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
32
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
33 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
34 public Either<Error, TransactionManager> commit(TreeNode newRoot, final TreeOperationLog _log) {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
35 long currentRevision = tip.revision();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
36 long nextRevision = currentRevision + 1;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
37
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
38 final String _treeName = tip.getTreeName();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
39 ChangeList list = new ChangeList() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
40 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
41 public Iterator<TreeOperation> iterator() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
42 return _log.iterator();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
43 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
44
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
45 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
46 public String getTreeName() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
47 return _treeName;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
48 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
49
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
50 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
51 public TreeOperationLog getLog() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
52 return _log;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
53 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
54
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
55 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
56 public String uuid() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
57 return uuid;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
58 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
59
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
60 };
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
61
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
62 InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
63 traverser.createIndex();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
64 TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
65
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
66 if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
67 TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
68 return DefaultEither.newB(txManager);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
69 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
70
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
71 return DefaultEither.newA((jp.ac.u_ryukyu.ie.cr.jungle.util.Error) new DefaultError());
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
72 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
73
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
74 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
75 public Either<Error, TransactionManager> flashCommit(TreeNode _newRoot, TreeOperationLog _log) {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
76 return commit(_newRoot,_log);
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
77 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
78
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
79 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
80 public String getUUID() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
81 return uuid;
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
82 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
83
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
84 @Override
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
85 public long getRevision() {
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
86 return tip.revision();
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
87 }
44465893e8b8 first Commit
Kazuma
parents:
diff changeset
88 }