# HG changeset patch # User one # Date 1287229718 -32400 # Node ID c792a1ebc0ff2464b67cee216862b82716eca58e # Parent 200166a494e9d81d7fd00f38529b5099607e8c26 new merge (again...) diff -r 200166a494e9 -r c792a1ebc0ff rep/handler/Editor.java --- a/rep/handler/Editor.java Sat Oct 16 20:24:11 2010 +0900 +++ b/rep/handler/Editor.java Sat Oct 16 20:48:38 2010 +0900 @@ -152,7 +152,7 @@ //マージコマンドが返ってきた if(checkMergeConflict(command)){ //マージ中にエディタからの割り込みがあった場合 - getMergeAgain(this); + getMergeAgain(); } checkEndMerge(); return; @@ -170,8 +170,10 @@ //他のエディタからの編集コマンド transReceiveCmd(next,command); - - sendEditorCommand(command); + if (mergeMode==MergeMode.Direct) + startMerge(command); + else + sendEditorCommand(command); return; default: assert(false); @@ -180,6 +182,8 @@ private void userEditorCommand(REPCommand command) { //エディタからの新たな編集コマンド + if (mergeMode==MergeMode.Direct) + truncateSentList(command); if (next==this) return; // singleton case transSendCmd(command); sendEditorCommand(command); @@ -209,6 +213,13 @@ // } /** + * truncate sentList and unMergedCmds + */ + private void truncateSentList(REPCommand command) { + + } + + /** * Sending to Editor and waiting Queue * +--------+ * send() --> write() -> | Editor | -> handle() -> manager() @@ -277,14 +288,6 @@ next.send(command); } - public List getSentList() { - return sentList; - } - - public void setSentList(LinkedList list) { - sentList = list; - } - /** * 一周して来たcommandの処理。 * @@ -298,6 +301,11 @@ * @param command */ void checkReturnedCommand(REPCommand command) { + if (mergeMode!=MergeMode.Direct) + startMerge(command); + } + + void startMerge(REPCommand command) { ServerMainLoop.logger.writeLog("Editor"+eid+": startMerge "+command); preMergeCommand = new REPCommand(command); // merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。 @@ -315,7 +323,7 @@ // 入力を止めて、merge にそなえる。merge は、eidtor 側から // ACKが来てから始まる。 } - + /** * sentList と ack を見比べて、正しい順序で来たかどうかを調べる。途中参加したEditorの場合は、Ackは * 無視して良い。 @@ -368,19 +376,15 @@ private void endMerge() { - sortedEditCmds = null; - LinkedListu = new LinkedList(); - boolean flag=true; - for(REPCommand command:unMergedCmds) { - if (command.cmd==REP.REPCMD_MERGE_MARK) { - flag = false; - } - if (flag) u.addLast(command); - } - unMergedCmds = u; - REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,sid,eid,seq(),0,""); sendToEditor(mergeEnd); + if (mergeMode==MergeMode.Direct) { + sendEditorCommand(preMergeCommand); + preMergeCommand = null; + return ; + } + sortedEditCmds = null; + truncateUnMergedCmds(); checkAck(preMergeCommand); if (preMergeCommand.eid==eid) { if (mergeMode==MergeMode.Early) { @@ -394,6 +398,18 @@ preMergeCommand = null; } + public void truncateUnMergedCmds() { + LinkedListu = new LinkedList(); + boolean flag=true; + for(REPCommand command:unMergedCmds) { + if (command.cmd==REP.REPCMD_MERGE_MARK) { + flag = false; + } + if (flag) u.addLast(command); + } + unMergedCmds = u; + } + private void sendAck(REPCommand command) { REPCommand keep = new REPCommand(command); // First Phase End, send ACK @@ -441,7 +457,7 @@ { // マージの処理と次のエディタへコマンドを送信する処理 mergeAck(); - if (!merge(this, preMergeCommand)) { + if (!merge(preMergeCommand)) { // nothing to do, send END_MERGE checkEndMerge(); } @@ -570,7 +586,7 @@ * Start merge process. * @param cmd */ - public boolean merge(Editor editor, REPCommand prev){ + public boolean merge(REPCommand prev){ logger.writeLog("beforeMerge"+eid+":"+unMergedCmds); LinkedList output = new LinkedList(); LinkedList newSentList = new LinkedList(); @@ -581,21 +597,21 @@ } sortedEditCmds = new TreeSet(new REPCommandComparator(1)); - logger.writeLog("sentList"+eid+":"+editor.getSentList()); - for( REPCommand cmd0 : editor.getSentList()) { + logger.writeLog("sentList"+eid+":"+sentList); + for( REPCommand cmd0 : sentList ) { if (cmd0.cmd==REP.REPCMD_INSERT || cmd0.cmd==REP.REPCMD_DELETE) { sortedEditCmds.add(cmd0); } } output.addAll(sortedEditCmds); - output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), "")); + output.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0,sid, REP.MERGE_EID.id, seq(), "")); logger.writeLog("sortedMerge"+eid+":"+sortedEditCmds); // unMerged command のdeleteのundo string は、この時点で使えない。 // Editor 側から送り返して来たものを使う必要がある。 unMergedCmds.clear(); + sentList = newSentList; logger.writeLog("outputMerge"+eid+":"+output); - editor.setSentList(newSentList); - return optimizedSend(editor,output); + return optimizedSend(this,output); } /** @@ -683,7 +699,7 @@ return mergeAgain; } - public void getMergeAgain(Editor editor) { + public void getMergeAgain() { if (sentMergedList.size()>0) return; // wait for previous merge completion LinkedList returnCommand = new LinkedList(); @@ -692,12 +708,12 @@ returnCommand.add(createUndo(command)); } returnCommand.addAll(sortedEditCmds); - returnCommand.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, editor.getSID(), REP.MERGE_EID.id, editor.seq(), "")); - returnCommand.addAll(editor.getSentList()); + returnCommand.addLast(new REPCommand(REP.REPCMD_MERGE_MARK,0, sid, REP.MERGE_EID.id, seq(), "")); + returnCommand.addAll(sentList); unMergedCmds.clear(); logger.writeLog("MergeAgain "+eid+" ret="+returnCommand.size()); mergeAgain = false; - optimizedSend(editor, returnCommand); + optimizedSend(this, returnCommand); } // // public boolean isFinished() {