Mercurial > hg > RemoteEditor > REPSessionManager
changeset 361:65c6d12a5835
*** empty log message ***
author | kono |
---|---|
date | Sun, 19 Oct 2008 22:50:20 +0900 |
parents | b25f832f875d |
children | f0bd158dace6 |
files | Todo rep/EditorList.java rep/Forwarder.java rep/Session.java rep/SessionManager.java |
diffstat | 5 files changed, 100 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/Todo Sun Oct 19 20:30:52 2008 +0900 +++ b/Todo Sun Oct 19 22:50:20 2008 +0900 @@ -1,6 +1,21 @@ +Sun Oct 19 21:23:27 JST 2008 + +Todo: dispatch先のEditorの作成 (kono) + +Session は select 時に、channelを持つeditorが登録される。 +外から来た場合は、新しくeditor を作って、それをsession +に登録する必要がある。SessionManagerの入口のforwarderを +session に登録してしまうと、Sessionが一つの時にしか動かない。 + +put_ack は、putの時にすぐに出してしまって構わない。select_ack +が廻るので、その時にput_ackを出しても良いが... + +Todo: (kono) +複数のsessionのテストを作成する + Sat Oct 18 20:03:10 JST 2008 -Note: Routing Table (kono) +Todo: Routing Table (kono) Routing Table (Session, Editor)を作るには、上下双方向の通信が必要。 SessionID を master が作ると、一旦、multi cast した後、もう一度、 @@ -25,10 +40,11 @@ update は、木をさかのぼりrouting tableを構築する。 これで上方向のroutingは確定する。update_ackにより、 下方向のsesionn routing tableが確定する。 + Done: Sun Oct 19 21:29:08 JST 2008 Wed Oct 15 13:33:58 JST 2008 -Note: (kono) +Todo: (kono) Session List を渡すタイミング @@ -56,19 +72,27 @@ に接続される場合があるってことか。ってことは、やっぱり、 session manager id を配布するべきだってことね。で、 SMの名前はあくまでも補助的に使う。 + Done: Sun Oct 19 21:29:08 JST 2008 +Todo: (kono) UPDATEの情報によって削除も行なう。delete entry が必要。 +Todo: (kono) Routing Table <eid, channel> <sid, channel> null は、local。channel==parent なら、自分の下にはいない。 + Done: Sun Oct 19 21:29:08 JST 2008 Tue Oct 14 06:02:37 JST 2008 Todo: (kono) 取りあえず、sm_join()からか。次は、join(),put()。そして、 -update()。select()。最後に、gather()。 +update()。select()。 + Done: Sun Oct 19 21:29:08 JST 2008 + +Todo: (kono) +最後に、gather()。 Todo: (kono) Select用に、routing tableが必要らしい。session ringへの @@ -82,6 +106,7 @@ host_aからのsm_joinを受け取ったら、sm_join(host_a)を親に送る。 host_aがsm_join(host_a)を受け取ったら、それはloop。親がsm_join を受け取れば、そこからsm_join_ackを流して終了。 + Done: Sun Oct 19 21:29:08 JST 2008 Note: (kono) 複数のsession managerにsm_joinする場合もある。その場合は、 @@ -149,13 +174,19 @@ Todo: (kono) PUT の時に、master session managerまで行って、session番号を確定する 必要がある。それまでは、PUT_ACKを出してはならない。 + Done: Sun Oct 19 21:29:08 JST 2008 + session manager IDを使ってuniqueにしたので、不要になった。 + 即座に PUT_ACKを出して構わない。 Todo: (kono) SM_JOIN時にmaster session managerを決定するプロトコルを実装する必要が ある。たぶん、UPDATEだと思うが... + Done: Sun Oct 19 21:29:08 JST 2008 + 木の根をmasterとして、変更しない。 Todo: (kono) 外から、きたSession Listを、ただしく自分に反映する。 + Done: Sun Oct 19 21:29:08 JST 2008 Todo: (kono) test.ServerSample.java はあるが、ClientSample.java がない。 @@ -167,6 +198,8 @@ Todo: END_MERGEが繰り返し出てしまう(kono) + Done: Sun Oct 19 21:29:08 JST 2008 + 直ったかな? Sat Oct 11 22:28:49 JST 2008 @@ -187,6 +220,9 @@ Fri Oct 10 15:24:42 JST 2008 sid は大域的にuniqueにする必要がある。UPDATEで新しくsessionを作ったことを 通知して、Masterが新しいsidを決定し、UPDATE_ACKで他のSessionManagerに知らせる(kono) + Done: Sun Oct 19 21:29:08 JST 2008 + put時に、そのsession managerでsession manager idを使って、 + uniqueなsidを作成する。put/join/ackで他のSessionManagerに知らせる。 Mon Oct 6 16:39:57 JST 2008
--- a/rep/EditorList.java Sun Oct 19 20:30:52 2008 +0900 +++ b/rep/EditorList.java Sun Oct 19 22:50:20 2008 +0900 @@ -9,39 +9,17 @@ */ private static final long serialVersionUID = 1L; private int eid_root=0; - private HashMap<Integer,Editor> waiting= new HashMap<Integer,Editor>(); - - - public void addWaitingEditor(Editor fw) { - waiting.put(fw.getEID(),fw); - } public void add(Editor fw) { put(fw.getEID(),fw); } - public void assignSessionManagerIDtoWaitingSM(int eid) { - // 待っていたEditorを登録する。 - // に登録する。この後、EditorのPUT/JOINに従って、ACKを送り、EID - // を確定する。 - Editor waiter; - if ((waiter=waiting.remove(eid))!=null) { - put(eid,waiter); - return; - } - assert false; - } - public int newEid() { return ++eid_root; } - public boolean waiting(Editor editor) { - return waiting.containsKey(editor.getEID()); - } - public boolean hasEid(int eid) { return containsKey(eid);
--- a/rep/Forwarder.java Sun Oct 19 20:30:52 2008 +0900 +++ b/rep/Forwarder.java Sun Oct 19 22:50:20 2008 +0900 @@ -77,6 +77,7 @@ REPCommand command = channel.read(); SessionManager.logger.writeLog("REPHandlerImpl.handle() : command = " + command); if (manager.sessionManage(this, command)) return; + Session s = manager.getSession(command.sid); Forwarder editor = s.getFirstForwarder(); if (editor!=null) {
--- a/rep/Session.java Sun Oct 19 20:30:52 2008 +0900 +++ b/rep/Session.java Sun Oct 19 22:50:20 2008 +0900 @@ -173,4 +173,12 @@ sessionName = string; } + + public void setFirstForwarder(Forwarder f) { + put(f.eid,f); + firstForwarder = last = f; + } + + + }
--- a/rep/SessionManager.java Sun Oct 19 20:30:52 2008 +0900 +++ b/rep/SessionManager.java Sun Oct 19 22:50:20 2008 +0900 @@ -323,6 +323,11 @@ } + /* + * Select Session from Manager button + * selected editor is joined editor directly connected to this session + * manager. + */ public void selectSession(SelectButtonEvent event) throws IOException { int sid = event.getSID(); Session session = sessionList.get(sid); @@ -337,29 +342,43 @@ selectSession(sid, session, editor.getEID(), editor); } - + /* + * Select Session Protocol handler + */ private void selectSession(int sid, Session session, int eid, Forwarder editor) { if(session.hasOwner()){ - session.addForwarder(editor); REPCommand sendCommand = new REPCommand(); if (editor.isDirect()&&editor.getEID()==eid) { + session.addForwarder(editor); sendUpdate(session.getSID()); sendCommand.setCMD(REP.SMCMD_JOIN_ACK); } else { // SELECT_ACK is sent to the session ring to // find out joined editor sendCommand.setCMD(REP.SMCMD_SELECT_ACK); + // Do not directly addForwarder(forwarder). It may be + // shared among sessions. + Forwarder f = new Editor(this, false, makeID(editorList.newEid())); + f.setChannel(editor.channel); // incoming channel + f.setHost(myHost); + f.setSID(sid); + session.addForwarder(f); } sendCommand.setEID(editor.getEID()); sendCommand.setSID(sid); - sendCommand.string = ""; + sendCommand.string = session.getName(); editor.send(sendCommand); }else { - session.addForwarder(editor); - editor.setHost(myHost); - editor.setSID(sid); + // session searching Forwarder next = routingTable.toSession(sid); + Forwarder f = new Editor(this, false, makeID(editorList.newEid())); + f.setChannel(editor.channel); // incoming channel + f.setNext(next); + f.setHost(myHost); + f.setSID(sid); + session.setFirstForwarder(f); + REPCommand command = new REPCommand(); command.setCMD(REP.SMCMD_SELECT); command.setSID(sid); @@ -489,8 +508,8 @@ break; + case SMCMD_PUT_ACK: case SMCMD_JOIN_ACK: - case SMCMD_PUT_ACK: registEditor(forwarder,command); updateGUI(); break; @@ -508,6 +527,15 @@ } else { routingTable.add(forwarder,getSMID(command.eid),command.sid); smList.sendToMaster(command); + // registEditor will be done by SMCMD_PUT_ACK + } + if (forwarder.isDirect()) { + // send put_ack to the editor now. + command.setCMD(REP.SMCMD_PUT_ACK); + command.string = command.string; + command.setEID(command.eid); + command.setSID(command.sid); + forwarder.send(command); } updateGUI(); @@ -515,10 +543,20 @@ break; case SMCMD_SELECT: + { + Session session = sessionList.get(command.sid); + if (session==null) { + sessionList.put(command.sid, + new Session(command.sid, command.string,null)); + } + selectSession(command.sid, session, command.eid, forwarder); + } + break; case SMCMD_SELECT_ACK: { Session session = sessionList.get(command.sid); - selectSession(command.sid, session, command.eid, forwarder); + selectSession(command.sid, session, command.eid, + session.getFirstForwarder()); } break; @@ -610,21 +648,23 @@ return newid+smList.sessionManagerID()*MAXID; } - private int getSessionID(int id) { - return id%MAXID; - } private int getSMID(int id) { return id/MAXID; } + /** + * Register Editor to our editorList. No connection is made. + * @param forwarder Editor to be add + * @param command + */ private void registEditor(Forwarder forwarder,REPCommand command) { // make ack for PUT/JOIN. Do not send this to the editor, // before select. After select, ack is sent to the editor. routingTable.add(forwarder,getSMID(command.eid),command.sid); Editor editor; - if (getSessionID(command.sid)==smList.sessionManagerID() + if (getSMID(command.sid)==smList.sessionManagerID() && forwarder.isDirect()) { // direct link だった editor = (Editor)forwarder;