# HG changeset patch # User ichikitakahiro # Date 1551080417 -32400 # Node ID 60afc98ce6a449cd35d5191f5f6c8d5c05ed7623 # Parent cdf604af6c1280352826fa225141d5bbb7f3c158# Parent 149d7fb0cfa668158e2f86a947e56ba1bbff080e マージ diff -r cdf604af6c12 -r 60afc98ce6a4 build.gradle --- 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' } diff -r cdf604af6c12 -r 60afc98ce6a4 scripts/Log/paxos.dot --- 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"] } diff -r cdf604af6c12 -r 60afc98ce6a4 scripts/paxos.pl --- /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++; +} diff -r cdf604af6c12 -r 60afc98ce6a4 scripts/paxos.sh --- /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 diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/daemon/ChristieDaemon.java --- 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(); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/daemon/Config.java --- 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); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/datagear/DataGears.java --- 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(); } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/localTestTopology/LTRemoteIncrement.java --- 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); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/Proposal.java --- 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; + } + + } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/StartPaxosNode.java --- /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()); + } + +} + diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/acceptor/AcceptCodeGear.java --- 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 _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()); + } - } + } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/acceptor/AcceptorCodeGear.java --- 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());*/ } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/acceptor/PromiseCodeGear.java --- 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()); } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/acceptor/PromiseProposal.java --- /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; + } + } +} diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/acceptor/StartAcceptor.java --- 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()); - } - -} - - diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/learner/AggregateProposalCodeGear.java --- 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 acceptedMap; + + public AggregateProposalCodeGear(HashMap acceptedMap){ + this.acceptedMap=acceptedMap; + } + @Override protected void run(CodeGearManager cgm) { HashMap 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)); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/learner/LearnerCodeGear.java --- 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()); + cgm.setup(new RecieveAcceptProposalCodeGear(new HashMap())); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/learner/RecieveAcceptProposalCodeGear.java --- 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 acceptedMap; + public RecieveAcceptProposalCodeGear(HashMap 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)); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/learner/StartLearner.java --- 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()); - } - -} - - diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/ProposerCodeGear.java --- 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 _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()))); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/ReceivePromiseCodeGear.java --- 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)); } } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/RecieveAcceptedCodeGear.java --- 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)); } } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/SendAcceptRequestCodeGear.java --- 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 _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)); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/SendPrepareRequestCodeGear.java --- 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 _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)); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/paxos/proposer/StartProposer.java --- 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()); - } - -} - - diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/test/topology/treeTestTopology/ParentCodeGear.java --- 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()); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/HostMessage.java --- 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 ; } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/Message.java --- /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(){ + + } +} diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/manager/ConfigWaiter.java --- 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 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); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/manager/CreateTreeTopology.java --- 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()); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/manager/IncomingHosts.java --- 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 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()); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/manager/TopologyFinish.java --- 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(); } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/manager/TopologyManager.java --- 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)); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/node/ConfigurationFinish.java --- 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)); } } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/node/IncomingConnectionInfo.java --- 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)); } } diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/node/PrepareToClose.java --- 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; diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/node/Start.java --- 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; diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/java/christie/topology/node/TopologyNode.java --- 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()); diff -r cdf604af6c12 -r 60afc98ce6a4 src/main/resources/log4j2.xml --- /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 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file