Fixing Bugs
[iotcloud.git] / version2 / src / 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 long transarbitrator;
18
19         private Set<KeyValue> keyValueUpdateSet = null;
20
21
22         public Commit(Slot slot, long _seqnumtrans, long _transarbitrator, Set<KeyValue> _keyValueUpdateSet) {
23                 super(slot);
24                 seqnumtrans = _seqnumtrans;
25                 transarbitrator = _transarbitrator;
26
27                 keyValueUpdateSet = new HashSet<KeyValue>();
28
29                 for (KeyValue kv : _keyValueUpdateSet) {
30                         KeyValue kvCopy = kv.getCopy();
31                         keyValueUpdateSet.add(kvCopy);
32                 }
33         }
34
35         public long getTransSequenceNumber() {
36                 return seqnumtrans;
37         }
38
39         public long getTransArbitrator() {
40                 return transarbitrator;
41         }
42
43         public Set<KeyValue> getkeyValueUpdateSet() {
44                 return keyValueUpdateSet;
45         }
46
47         public byte getType() {
48                 return Entry.TypeCommit;
49         }
50
51         public int getSize() {
52                 int size = 2 * Long.BYTES + Byte.BYTES; // seq id, entry type
53                 size += Integer.BYTES; // number of KV's
54
55                 // Size of each KV
56                 for (KeyValue kv : keyValueUpdateSet) {
57                         size += kv.getSize();
58                 }
59
60                 return size;
61         }
62
63         static Entry decode(Slot slot, ByteBuffer bb) {
64                 long seqnumtrans = bb.getLong();
65                 long transarbitrator = bb.getLong();
66                 int numberOfKeys = bb.getInt();
67
68                 Set<KeyValue> kvSet = new HashSet<KeyValue>();
69                 for (int i = 0; i < numberOfKeys; i++) {
70                         KeyValue kv = KeyValue.decode(bb);
71                         kvSet.add(kv);
72                 }
73
74                 return new Commit(slot, seqnumtrans, transarbitrator, kvSet);
75         }
76
77         public void encode(ByteBuffer bb) {
78                 bb.put(Entry.TypeCommit);
79                 bb.putLong(seqnumtrans);
80                 bb.putLong(transarbitrator);
81
82                 bb.putInt(keyValueUpdateSet.size());
83
84                 for (KeyValue kv : keyValueUpdateSet) {
85                         kv.encode(bb);
86                 }
87         }
88
89         public Entry getCopy(Slot s) {
90                 // System.out.println("Commit Rescued:  " + this);  // TODO remove
91                 return new Commit(s, seqnumtrans, transarbitrator, keyValueUpdateSet);
92         }
93
94         public Set<KeyValue> updateLiveKeys(Set<KeyValue> kvSet) {
95
96                 if (!this.isLive())
97                         return new HashSet<KeyValue>();
98
99                 Set<KeyValue> toDelete = new HashSet<KeyValue>();
100
101                 for (KeyValue kv1 : kvSet) {
102                         for (Iterator<KeyValue> i = keyValueUpdateSet.iterator(); i.hasNext();) {
103                                 KeyValue kv2 = i.next();
104
105                                 if (kv1.getKey().equals(kv2.getKey())) {
106                                         // keyValueUpdateSet.remove(kv2);
107                                         toDelete.add(kv2);
108                                         i.remove();
109                                         break;
110                                 }
111                         }
112                 }
113
114                 if (keyValueUpdateSet.size() == 0) {
115                         // System.out.println("Killed Commit:  " + this); // TODO remove
116                         this.setDead();
117                 }
118
119                 return toDelete;
120         }
121 }