changeset 200:60afc98ce6a4

マージ
author ichikitakahiro <e165713@ie.u-ryukyu.ac.jp>
date Mon, 25 Feb 2019 16:40:17 +0900
parents cdf604af6c12 (current diff) 149d7fb0cfa6 (diff)
children d15467cd08cc
files src/main/java/christie/test/topology/paxos/acceptor/StartAcceptor.java src/main/java/christie/test/topology/paxos/learner/StartLearner.java src/main/java/christie/test/topology/paxos/proposer/StartProposer.java
diffstat 39 files changed, 415 insertions(+), 181 deletions(-) [+]
line wrap: on
line diff
--- a/build.gradle	Sat Feb 23 04:52:32 2019 +0900
+++ b/build.gradle	Mon Feb 25 16:40:17 2019 +0900
@@ -19,15 +19,17 @@
     //compile group: 'org.msgpack', name: 'msgpack-core', version: '0.8.16'
     //compile group: 'org.msgpack', name: 'jackson-dataformat-msgpack', version: '0.8.16'
     compile group: 'org.msgpack', name: 'msgpack', version: '0.6.12'
-
-
+    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1'
+    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
 }
 
 jar {
     exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
     manifest {
         attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
+        attributes 'Multi-Release': 'true' // https://stackoverflow.com/questions/53049346/is-log4j2-compatible-with-java-11
     }
+
     from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
     archiveName = 'Christie.jar'
 }
