Mercurial > hg > Database > Alice
diff src/main/java/alice/datasegment/DataSegmentKey.java @ 419:aefbe41fcf12 dispose
change tab to space
author | sugi |
---|---|
date | Tue, 15 Jul 2014 16:00:22 +0900 |
parents | 8f71c3e6f11d |
children | 86b74532e66c |
line wrap: on
line diff
--- a/src/main/java/alice/datasegment/DataSegmentKey.java Tue Jul 15 06:15:53 2014 +0900 +++ b/src/main/java/alice/datasegment/DataSegmentKey.java Tue Jul 15 16:00:22 2014 +0900 @@ -11,93 +11,93 @@ * */ public class DataSegmentKey { - - private ArrayList<DataSegmentValue> dataList = new ArrayList<DataSegmentValue>(); - private ArrayList<Command> waitList = new ArrayList<Command>(); - private int tailIndex = 1; - - public synchronized void runCommand(Command cmd) { - switch (cmd.type) { - case UPDATE: - if (dataList.size() != 0) { - dataList.remove(0); - } - case PUT: - int index = tailIndex; - tailIndex++; - DataSegmentValue dsv = new DataSegmentValue(index, cmd.val, cmd.obj, cmd.reverseKey); - dataList.add(dsv); - // Process waiting peek and take commands - for (Iterator<Command> iter = waitList.iterator(); iter.hasNext(); ) { - Command waitCmd = iter.next(); - if (waitCmd.index < index) { - replyValue(waitCmd ,dsv); - iter.remove(); - if (waitCmd.type == CommandType.TAKE) { // someone is waiting for this put or update command - dataList.remove(dsv); - break; - } - } - } - break; - case PEEK: - if (cmd.index >= tailIndex) { - waitList.add(cmd); - break; - } - boolean waitFlag2 = true; - for (DataSegmentValue data : dataList) { - if (data.index > cmd.index) { - replyValue(cmd ,data); - waitFlag2 = false; - break; - } - } - if (waitFlag2) - waitList.add(cmd); - break; - case TAKE: - if (cmd.index >= tailIndex) { - waitList.add(cmd); - break; - } - boolean waitFlag = true; - for (Iterator<DataSegmentValue> iter = dataList.iterator(); iter.hasNext(); ) { - DataSegmentValue data = iter.next(); - if (data.index > cmd.index) { - replyValue(cmd ,data); - iter.remove(); - waitFlag = false; - break; - } - } - if (waitFlag) - waitList.add(cmd); - break; - case REMOVE: - // TODO: implements later - break; - default: - } + + private ArrayList<DataSegmentValue> dataList = new ArrayList<DataSegmentValue>(); + private ArrayList<Command> waitList = new ArrayList<Command>(); + private int tailIndex = 1; - } - - public void replyValue(Command cmd, DataSegmentValue data){ - if (cmd.cs!=null){ // if cmd has cs-instance, it means Command from local. - cmd.cs.ids.reply(cmd.receiver, new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); - } else { - try { - if (!cmd.flag){ - cmd.connection.sendQueue.put(new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); - } - else { - cmd.connection.write(new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); - } - - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - + public synchronized void runCommand(Command cmd) { + switch (cmd.type) { + case UPDATE: + if (dataList.size() != 0) { + dataList.remove(0); + } + case PUT: + int index = tailIndex; + tailIndex++; + DataSegmentValue dsv = new DataSegmentValue(index, cmd.val, cmd.obj, cmd.reverseKey); + dataList.add(dsv); + // Process waiting peek and take commands + for (Iterator<Command> iter = waitList.iterator(); iter.hasNext(); ) { + Command waitCmd = iter.next(); + if (waitCmd.index < index) { + replyValue(waitCmd ,dsv); + iter.remove(); + if (waitCmd.type == CommandType.TAKE) { // someone is waiting for this put or update command + dataList.remove(dsv); + break; + } + } + } + break; + case PEEK: + if (cmd.index >= tailIndex) { + waitList.add(cmd); + break; + } + boolean waitFlag2 = true; + for (DataSegmentValue data : dataList) { + if (data.index > cmd.index) { + replyValue(cmd ,data); + waitFlag2 = false; + break; + } + } + if (waitFlag2) + waitList.add(cmd); + break; + case TAKE: + if (cmd.index >= tailIndex) { + waitList.add(cmd); + break; + } + boolean waitFlag = true; + for (Iterator<DataSegmentValue> iter = dataList.iterator(); iter.hasNext(); ) { + DataSegmentValue data = iter.next(); + if (data.index > cmd.index) { + replyValue(cmd ,data); + iter.remove(); + waitFlag = false; + break; + } + } + if (waitFlag) + waitList.add(cmd); + break; + case REMOVE: + // TODO: implements later + break; + default: + } + + } + + public void replyValue(Command cmd, DataSegmentValue data){ + if (cmd.cs!=null){ // if cmd has cs-instance, it means Command from local. + cmd.cs.ids.reply(cmd.receiver, new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); + } else { + try { + if (!cmd.flag){ + cmd.connection.sendQueue.put(new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); + } + else { + cmd.connection.write(new Command(CommandType.REPLY, null, null, data.val, data.obj, data.index, cmd.seq, null, null, data.from)); + } + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }