c533c36bda67edd4cfc37044fa379f32943c7476
[iotcloud.git] / src2 / java / iotcloud / Commit.java
1 package iotcloud;
2
3 import java.nio.ByteBuffer;
4 import java.util.Set;
5 import java.util.HashSet;
6 import java.util.Iterator;
7
8 /**
9  * This Entry records the commit of a transaction.
10  * @author Ali Younis <ayounis@uci.edu>
11  * @version 1.0
12  */
13
14
15 class Commit extends Entry {
16         private long seqnumtrans;
17         private Set<KeyValue> keyValueUpdateSet = null;
18         private Set<KeyValue> liveValues = null;
19
20
21         public Commit(Slot slot, long _seqnumtrans, Set<KeyValue> _keyValueUpdateSet) {
22                 super(slot);
23                 seqnumtrans = _seqnumtrans;
24
25                 keyValueUpdateSet = new HashSet<KeyValue>();
26                 liveValues = new HashSet<KeyValue>();
27
28                 for (KeyValue kv : _keyValueUpdateSet) {
29                         KeyValue kvCopy = kv.getCopy();
30                         keyValueUpdateSet.add(kvCopy);
31                         liveValues.add(kvCopy);
32                 }
33         }
34
35         public long getTransSequenceNumber() {
36                 return seqnumtrans;
37         }
38
39         public Set<KeyValue> getkeyValueUpdateSet() {
40                 return keyValueUpdateSet;
41         }
42
43         public byte getType() {
44                 return Entry.TypeCommit;
45         }
46
47         public int getSize() {
48                 int size = Long.BYTES + Byte.BYTES; // seq id, entry type
49                 size += Integer.BYTES; // number of KV's
50
51                 // Size of each KV
52                 for (KeyValue kv : keyValueUpdateSet) {
53                         size += kv.getSize();
54                 }
55
56                 return size;
57         }
58
59         static Entry decode(Slot slot, ByteBuffer bb) {
60                 long seqnumtrans = bb.getLong();
61                 int numberOfKeys = bb.getInt();
62
63                 Set<KeyValue> kvSet = new HashSet<KeyValue>();
64                 for (int i = 0; i < numberOfKeys; i++) {
65                         KeyValue kv = KeyValue.decode(bb);
66                         kvSet.add(kv);
67                 }
68
69                 return new Commit(slot, seqnumtrans, kvSet);
70         }
71
72         public void encode(ByteBuffer bb) {
73                 bb.put(Entry.TypeCommit);
74                 bb.putLong(seqnumtrans);
75                 bb.putInt(keyValueUpdateSet.size());
76
77                 for (KeyValue kv : keyValueUpdateSet) {
78                         kv.encode(bb);
79                 }
80         }
81
82         public Entry getCopy(Slot s) {
83                 return new Commit(s, seqnumtrans, keyValueUpdateSet);
84         }
85
86         public void updateLiveKeys(Set<KeyValue> kvSet) {
87
88                 if (!this.isLive())
89                         return;
90
91                 for (KeyValue kv1 : kvSet) {
92                         for (Iterator<KeyValue> i = liveValues.iterator(); i.hasNext();) {
93                                 KeyValue kv2 = i.next();
94
95                                 if (kv1.getKey() == kv2.getKey()) {
96                                         liveValues.remove(kv2);
97                                         break;
98                                 }
99                         }
100                 }
101
102                 if (liveValues.size() == 0)
103                         this.setDead();
104         }
105 }