--- a/scripts/Log/paxos.dot	Sat Feb 23 04:52:32 2019 +0900
+++ b/scripts/Log/paxos.dot	Mon Feb 25 16:40:17 2019 +0900
@@ -1,17 +1,15 @@
-digraph test {
-	proposer1 -> acceptor1 [label="acceptor1"]
-	proposer1 -> acceptor2 [label="acceptor2"]
-	proposer1 -> acceptor3 [label="acceptor3"]
-	proposer2 -> acceptor1 [label="acceptor1"]
-	proposer2 -> acceptor2 [label="acceptor2"]
-	proposer2 -> acceptor3 [label="acceptor3"]
+digraph paxos {
+	acceptor0 -> learner0 [label="learner0"]
+	acceptor0 -> proposer0 [label="proposer0"]
+	acceptor0 -> proposer1 [label="proposer1"]
+	acceptor1 -> learner0 [label="learner0"]
+	acceptor1 -> proposer0 [label="proposer0"]
 	acceptor1 -> proposer1 [label="proposer1"]
+	acceptor2 -> learner0 [label="learner0"]
+	acceptor2 -> proposer0 [label="proposer0"]
 	acceptor2 -> proposer1 [label="proposer1"]
-	acceptor3 -> proposer1 [label="proposer1"]
-	acceptor1 -> proposer2 [label="proposer2"]
-	acceptor2 -> proposer2 [label="proposer2"]
-	acceptor3 -> proposer2 [label="proposer2"]
-	acceptor1 -> learner1 [label="learner1"]
-	acceptor2 -> learner1 [label="learner1"]
-	acceptor3 -> learner1 [label="learner1"]
+	proposer0 -> acceptor1 [label="acceptor1"]
+	proposer0 -> acceptor2 [label="acceptor2"]
+	proposer1 -> acceptor0 [label="acceptor0"]
+	proposer1 -> acceptor1 [label="acceptor1"]
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/paxos.pl	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,37 @@
+#!usr/bin/perl
+
+my $debug = 0;
+
+sub mysystem {
+  my ($cmd) = @_;
+  if ($debug) {
+    print $cmd ,"\n";
+  } else {
+    system $cmd;
+  }
+}
+
+ruby ./paxos.rb $1 $2 $3 > Log/paxos.dot
+
+my $nodes = $ENV{'PBS_NODEFILE'};
+my $java11binPath = "/mnt/data/christie_workspace/jdk-11.0.1/bin/";
+my $christieDir = "/mnt/data/christie_workspace/";
+my $dotFile = "${christieDir}scripts/Log/paxos.dot"
+my $logFile = "${christieDir}Log/";
+my $logNum  = "0000";
+
+open my $fd,"<",$nodes or die("can't read file $nodes $!");
+
+while (<$fd>) {
+  chop ;
+  unshift(@nodes,$_);
+}
+
+mysystem("ssh $nodes[0] \"cd $christieDir;${java11binPath}java -cp Christie.jar christie.topology.manager.StartTopologyManager --localPort 10000 --confFile ${dotFile} > $logFile$logNum\" &");
+
+$logNum++;
+for my $i (1..($#nodes)) {
+  print "nodes[i]: $i $nodes[$i]\n";
+  mysystem("ssh $nodes[$i] \"cd $christieDir;${java11binPath}java -cp Christie.jar christie.test.topology.paxos.StartPaxosNode --localPort 10000 --managerHost $nodes[0] --managerPort 10000 > $logFile$logNum\" &");
+  $logNum++;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/paxos.sh	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+
+proposer_num=$1
+acceptor_num=$2
+learner_num=$3
+
+max=$(( proposer_num + acceptor_num + learner_num));
+dot_file=Log/paxos.dot
+jar_path=../build/libs/Christie.jar
+topo_jarname=ChristieStartTopologyManager-1.0.jar
+torquetest_jarname=ChristieStartTorqueTestTopology-1.0.jar
+
+mkdir -p Log
+
+#ruby ./paxos.rb $proposer_num $acceptor_num $learner_num > ${dot_file}
+#dot -Tpng ./topology/ring.dot > ./topology/ring.png
+#open ./topology/ring.png
+java -cp ${jar_path} christie.topology.manager.StartTopologyManager --localPort 10000 --confFile ${dot_file}  &
+
+cnt=0
+while (($cnt < $max ))
+do
+   (java -cp ${jar_path} christie.test.topology.paxos.StartPaxosNode --managerHost localhost --managerPort 10000 --localPort $(( 10001 + cnt )) --level debug) &
+   cnt=$(( cnt + 1 ))
+done
+wait
\ No newline at end of file
--- a/src/main/java/christie/daemon/ChristieDaemon.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/daemon/ChristieDaemon.java	Mon Feb 25 16:40:17 2019 +0900
@@ -28,7 +28,7 @@
             // listen on any address ipv4/ipv6
             InetSocketAddress a = new InetSocketAddress("::", localPort);
 
-            System.out.println("AliceDaemon.listen: bind to " + a);
+            System.out.println("ChristieDaemon.listen: bind to " + a);
             ss.bind(a);
             acceptThread = new AcceptThread(ss, "ACCEPT" + localPort, cgm);
             acceptThread.start();
--- a/src/main/java/christie/daemon/Config.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/daemon/Config.java	Mon Feb 25 16:40:17 2019 +0900
@@ -1,16 +1,23 @@
 package christie.daemon;
 
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.config.Configurator;
+
 public class Config {
 
     public int localPort = 10000;
     public String logFile = null;
     public String MCSTADDR = "224.0.0.1";
+    public Level level = Level.FATAL;
     public String nis = "en1";
     public boolean useKeepAlive = true;
 
     public Config(String[] args) {
         for (int i = 0; i< args.length; i++) {
-            if ("-log".equals(args[i])) {
+            if ("--log".equals(args[i])) {
+                // Todo: log file implement
                 logFile = args[++i];
             }else if ("--localPort".equals(args[i])) {
                 localPort = Integer.parseInt(args[++i]);
@@ -20,9 +27,22 @@
                 useKeepAlive = false;
             } else if ("-a".equals(args[i])) {
                 MCSTADDR = args[++i];
+            } else if ("--level".equals(args[i])) {
+                String levelStr = args[++i];
+                if (levelStr.equals("fatal")) {
+                    level = Level.FATAL;
+                } else if (levelStr.equals("error")) {
+                    level = Level.ERROR;
+                } else if (levelStr.equals("warn")) {
+                    level = Level.WARN;
+                } else if (levelStr.equals("info")) {
+                    level = Level.INFO;
+                } else if (levelStr.equals("debug")) {
+                    level = Level.DEBUG;
+                }
             }
         }
-
+        Configurator.setAllLevels(LogManager.getRootLogger().getName(), level);
     }
 
 }
--- a/src/main/java/christie/datagear/DataGears.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/datagear/DataGears.java	Mon Feb 25 16:40:17 2019 +0900
@@ -29,7 +29,7 @@
         return data;
     }
 
-    public synchronized Object peek(String key){
+    public Object peek(String key){
         return dataGears.get(key).peek().getData();
     }
 
--- a/src/main/java/christie/test/topology/localTestTopology/LTRemoteIncrement.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/localTestTopology/LTRemoteIncrement.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,6 +4,7 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.topology.Message;
 import christie.topology.node.TopologyNodeConfig;
 
 import java.util.List;
@@ -24,7 +25,7 @@
         System.out.println("node: " + " num = " + num);
 
         if (num == 3) {
-            getDGM(topologyNodeConfig.getManagerKey()).put("finish", "");
+            getDGM(topologyNodeConfig.getManagerKey()).put("FINISHMESSAGE", new Message());
         } else {
             num++;
             getDGM("right").put("num", num);
--- a/src/main/java/christie/test/topology/paxos/Proposal.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/Proposal.java	Mon Feb 25 16:40:17 2019 +0900
@@ -24,9 +24,6 @@
         this.value = value;
         this.id = id;
         this.acceptorNum = acceptorNum;
-
-        incrementNumber();
-
     }
 
     public void setValue(int value){
@@ -84,5 +81,10 @@
         return false;
     }
 
+    public String toString() {
+        return "Proposal : number = " + number + ",  value = " + value;
+    }
+
+
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/christie/test/topology/paxos/StartPaxosNode.java	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,14 @@
+package christie.test.topology.paxos;
+
+import christie.topology.node.StartTopologyNode;
+import christie.topology.node.TopologyNodeConfig;
+
+public class StartPaxosNode {
+
+    public static void main(String[] args){
+        TopologyNodeConfig topologyNodeConfig = new TopologyNodeConfig(args);
+        new StartTopologyNode(topologyNodeConfig, new CheckMyName());
+    }
+
+}
+
--- a/src/main/java/christie/test/topology/paxos/acceptor/AcceptCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/acceptor/AcceptCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,8 @@
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
 import christie.topology.TopologyDataGear;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
 
@@ -17,27 +19,47 @@
     @Take
     Proposal acceptProposal;
 
-    @Take
-    Proposal promisedProposal;
+
+    //PromiseProposal promiseProposal;
+
+    //@Take
+    //Proposal promisedProposal;
+
+    Logger logger = LogManager.getLogger(AcceptCodeGear.class);
+
 
     @Override
     protected void run(CodeGearManager cgm) {
         List<String> _CLIST = topoDG.getConnectionList();
 
-        if(acceptProposal.getNumber() >= promisedProposal.getNumber()){
+        // promise codegearでも使うので, lock
+        PromiseProposal.getInstance().lock();
+        PromiseProposal promiseProposal = PromiseProposal.getInstance();
+        Proposal promisedProposal = promiseProposal.getPromiseProposal();
+
+        if(acceptProposal.getNumber() >= promisedProposal.getNumber()) {
+            logger.debug(acceptProposal + " >= " + promisedProposal);
             acceptProposal.setAccepted(true);
             acceptProposal.setAcceptorName(topoDG.getNodeName());
-            for(String learnerName : _CLIST)
-                put(learnerName, "acceptedProposal", acceptProposal);
 
-            put("promisedProposal", acceptProposal);
+            promisedProposal = acceptProposal;
 
-        }else{
-            put("promisedProposal", promisedProposal);
-
+            for (String connectionNodeName : _CLIST){
+                if(connectionNodeName.matches("learner" + ".*")) {
+                    //logger.debug("send " + topoDG.getNodeName() + " to "
+                    // + connectionNodeName + " " + promisedProposal);
+                    getDGM(connectionNodeName).put("acceptedProposal", promisedProposal);
+                }
+            }
         }
+        promiseProposal.setPromiseProposal(promisedProposal);
+        promiseProposal.unLock();
+        logger.debug("accept " + topoDG.getNodeName() + " " + promisedProposal);
+        put(acceptProposal.getProposerName(), "acceptedProposal", promisedProposal);
+        put("promisedProposal", promisedProposal);
 
         cgm.setup(new AcceptCodeGear());
+    }
 
-    }
+
 }
--- a/src/main/java/christie/test/topology/paxos/acceptor/AcceptorCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/acceptor/AcceptorCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -10,8 +10,13 @@
 
     @Override
     protected void run(CodeGearManager cgm) {
+        PromiseProposal promiseProposal = PromiseProposal.getInstance();
+        promiseProposal.setPromiseProposal(new Proposal());
         cgm.setup(new PromiseCodeGear());
         cgm.setup(new AcceptCodeGear());
-        put("promisedProposal", new Proposal());
+
+        /*cgm.setup(new PromiseCodeGear());
+        cgm.setup(new AcceptCodeGear());
+        put("promisedProposal", new Proposal());*/
     }
 }
--- a/src/main/java/christie/test/topology/paxos/acceptor/PromiseCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/acceptor/PromiseCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -1,33 +1,48 @@
 package christie.test.topology.paxos.acceptor;
 
+import christie.annotation.Peek;
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
+import christie.test.topology.paxos.proposer.ProposerCodeGear;
+import christie.topology.TopologyDataGear;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class PromiseCodeGear extends CodeGear {
 
-    @Take
-    Proposal promisedProposal;
+    @Peek
+    TopologyDataGear topoDG;
+
+    //@Peek
+    //Proposal promisedProposal;
 
     @Take
     Proposal prepareProposal;
 
+    Logger logger = LogManager.getLogger(PromiseCodeGear.class);
 
-    public PromiseCodeGear(){ }
 
     @Override
     protected void run(CodeGearManager cgm) {
+        // accept codegearでも使うので, lock
+        PromiseProposal.getInstance().lock();
+        PromiseProposal promiseProposal = PromiseProposal.getInstance();
+        Proposal promisedProposal = promiseProposal.getPromiseProposal();
 
         if(promisedProposal.getNumber() < prepareProposal.getNumber()) {
-            if(promisedProposal.isAccepted()){
-                promisedProposal.setNumber(prepareProposal.getNumber());
-            }else{
+            if(!promisedProposal.isAccepted()){
                 promisedProposal = prepareProposal;
             }
         }
+        promiseProposal.setPromiseProposal(promisedProposal);
+        promiseProposal.unLock();
         put("promisedProposal", promisedProposal);
+        logger.debug("promise " + topoDG.getNodeName() + " " + promisedProposal + ", " + promisedProposal.isAccepted());
         put(prepareProposal.getProposerName(),"receivePromise", promisedProposal);
+
+        //cgm.setup(new PromiseCodeGear(promiseProposal));
         cgm.setup(new PromiseCodeGear());
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/christie/test/topology/paxos/acceptor/PromiseProposal.java	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,46 @@
+package christie.test.topology.paxos.acceptor;
+
+import christie.test.topology.paxos.Proposal;
+
+// singleton
+public class PromiseProposal {
+    Proposal promiseProposal = null;
+
+    private static PromiseProposal instance = new PromiseProposal();
+
+
+    private Object _lock = new Object();
+
+    private boolean sync = false;
+
+    public void setPromiseProposal(Proposal promiseProposal){
+        this.promiseProposal = promiseProposal;
+    }
+
+    public Proposal getPromiseProposal() {
+        return promiseProposal;
+    }
+
+    public synchronized static PromiseProposal getInstance(){
+        return instance;
+    }
+
+    public void lock(){
+        synchronized (_lock){
+            while(sync){
+                try {
+                    _lock.wait();
+                } catch (InterruptedException e) {
+                }
+            }
+        }
+        sync = true;
+    }
+
+    public void unLock(){
+        synchronized (_lock){
+            _lock.notify();
+            sync = false;
+        }
+    }
+}
--- a/src/main/java/christie/test/topology/paxos/acceptor/StartAcceptor.java	Sat Feb 23 04:52:32 2019 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-package christie.test.topology.paxos.acceptor;
-
-
-import christie.test.topology.paxos.proposer.ProposerCodeGear;
-import christie.topology.node.StartTopologyNode;
-import christie.topology.node.TopologyNodeConfig;
-
-public class StartAcceptor {
-
-    public static void main(String[] args){
-        TopologyNodeConfig topologyNodeConfig = new TopologyNodeConfig(args);
-        new StartTopologyNode(topologyNodeConfig, new AcceptCodeGear());
-    }
-
-}
-
-
--- a/src/main/java/christie/test/topology/paxos/learner/AggregateProposalCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/learner/AggregateProposalCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -5,14 +5,24 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
+import christie.topology.Message;
+import christie.topology.node.TopologyNodeConfig;
 
 import java.util.HashMap;
 
 public class AggregateProposalCodeGear extends CodeGear {
 
-    @Take
+    @Peek
+    TopologyNodeConfig topologyNodeConfig;
+
+    //@Take
     HashMap<String, Proposal> acceptedMap;
 
+
+    public AggregateProposalCodeGear(HashMap<String, Proposal> acceptedMap){
+        this.acceptedMap=acceptedMap;
+    }
+
     @Override
     protected void run(CodeGearManager cgm) {
         HashMap<Integer, Integer> proposalValueMap = new HashMap<>();
@@ -22,14 +32,16 @@
                 int count = proposalValueMap.get(value).intValue();
                 count++;
                 if(count > proposal.getAcceptorNum()/2) {
-                    System.out.println(value);
-                    break;
+                    System.out.println("finish " + proposal);
+                    getDGM(topologyNodeConfig.getManagerKey()).put("FINISHMESSAGE", new Message());
+                    return;
                 }
                 proposalValueMap.replace(value, count);
             }else{
                 proposalValueMap.put(value, 1);
             }
         }
-        put("acceptedMap", acceptedMap);
+        //put("acceptedMap", acceptedMap);
+        cgm.setup(new RecieveAcceptProposalCodeGear(acceptedMap));
     }
 }
--- a/src/main/java/christie/test/topology/paxos/learner/LearnerCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/learner/LearnerCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -12,7 +12,6 @@
     @Override
     protected void run(CodeGearManager cgm) {
 
-        cgm.setup(new RecieveAcceptProposalCodeGear());
-        put("acceptedMap", new HashMap<String, Proposal>());
+        cgm.setup(new RecieveAcceptProposalCodeGear(new HashMap<String, Proposal>()));
     }
 }
--- a/src/main/java/christie/test/topology/paxos/learner/RecieveAcceptProposalCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/learner/RecieveAcceptProposalCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -13,16 +13,24 @@
     @Take
     Proposal acceptedProposal;
 
-    @Take
+    //@Peek
     HashMap<String, Proposal> acceptedMap;
 
+    public RecieveAcceptProposalCodeGear(HashMap<String, Proposal> acceptedMap){
+        this.acceptedMap=acceptedMap;
+    }
+
 
     @Override
     protected void run(CodeGearManager cgm) {
+        System.out.println("accepted : " + acceptedProposal);
         acceptedMap.put(acceptedProposal.getAcceptorName(),
                         acceptedProposal);
-        put("acceptedMap", acceptedMap);
-        if(acceptedMap.size() > acceptedProposal.getAcceptorNum()/2) cgm.setup(new AggregateProposalCodeGear());
-        cgm.setup(new RecieveAcceptProposalCodeGear());
+        //put("acceptedMap", acceptedMap);
+
+        if(acceptedMap.size() > acceptedProposal.getAcceptorNum()/2)
+            cgm.setup(new AggregateProposalCodeGear(acceptedMap));
+        else
+            cgm.setup(new RecieveAcceptProposalCodeGear(acceptedMap));
     }
 }
--- a/src/main/java/christie/test/topology/paxos/learner/StartLearner.java	Sat Feb 23 04:52:32 2019 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-package christie.test.topology.paxos.learner;
-
-
-import christie.test.topology.paxos.proposer.ProposerCodeGear;
-import christie.topology.node.StartTopologyNode;
-import christie.topology.node.TopologyNodeConfig;
-
-public class StartLearner {
-
-    public static void main(String[] args){
-        TopologyNodeConfig topologyNodeConfig = new TopologyNodeConfig(args);
-        new StartTopologyNode(topologyNodeConfig, new LearnerCodeGear());
-    }
-
-}
-
-
--- a/src/main/java/christie/test/topology/paxos/proposer/ProposerCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/proposer/ProposerCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,8 @@
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
 import christie.topology.TopologyDataGear;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
 
@@ -19,10 +21,9 @@
         String nodeName = topoDG.getNodeName();
         int proposerNum = topoDG.getTotalNodeNum();
         List<String> _CLIST = topoDG.getConnectionList();
-        cgm.setup(new SendPrepareRequestCodeGear());
-        put("promiseCount", 0);
-        int id = Character.getNumericValue(nodeName.charAt(nodeName.length() - 1));
-        put("sendProposal", new Proposal(nodeName, proposerNum, id, id, _CLIST.size()));
+
+        int id = Character.getNumericValue(nodeName.charAt(nodeName.length() - 1)) + 1;
+        cgm.setup(new SendPrepareRequestCodeGear(new Proposal(nodeName, proposerNum, id, id, _CLIST.size())));
     }
 }
 
