Mercurial > hg > Database > Alice
annotate src/main/java/alice/datasegment/DataSegmentKey.java @ 527:bfec2c3ff1b8 dispose
change unzip
author | Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 30 Apr 2015 18:14:02 +0900 |
parents | 145c425db88d |
children | 4aeebea0c9b5 |
rev | line source |
---|---|
345 | 1 package alice.datasegment; |
2 | |
3 import java.util.ArrayList; | |
4 import java.util.Iterator; | |
5 | |
467 | 6 import alice.datasegment.Command; |
345 | 7 |
8 /** | |
523
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
467
diff
changeset
|
9 * ここがコマンドの中身部分 |
145c425db88d
add CompressedLDSM
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
467
diff
changeset
|
10 * |
345 | 11 * Synchronized DataSegment for each DataSegment key |
12 * @author kazz | |
13 * | |
14 */ | |
15 public class DataSegmentKey { | |
419 | 16 |
17 private ArrayList<DataSegmentValue> dataList = new ArrayList<DataSegmentValue>(); | |
18 private ArrayList<Command> waitList = new ArrayList<Command>(); | |
19 private int tailIndex = 1; | |
345 | 20 |
419 | 21 public synchronized void runCommand(Command cmd) { |
22 switch (cmd.type) { | |
23 case UPDATE: | |
24 if (dataList.size() != 0) { | |
25 dataList.remove(0); | |
26 } | |
27 case PUT: | |
28 int index = tailIndex; | |
29 tailIndex++; | |
467 | 30 DataSegmentValue dsv = new DataSegmentValue(index, cmd.rData, cmd.reverseKey); |
419 | 31 dataList.add(dsv); |
32 // Process waiting peek and take commands | |
33 for (Iterator<Command> iter = waitList.iterator(); iter.hasNext(); ) { | |
34 Command waitCmd = iter.next(); | |
35 if (waitCmd.index < index) { | |
527 | 36 System.out.println("DSKey cmdFlag:" + cmd.getCompressFlag()); |
37 replyValue(waitCmd, dsv, cmd.getCompressFlag()); | |
419 | 38 iter.remove(); |
39 if (waitCmd.type == CommandType.TAKE) { // someone is waiting for this put or update command | |
40 dataList.remove(dsv); | |
41 break; | |
42 } | |
43 } | |
44 } | |
45 break; | |
46 case PEEK: | |
47 if (cmd.index >= tailIndex) { | |
48 waitList.add(cmd); | |
49 break; | |
50 } | |
51 boolean waitFlag2 = true; | |
52 for (DataSegmentValue data : dataList) { | |
53 if (data.index > cmd.index) { | |
452 | 54 replyValue(cmd, data); |
419 | 55 waitFlag2 = false; |
56 break; | |
57 } | |
58 } | |
59 if (waitFlag2) | |
60 waitList.add(cmd); | |
61 break; | |
62 case TAKE: | |
63 if (cmd.index >= tailIndex) { | |
64 waitList.add(cmd); | |
65 break; | |
66 } | |
67 boolean waitFlag = true; | |
68 for (Iterator<DataSegmentValue> iter = dataList.iterator(); iter.hasNext(); ) { | |
69 DataSegmentValue data = iter.next(); | |
70 if (data.index > cmd.index) { | |
527 | 71 System.out.println("DSKey2 cmdFlag:" + cmd.getCompressFlag()); |
72 replyValue(cmd, data, cmd.getCompressFlag()); | |
73 //replyValue(cmd, data); | |
419 | 74 iter.remove(); |
75 waitFlag = false; | |
76 break; | |
77 } | |
78 } | |
79 if (waitFlag) | |
80 waitList.add(cmd); | |
81 break; | |
82 case REMOVE: | |
83 // TODO: implements later | |
84 break; | |
85 default: | |
86 } | |
87 | |
88 } | |
89 | |
90 public void replyValue(Command cmd, DataSegmentValue data){ | |
458 | 91 Command rCmd = new Command(CommandType.REPLY, null, null, data.rData, data.index, cmd.seq, null, null, data.from); |
527 | 92 cmd.setCompressFlag(true); |
93 if (cmd.cs!=null){ // if cmd has cs-instance, it means Command from local. | |
94 cmd.cs.ids.reply(cmd.receiver, rCmd); | |
95 } else { | |
96 try { | |
97 if (!cmd.getQuickFlag()) { | |
98 cmd.connection.sendQueue.put(rCmd); | |
99 } else { | |
100 cmd.connection.write(rCmd); | |
101 } | |
102 } catch (InterruptedException e) { | |
103 e.printStackTrace(); | |
104 } | |
105 } | |
106 } | |
107 | |
108 public void replyValue(Command cmd, DataSegmentValue data, boolean cFlag){ | |
109 Command rCmd = new Command(CommandType.REPLY, null, null, data.rData, data.index, cmd.seq, null, null, data.from); | |
110 rCmd.setCompressFlag(cFlag); | |
419 | 111 if (cmd.cs!=null){ // if cmd has cs-instance, it means Command from local. |
452 | 112 cmd.cs.ids.reply(cmd.receiver, rCmd); |
419 | 113 } else { |
114 try { | |
458 | 115 if (!cmd.getQuickFlag()) { |
452 | 116 cmd.connection.sendQueue.put(rCmd); |
117 } else { | |
118 cmd.connection.write(rCmd); | |
419 | 119 } |
120 } catch (InterruptedException e) { | |
121 e.printStackTrace(); | |
122 } | |
123 } | |
124 } | |
125 | |
345 | 126 } |