comparison rep/handler/Editor.java @ 391:3b0a5a55e3ee

24
author one@firefly.cr.ie.u-ryukyu.ac.jp
date Mon, 10 Nov 2008 22:25:14 +0900
parents 6f356d160e58
children 1d5b608f39da
comparison
equal deleted inserted replaced
390:aa07134fea32 391:3b0a5a55e3ee
18 private Translator translator; 18 private Translator translator;
19 // REPCommands we are going to send to the next editor 19 // REPCommands we are going to send to the next editor
20 private List<REPCommand> sentList = new LinkedList<REPCommand>(); 20 private List<REPCommand> sentList = new LinkedList<REPCommand>();
21 private REPCommand quit2=null; 21 private REPCommand quit2=null;
22 private boolean merging; 22 private boolean merging;
23 public static boolean noMergeMode=false;
23 static final boolean doOptimize = true; 24 static final boolean doOptimize = true;
24 25
25 public Editor(SessionManager manager,int editorNo){ 26 public Editor(SessionManager manager,int editorNo){
26 // no translator case 27 // no translator case
27 super(manager, null); 28 super(manager, null);
36 translator = new Translator(eid,optimizer); 37 translator = new Translator(eid,optimizer);
37 } 38 }
38 39
39 40
40 public void translate(REPCommand command){ 41 public void translate(REPCommand command){
41 42 if (command.eid == eid){
42 if(command.eid == eid){
43 //エディタからの新たな編集コマンド 43 //エディタからの新たな編集コマンド
44 if (next==this) return; // singleton case 44 if (next==this) return; // singleton case
45 translator.transSendCmd(command); 45 translator.transSendCmd(command);
46 sentList.add(new REPCommand(command)); 46 sentList.add(new REPCommand(command));
47 assert(sentList.size()<limit); 47 assert(sentList.size()<limit);
48 next.send(command); 48 next.send(command);
49 return; 49 return;
50 } else if(command.eid == REP.MERGE_EID.id){ 50 } else if (command.eid == REP.MERGE_EID.id){
51 //マージコマンドが返ってきた 51 //マージコマンドが返ってきた
52 if(translator.checkMergeConflict(command)){ 52 if(translator.checkMergeConflict(command)){
53 //マージ中にエディタからの割り込みがあった場合 53 //マージ中にエディタからの割り込みがあった場合
54 translator.getMergeAgain(this); 54 translator.getMergeAgain(this);
55 } 55 }
56 checkEndMerge(); 56 checkEndMerge();
57 } else if(command.eid == next.getEID()){ 57 } else if (command.eid == next.getEID()){
58 // 次のEditorで一周するコマンドが来た 58 // 次のEditorで一周するコマンドが来た
59 if(next==this) return; // singleton case 59 if (next==this) return; // singleton case
60 // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。 60 // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。
61 if (next.isDirect()) 61 if (next.isDirect())
62 ((Editor) next).checkReturnedCommand(command); 62 ((Editor) next).checkReturnedCommand(command);
63 else 63 else
64 next.send(command); 64 next.send(command);
65 } else { 65 } else {
66 //他のエディタからの編集コマンド 66 //他のエディタからの編集コマンド
67 assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid );
68 if (manager.hasWaitingCommand(channel)) { 67 if (manager.hasWaitingCommand(channel)) {
69 // We cannot do this operation before watingCommandQueue. 68 // We cannot do this operation before watingCommandQueue.
70 manager.addWaitingCommand(new PacketSet(channel, this, command)); 69 manager.addWaitingCommand(new PacketSet(channel, this, command));
71 return; 70 return;
72 } 71 } else if (isMerging()) {
73 if(!isMerging()) { 72 manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command)));
73 } else {
74 translator.transReceiveCmd(next,command); 74 translator.transReceiveCmd(next,command);
75 return; 75 }
76 }
77 manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command)));
78 } 76 }
79 return; 77 return;
80 } 78 }
81 79
82 boolean merge(REPCommand command) { 80 boolean merge(REPCommand command) {
83 //マージして送信 81 //マージして送信
84 return translator.catchOwnCommand(this); 82 return translator.catchOwnCommand(this);
85 } 83 }
86 84
85 /**
86 * 一周して来たcommandの処理。
87 * @param command
88 */
87 void checkReturnedCommand(REPCommand command) { 89 void checkReturnedCommand(REPCommand command) {
88 REPCommand prev = sentList.remove(0); 90 REPCommand prev = sentList.remove(0);
89 if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) { 91 if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
90 String err = "Editor.checkReturnedCommand() : command = " + command + " prev="; 92 String err = "Editor.checkReturnedCommand() : command = " + command + " prev=";
91 err += prev==null?"null":prev.toString(); 93 err += prev==null?"null":prev.toString();
92 ServerMainLoop.logger.writeLog(err); 94 ServerMainLoop.logger.writeLog(err);
93 assert(false); 95 assert(false);
94 } 96 }
95 97
98 // merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。
99 if (noMergeMode) {
100 // END_MERGE を出さないと、EditorがprevSeqをreset出来ない。
101 REPCommand ack = new REPCommand(REP.SMCMD_END_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
102 send(ack);
103 return;
104 }
96 // START_MERGE を送る 105 // START_MERGE を送る
97 // 送らないで良い場合もある? 106 // 送らないで良い場合もある?
98 REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); 107 REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
99 send(cmd); 108 send(cmd);
100 merging = true; 109 merging = true;
215 } 224 }
216 225
217 226
218 @Override 227 @Override
219 public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException { 228 public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException {
220 ServerMainLoop.logger.writeLog("REPHandlerImpl.handle() read : command = " + command +" from "+channel); 229 ServerMainLoop.logger.writeLog("Manager "+manager.getId()+"read : command = " + command
230 +" from "+manager.editorList.editorByChannel(channel));
221 if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) { 231 if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) {
222 assert false; 232 assert false;
223 // 若干問題があるらしい 233 // 若干問題があるらしい
224 next = new Forwarder(manager,next.channel); 234 next = new Forwarder(manager,next.channel);
225 REPNode first = new FirstConnector(manager,channel); 235 REPNode first = new FirstConnector(manager,channel);