--- a/src/main/java/christie/test/topology/paxos/proposer/ReceivePromiseCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/proposer/ReceivePromiseCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,52 +4,56 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class ReceivePromiseCodeGear extends CodeGear{
-    @Take
+    //@Take
     Proposal sendedProposal;
 
     @Take
     Proposal receivePromise;
 
-    @Take
+    //@Take
     int promiseCount;
 
+    int maxRecvProposalNumber;
+
+    Logger logger = LogManager.getLogger(RecieveAcceptedCodeGear.class);
+
+
+    public ReceivePromiseCodeGear(Proposal sendedProposal){
+        this(0, sendedProposal, 0);
+    }
+
+    public ReceivePromiseCodeGear(int promiseCount, Proposal sendedProposal, int maxRecvProposalNumber){
+        this.promiseCount = promiseCount;
+        this.sendedProposal = sendedProposal;
+        this.maxRecvProposalNumber = maxRecvProposalNumber;
+    }
+
 
     @Override
     protected void run(CodeGearManager cgm) {
         promiseCount++;
 
-        if(receivePromise.isAccepted()){
-            if(sendedProposal.isAccepted()){
-                if(receivePromise.getNumber() > sendedProposal.getNumber()){
-                    put("sendedProposal", receivePromise);
-                }else{
-                    put("sendedProposal", sendedProposal);
+        if(receivePromise.getNumber() > sendedProposal.getNumber()){
+            cgm.setup(new SendPrepareRequestCodeGear(sendedProposal));
+        }else{
+            if(receivePromise.isAccepted()){
+                int recvProposalNumber = receivePromise.getNumber();
+                if(maxRecvProposalNumber < recvProposalNumber) {
+                    maxRecvProposalNumber = recvProposalNumber;
+                    sendedProposal.setValue(receivePromise.getValue());
                 }
-            }else{
-                sendedProposal.setValue(receivePromise.getValue());
-                put("sendedProposal", sendedProposal);
-            }
-        }else{
-            if(receivePromise.getNumber() > sendedProposal.getNumber()){
-                promiseCount = 0;
-                sendedProposal.incrementNumber();
-                put("sendProposal", sendedProposal);
-                cgm.setup(new SendPrepareRequestCodeGear());
-            }else{
-                put("sendedProposal", sendedProposal);
             }
         }
 
-        put("promiseCount", promiseCount);
-
+        if(promiseCount > sendedProposal.getAcceptorNum()/2){
 
-        if(promiseCount > sendedProposal.getAcceptorNum()/2){
-            put("acceptProposal", sendedProposal);
-            cgm.setup(new SendAcceptRequestCodeGear());
+            cgm.setup(new SendAcceptRequestCodeGear(sendedProposal));
         }else {
-            cgm.setup(new ReceivePromiseCodeGear());
+            cgm.setup(new ReceivePromiseCodeGear(promiseCount, sendedProposal, maxRecvProposalNumber));
         }
     }
 }
--- a/src/main/java/christie/test/topology/paxos/proposer/RecieveAcceptedCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/proposer/RecieveAcceptedCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,23 +4,32 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 public class RecieveAcceptedCodeGear extends CodeGear {
 
     @Take
     Proposal acceptedProposal;
 
-    @Take
+    //@Take
     Proposal sendedProposal;
 
+    Logger logger = LogManager.getLogger(RecieveAcceptedCodeGear.class);
+
+    public RecieveAcceptedCodeGear(Proposal sendedProposal){
+        this.sendedProposal = sendedProposal;
+    }
+
     @Override
     protected void run(CodeGearManager cgm) {
         if(!acceptedProposal.isAccepted()){
-            sendedProposal.incrementNumber();
-            put("sendProposal", sendedProposal);
-            cgm.setup(new SendPrepareRequestCodeGear());
+            //put("sendProposal", sendedProposal);
+            //logger.debug("transition send preparerequest");
+            cgm.setup(new SendPrepareRequestCodeGear(sendedProposal));
         }else{
-            cgm.setup(new RecieveAcceptedCodeGear());
+            //logger.debug("accepted " + sendedProposal);
+            cgm.setup(new RecieveAcceptedCodeGear(sendedProposal));
         }
     }
 }
--- a/src/main/java/christie/test/topology/paxos/proposer/SendAcceptRequestCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/proposer/SendAcceptRequestCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,25 +6,44 @@
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
 import christie.topology.TopologyDataGear;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 
 public class SendAcceptRequestCodeGear extends CodeGear {
 
-    @Take
+    //@Take
     Proposal acceptProposal;
 
     @Peek
     TopologyDataGear topoDG;
 
+    Logger logger = LogManager.getLogger(SendPrepareRequestCodeGear.class);
+
+    public SendAcceptRequestCodeGear(Proposal acceptProposal){
+        this.acceptProposal = acceptProposal;
+    }
+
     @Override
     protected void run(CodeGearManager cgm) {
         List<String> _CLIST = topoDG.getConnectionList();
-        for(String acceptorName: _CLIST)
-            put(acceptorName, "acceptProposal", acceptProposal);
+
+
+        /*try {
+            Thread.sleep(10000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }*/
 
-        put("sendedProposal", acceptProposal);
-        cgm.setup(new RecieveAcceptedCodeGear());
+        for(String acceptorName: _CLIST) {
+            put(acceptorName, "acceptProposal", acceptProposal);
+        }
+        logger.debug("send accept request : " + acceptProposal);
+
+        //put("sendedProposal", acceptProposal);
+        cgm.setup(new RecieveAcceptedCodeGear(acceptProposal));
     }
 }
--- a/src/main/java/christie/test/topology/paxos/proposer/SendPrepareRequestCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/paxos/proposer/SendPrepareRequestCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,24 +6,35 @@
 import christie.codegear.CodeGearManager;
 import christie.test.topology.paxos.Proposal;
 import christie.topology.TopologyDataGear;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
 
 public class SendPrepareRequestCodeGear extends CodeGear{
 
-    @Take
+    //@Take
     Proposal sendProposal;
 
     @Peek
     TopologyDataGear topoDG;
 
+    Logger logger = LogManager.getLogger(SendPrepareRequestCodeGear.class);
+
+    public SendPrepareRequestCodeGear(Proposal sendProposal){
+        this.sendProposal = sendProposal;
+    }
+
     @Override
     protected void run(CodeGearManager cgm) {
         List<String> _CLIST = topoDG.getConnectionList();
-        for(String acceptorName: _CLIST)
-            put(acceptorName, "prepareProposal", sendProposal);
+        sendProposal.incrementNumber();
 
-        put("sendedProposal", sendProposal);
-        cgm.setup(new ReceivePromiseCodeGear());
+        for(String acceptorName: _CLIST) {
+            put(acceptorName, "prepareProposal", sendProposal);
+        }
+        logger.debug("send prepare request : " + sendProposal);
+
+        cgm.setup(new ReceivePromiseCodeGear(sendProposal));
     }
 }
--- a/src/main/java/christie/test/topology/paxos/proposer/StartProposer.java	Sat Feb 23 04:52:32 2019 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-package christie.test.topology.paxos.proposer;
-
-
-import christie.codegear.CodeGearManager;
-import christie.codegear.StartCodeGear;
-
-import christie.topology.node.StartTopologyNode;
-import christie.topology.node.TopologyNodeConfig;
-
-public class StartProposer {
-
-    public static void main(String[] args){
-        TopologyNodeConfig topologyNodeConfig = new TopologyNodeConfig(args);
-        new StartTopologyNode(topologyNodeConfig, new ProposerCodeGear());
-    }
-
-}
-
-
--- a/src/main/java/christie/test/topology/treeTestTopology/ParentCodeGear.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/test/topology/treeTestTopology/ParentCodeGear.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,6 +4,7 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 import christie.topology.node.TopologyNodeConfig;
 
@@ -27,7 +28,7 @@
     protected void run(CodeGearManager cgm) {
         System.out.println(topoDG.getNodeName() + " : " + childNodeName + " accept");
         if(countNodeNum == maxNodeNum){
-            getDGM(topologyNodeConfig.getManagerKey()).put("finish", "");
+            getDGM(topologyNodeConfig.getManagerKey()).put("FINISHMESSAGE", new Message());
         }else{
             getLocalDGM().put("countNodeNum", countNodeNum + 1);
             cgm.setup(new ParentCodeGear());
--- a/src/main/java/christie/topology/HostMessage.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/HostMessage.java	Mon Feb 25 16:40:17 2019 +0900
@@ -67,7 +67,7 @@
 
     public String toString() {
         return "HostMessage : name = " + hostName + ", port = " + Integer.toString(port) + " connectionName = " +
-                connectionName + " absName = " + nodeName + " remoteAbsName = " + remoteNodeName
+                connectionName + " nodeName = " + nodeName + " remoteNodeName = " + remoteNodeName
                 + " cokkie = " + cookie ;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/christie/topology/Message.java	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,9 @@
+package christie.topology;
+
+@org.msgpack.annotation.Message
+public class Message {
+
+    public Message(){
+
+    }
+}
--- a/src/main/java/christie/topology/manager/ConfigWaiter.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/manager/ConfigWaiter.java	Mon Feb 25 16:40:17 2019 +0900
@@ -5,6 +5,7 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.topology.Message;
 
 
 import java.util.LinkedList;
@@ -15,7 +16,7 @@
     LinkedList<String> waiterNodeNames;
 
     @Take
-    String nodePrepareDone;
+    Message _DONEMESSAGE;
 
     @Take
     int nodeNum;
@@ -26,8 +27,8 @@
     protected void run(CodeGearManager cgm) {
         nodeNum--;
         if (nodeNum == 0) {
-            getLocalDGM().put("start", "start");
-            for (String nodeName: waiterNodeNames) getDGM(nodeName).put("start", "start");
+            getLocalDGM().put("_STARTMESSAGE", new Message());
+            for (String nodeName: waiterNodeNames) getDGM(nodeName).put("_STARTMESSAGE", new Message());
             getLocalDGM().put("startTime", System.currentTimeMillis());
             getLocalDGM().put("running", true);
 
--- a/src/main/java/christie/topology/manager/CreateTreeTopology.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/manager/CreateTreeTopology.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,7 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.topology.HostMessage;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 
 import java.util.HashMap;
@@ -59,7 +60,6 @@
 
         if (hostCount == 0) {
             // どこにも繋がれるところがないので, ルートのとき.
-
         } else {
             // put parent information own
             String parentNodeName = parentManager.getMyParent();
@@ -83,9 +83,10 @@
         getLocalDGM().put("nameTable", nameTable);
         getLocalDGM().put("parentManager", parentManager);
 
-        getDGM(nodeName).put("remoteNodeInfo", new HostMessage() );
-        getDGM(nodeName).put("reverseNodeName", "");
-        getDGM(nodeName).put("start", "start");
+        getDGM(nodeName).put("connectNodeNum", 1);
+        getDGM(nodeName).put("remoteNodeInfo", new HostMessage());
+        getDGM(nodeName).put("_CONNECTIONMESSAGE", new Message());
+        getDGM(nodeName).put("_STARTMESSAGE", new Message());
         getLocalDGM().put("startTime", System.currentTimeMillis());
 
         cgm.setup(new CreateTreeTopology());
--- a/src/main/java/christie/topology/manager/IncomingHosts.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/manager/IncomingHosts.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,7 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.topology.HostMessage;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 
 import java.util.HashMap;
@@ -49,12 +50,11 @@
         absCookieTable.put(MD5, nodeName);
         getLocalDGM().put("absCookieTable", absCookieTable);
 
-
         getDGM(nodeName).put("cookie", MD5);
 
         LinkedList<HostMessage> nodeInfoList = resultParse.get(nodeName);
         put(nodeName, "connectNodeNum", nodeInfoList.size());
-        if(nodeInfoList.size() == 0) put(nodeName,"reverseNodeName", "");
+        if(nodeInfoList.size() == 0) put(nodeName,"_CONNECTIONMESSAGE", new Message());
 
         for (HostMessage nodeInfo : nodeInfoList) {
 
@@ -94,9 +94,10 @@
                 }
                 put(key, "remoteNodeInfo", new HostMessage()); // end mark
             }
+        }else{
+            cgm.setup(new IncomingHosts());
         }
         getLocalDGM().put("resultParse", resultParse);
 
-        cgm.setup(new IncomingHosts());
     }
 }
--- a/src/main/java/christie/topology/manager/TopologyFinish.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/manager/TopologyFinish.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,11 +4,12 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.topology.Message;
 
 
 public class TopologyFinish extends CodeGear {
     @Take
-    String finish;
+    Message FINISHMESSAGE;
 
     @Peek
     TopologyManagerConfig topologyManagerConfig;
@@ -24,7 +25,7 @@
 
 
        for(String dgm : cgm.getDGMList().keySet()){
-            getDGM(dgm).put("_CLOSEMESSEAGE", "_CLOSEMESSEAGE");
+            getDGM(dgm).put("_CLOSEMESSEAGE", new Message());
             getDGM(dgm).shutdown();
         }
 
--- a/src/main/java/christie/topology/manager/TopologyManager.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/manager/TopologyManager.java	Mon Feb 25 16:40:17 2019 +0900
@@ -8,6 +8,7 @@
 import java.util.LinkedList;
 
 import christie.topology.HostMessage;
+import christie.topology.Message;
 
 public class TopologyManager extends CodeGear {
 
@@ -24,7 +25,7 @@
 
         if(topologyManagerConfig.dynamic) {
             getLocalDGM().put("running", true);
-            getLocalDGM().put("start", "start");
+            getLocalDGM().put("_STARTMESSAGE", new Message());
 
             if (topologyManagerConfig.type == TopologyType.Tree) {
                 getLocalDGM().put("parentManager", new ParentManager(topologyManagerConfig.hasChild));
--- a/src/main/java/christie/topology/node/ConfigurationFinish.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/node/ConfigurationFinish.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,15 +4,14 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.daemon.Config;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 
 public class ConfigurationFinish extends CodeGear {
 
     @Take
-    String reverseNodeName;
-
-    @Take
-    int reverseCount;
+    Message _CONNECTIONMESSAGE;
 
     @Peek
     int connectNodeNum;
@@ -20,15 +19,19 @@
     @Peek
     TopologyNodeConfig topologyNodeConfig;
 
+    int reverseCount;
 
-    public ConfigurationFinish() {
+    public ConfigurationFinish(){reverseCount = 0;}
+
+    public ConfigurationFinish(int reverseCount) {
+        this.reverseCount = reverseCount;
     }
 
     @Override
     protected void run(CodeGearManager cgm) {
         reverseCount++;
         if (reverseCount >= connectNodeNum) {
-            getDGM(topologyNodeConfig.getManagerKey()).put("nodePrepareDone", "done");
+            getDGM(topologyNodeConfig.getManagerKey()).put("_DONEMESSAGE", new Message());
             cgm.setup(new Start());
 
 
@@ -42,8 +45,7 @@
             return;
 
         }else {
-            getLocalDGM().put("reverseCount", reverseCount);
-            cgm.setup(new ConfigurationFinish());
+            cgm.setup(new ConfigurationFinish(reverseCount));
         }
     }
 }
--- a/src/main/java/christie/topology/node/IncomingConnectionInfo.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/node/IncomingConnectionInfo.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,7 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.topology.HostMessage;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 
 
@@ -14,11 +15,11 @@
     @Take
     HostMessage remoteNodeInfo;
 
-    int count;
-
     @Take
     TopologyDataGear topoDG;
 
+    int count;
+
     public IncomingConnectionInfo() {
         this.count = 0;
     }
@@ -34,6 +35,7 @@
 
         if (remoteNodeInfo.getHostName().equals("")) { // end case
             getLocalDGM().put("topoDG", topoDG);
+            // returnしないとtopoDGが使えない.
             return;
         }
 
@@ -43,10 +45,9 @@
 
         topoDG.addConnection(connectionName);
         getLocalDGM().put("topoDG", topoDG);
-        getDGM(connectionName).put("reverseNodeName",connectionName);
-        count++;
+        getDGM(connectionName).put("_CONNECTIONMESSAGE",new Message());
 
-        cgm.setup(new IncomingConnectionInfo(count));
+        cgm.setup(new IncomingConnectionInfo(count + 1));
     }
 
 }
--- a/src/main/java/christie/topology/node/PrepareToClose.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/node/PrepareToClose.java	Mon Feb 25 16:40:17 2019 +0900
@@ -6,6 +6,7 @@
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
 import christie.datagear.DataGearManager;
+import christie.topology.Message;
 import christie.topology.TopologyDataGear;
 
 import java.util.List;
@@ -13,7 +14,7 @@
 public class PrepareToClose extends CodeGear {
 
     @Take
-    String _CLOSEMESSEAGE;
+    Message _CLOSEMESSEAGE;
 
     @Peek
     TopologyDataGear topoDG;
--- a/src/main/java/christie/topology/node/Start.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/node/Start.java	Mon Feb 25 16:40:17 2019 +0900
@@ -4,11 +4,12 @@
 import christie.annotation.Take;
 import christie.codegear.CodeGear;
 import christie.codegear.CodeGearManager;
+import christie.topology.Message;
 
 public class Start extends CodeGear {
 
     @Peek
-    String start;
+    Message _STARTMESSAGE;
 
     @Take
     CodeGear startCG;
--- a/src/main/java/christie/topology/node/TopologyNode.java	Sat Feb 23 04:52:32 2019 +0900
+++ b/src/main/java/christie/topology/node/TopologyNode.java	Mon Feb 25 16:40:17 2019 +0900
@@ -30,8 +30,6 @@
 
         getDGM(topologyNodeConfig.getManagerKey()).put("hostMessage", hostMessage);
 
-        getLocalDGM().put("reverseCount", 0);
-
         cgm.setup(new IncomingConnectionInfo());
         cgm.setup(new ConfigurationFinish());
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/resources/log4j2.xml	Mon Feb 25 16:40:17 2019 +0900
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d %-5p %c - %m [%t] (%F:%L)%n" />
+        </Console>
+        <File name="File" fileName="christie.log">
+            <PatternLayout pattern="%d %-5p %c - %m [%t] (%F:%L)%n" />
+        </File>
+    </Appenders>
+    <Loggers>
+        <Root level="debug">
+            <AppenderRef ref="Console" />
+            <AppenderRef ref="File"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file