# HG changeset patch # User one # Date 1287897400 -32400 # Node ID 6d7e284f22dc4dd4c1ad7e4a4add9c39ad874e1e # Parent 280a04224c6c776197d980a044f8859ec2c381fa global sequence mode diff -r 280a04224c6c -r 6d7e284f22dc Todo --- a/Todo Sun Oct 24 14:16:27 2010 +0900 +++ b/Todo Sun Oct 24 14:16:40 2010 +0900 @@ -1,3 +1,13 @@ +Sun Oct 24 13:24:55 JST 2010 + +gseq + editor-id + lseq の順にソートする +gseq は、他コマンドが来た時に、それよりも大きく設定する +gseq をsyncするプロトコルが必要 (heart beat を兼ねて) + + gseq * 1000 + lseq +で良い? lseq がoverflowしたら gseq が一つ増える。 +自分で遅くする分には問題ない + Sat Oct 23 22:24:31 JST 2010 Editor1 Editor2 Editor3 @@ -43,6 +53,8 @@ Editor3で、eがa,cを追い越せない理由は? + なんらかのマークがないと区別できない + c_a _ed _f_ diff -r 280a04224c6c -r 6d7e284f22dc rep/handler/Editor.java --- a/rep/handler/Editor.java Sun Oct 24 14:16:27 2010 +0900 +++ b/rep/handler/Editor.java Sun Oct 24 14:16:40 2010 +0900 @@ -80,11 +80,11 @@ (4) 他のEditorのCommandを受け取ってから、ack が来るまでのCommandをキューに 入れておき、ack が来たら、eid とCommandの順序を基にソートする。(other merge (Slow)) Direct - (5) 他のEditor Command が来た時点で、すぐにmergeする - (6) 自分のEditor Command が来て、 - 未確定の他のEditor Command があれば、それを確定(sentList/unMergedListから削除) - 自分のEditor Command はsentListに追加 (unMergedListには既に入っている) - (7) Ackが来たら、そのEditor Command まで確定 + seq = gseq*limit + lseq + (5) 他のEditor Command が来た時点で、すぐにmergeする。 gseqを他コマンドのgseqよりも +   大きくなるように設定。sentListに追加 + (6) 自分のEditor Command はsentListに追加 + (7) Ackが来たら、そのEditor Command まで確定 (sentList/unMergedListから削除) Editor には、ソートした編集結果になるように、それまで行なった編集をUndo して、ソートした編集結果を適用する。Undo が無駄な動作をしないように最適化する。 @@ -192,8 +192,12 @@ } } + + /** + * エディタからの新たな編集コマンド + * @param command + */ private void userEditorCommand(REPCommand command) { - //エディタからの新たな編集コマンド if (next==this) return; // singleton case transSendCmd(command); sendEditorCommand(command); @@ -415,22 +419,11 @@ } /** - * User Editor Command Fix the command order of - * other editor commands except own command - * truncate sentList and unMergedCmds. - *   mode==false Don't truncate unMergedCmds after merge mark + * User Editor Command + * no truncate here */ private void truncateSentList(REPCommand commit, boolean mode) { if (mode && blocking) return; // merging is not enough except from endMerge() - LinkedLists = new LinkedList(); - for(REPCommand command:sentList) { - if (command.eid!=eid) { - s.clear(); - continue; - } - s.addLast(command); - } - sentList = s; } /** @@ -642,7 +635,6 @@ public boolean merge(REPCommand prev){ logger.writeLog("beforeMerge"+eid+":"+sentList); LinkedList output = new LinkedList(); - LinkedList newSentList = new LinkedList(); // merge queue上にあるコマンドを全部undoコマンドするのと同時に // sort したコマンド列を生成する for( REPCommand cmd0 : sentList) { @@ -652,25 +644,17 @@ sortedEditCmds = new TreeSet(new REPCommandComparator(1)); logger.writeLog("sentList"+eid+":"+sentList); - boolean flag = true; for( REPCommand cmd0 : sentList ) { - if (cmd0.cmd==REP.REPCMD_MERGE_MARK) { - flag = false; - } if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) { - if (flag) sortedEditCmds.add(cmd0); - else newSentList.add(cmd0); + sortedEditCmds.add(cmd0); } } output.addLast(mergeMark); + output.addAll(sortedEditCmds); LinkedList ns = new LinkedList(); - output.addAll(sortedEditCmds); ns.addAll(sortedEditCmds); - ns.addLast(mergeMark); - output.addAll(newSentList); - ns.addAll(newSentList); sentList = ns; - logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds+newSentList); + logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds); // unMerged command のdeleteのundo string は、この時点で使えない。 // Editor 側から送り返して来たものを使う必要がある。 logger.writeLog("outputMerge"+eid+":"+output); @@ -753,6 +737,8 @@ public int compare(REPCommand o1, REPCommand o2) { int eid1 = o1.eid-base; if (eid1<0) eid1 += Integer.MAX_VALUE; int eid2 = o2.eid-base; if (eid2<0) eid2 += Integer.MAX_VALUE; + if ( gSeq(o1)gSeq(o2) ) return 1; if ( eid1eid2 ) return 1; if ( o1.seq seq / gseqLimit) { + setSeq((gSeq(cmd)/gseqLimit+1)*gseqLimit); + } + } + public void setEid(int _eid){ eid = _eid; } diff -r 280a04224c6c -r 6d7e284f22dc rep/handler/Forwarder.java --- a/rep/handler/Forwarder.java Sun Oct 24 14:16:27 2010 +0900 +++ b/rep/handler/Forwarder.java Sun Oct 24 14:16:40 2010 +0900 @@ -35,6 +35,10 @@ public int seq() { return seq++; } + + public void setSeq(int seq) { + this.seq = seq; + } @Override public void send(REPCommand command) {