edits
[iotcloud.git] / version2 / src / java / iotcloud / Table.java
index 6a00f82222e374244d1a27dfc0af91f6b924f25d..25b677565f89d8db56c69e4ed30c4d52e1ba6e9c 100644 (file)
@@ -22,7 +22,7 @@ import java.nio.ByteBuffer;
 final public class Table {
 
        /* Constants */
-       static final int FREE_SLOTS = 10; // Number of slots that should be kept free
+       static final int FREE_SLOTS = 2; // Number of slots that should be kept free // 10
        static final int SKIP_THRESHOLD = 10;
        static final double RESIZE_MULTIPLE = 1.2;
        static final double RESIZE_THRESHOLD = 0.75;
@@ -44,6 +44,8 @@ final public class Table {
        private long oldestLiveSlotSequenceNumver = 0;  // Smallest sequence number of the slot with a live entry
        private long localMachineId = 0; // Machine ID of this client device
        private long sequenceNumber = 0; // Largest sequence number a client has received
+       private long localSequenceNumber = 0;
+
        // private int smallestTableStatusSeen = -1; // Smallest Table Status that was seen in the latest slots sent from the server
        // private int largestTableStatusSeen = -1; // Largest Table Status that was seen in the latest slots sent from the server
        private long localTransactionSequenceNumber = 0; // Local sequence number counter for transactions
@@ -169,9 +171,16 @@ final public class Table {
 
                int casdasd = 0;
 
+               int liveslo = 0;
+
                for (long i = o; i < (n + 1); i++) {
                        Slot s = buffer.getSlot(i);
 
+
+                       if (s.isLive()) {
+                               liveslo++;
+                       }
+
                        Vector<Entry> entries = s.getEntries();
 
                        for (Entry e : entries) {
@@ -179,8 +188,7 @@ final public class Table {
                                        int type = e.getType();
 
 
-                                       if(type == 6)
-                                       {
+                                       if (type == 6) {
                                                RejectedMessage rej = (RejectedMessage)e;
                                                casdasd++;
 
@@ -201,6 +209,8 @@ final public class Table {
                        System.out.println(i + "    " + types[i]);
                }
                System.out.println("Live count:   " + livec);
+               System.out.println("Live Slot count:   " + liveslo);
+
                System.out.println("Dead count:   " + deadc);
                System.out.println("Old:   " + o);
                System.out.println("New:   " + n);
@@ -234,7 +244,8 @@ final public class Table {
                cloud.initSecurity();
 
                // Create the first insertion into the block chain which is the table status
-               Slot s = new Slot(this, 1, localMachineId);
+               Slot s = new Slot(this, 1, localMachineId, localSequenceNumber);
+               localSequenceNumber++;
                TableStatus status = new TableStatus(s, numberOfSlots);
                s.addEntry(status);
                Slot[] array = cloud.putSlot(s, numberOfSlots);
@@ -259,7 +270,7 @@ final public class Table {
                Slot[] newslots = cloud.getSlots(sequenceNumber + 1);
                validateAndUpdate(newslots, true);
                sendToServer(null);
-                                       updateLiveTransactionsAndStatus();
+               updateLiveTransactionsAndStatus();
 
        }
 
@@ -398,6 +409,7 @@ final public class Table {
                        }
 
                        NewKey newKey = new NewKey(null, keyName, machineId);
+
                        if (sendToServer(newKey)) {
                                // If successfully inserted
                                return true;
@@ -513,6 +525,10 @@ final public class Table {
                bufferResizeThreshold = resizeLower - 1 + random.nextInt(numberOfSlots - resizeLower);
        }
 
+       public long getLocalSequenceNumber() {
+               return localSequenceNumber;
+       }
+
 
        boolean lastInsertedNewKey = false;
 
@@ -706,9 +722,11 @@ final public class Table {
                }
 
 
+
                try {
                        // While we have stuff that needs inserting into the block chain
                        while ((pendingTransactionQueue.size() > 0) || (pendingSendArbitrationRounds.size() > 0) || (newKey != null)) {
+
                                fromRetry = false;
 
                                if (hadPartialSendToServer) {
@@ -723,7 +741,8 @@ final public class Table {
                                }
 
                                // Create the slot
-                               Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC());
+                               Slot slot = new Slot(this, sequenceNumber + 1, localMachineId, buffer.getSlot(sequenceNumber).getHMAC(), localSequenceNumber);
+                               localSequenceNumber++;
 
                                // Try to fill the slot with data
                                ThreeTuple<Boolean, Integer, Boolean> fillSlotsReturn = fillSlot(slot, false, newKey);
@@ -917,7 +936,8 @@ final public class Table {
                bbEncode.putInt(0);
 
                // Send by local
-               byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               localSequenceNumber++;
 
                if (returnData == null) {
                        // Could not contact server
@@ -978,7 +998,8 @@ final public class Table {
 
 
                // Send by local
-               byte[] returnData = cloud.sendLocalData(sendData, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               byte[] returnData = cloud.sendLocalData(sendData, localSequenceNumber, localCommunicationInformation.getFirst(), localCommunicationInformation.getSecond());
+               localSequenceNumber++;
 
                if (returnData == null) {
                        // Could not contact server
@@ -1131,6 +1152,8 @@ final public class Table {
                        entry.encode(bbEncode);
                }
 
+
+               localSequenceNumber++;
                return returnData;
        }
 
@@ -1201,9 +1224,12 @@ final public class Table {
         * Returns false if a resize was needed
         */
        private ThreeTuple<Boolean, Integer, Boolean> fillSlot(Slot slot, boolean resize, NewKey newKeyEntry) {
+
+
                int newSize = 0;
                if (liveSlotCount > bufferResizeThreshold) {
                        resize = true; //Resize is forced
+
                }
 
                if (resize) {
@@ -1232,6 +1258,7 @@ final public class Table {
                if (newKeyEntry != null) {
                        newKeyEntry.setSlot(slot);
                        if (slot.hasSpace(newKeyEntry)) {
+
                                slot.addEntry(newKeyEntry);
                                inserted = true;
                        }
@@ -1561,9 +1588,6 @@ final public class Table {
                if (expectedsize > currMaxSize) {
                        expectedsize = currMaxSize;
                }
-
-                                       // System.out.println("" + expectedsize);
-
        }
 
 
@@ -1598,6 +1622,7 @@ final public class Table {
                // Change the number of local slots to the new size
                numberOfSlots = (int)currMaxSize;
 
+
                // Recalculate the resize threshold since the size of the local buffer has changed
                setResizeThreshold();
        }
@@ -1957,7 +1982,7 @@ final public class Table {
                                pendingSendArbitrationRounds.clear();
                        } else {
                                for (int i = 0; i < numberToDelete; i++) {
-                                       pendingSendArbitrationRounds.remove(pendingSendArbitrationRounds.size() - 1);
+                                       pendingSendArbitrationRounds.removeIndex(pendingSendArbitrationRounds.size() - 1);
                                }
                        }
 
@@ -2720,4 +2745,4 @@ final public class Table {
                                throw new Error("Server Error: Invalid HMAC Chain" + currSlot + " " + prevSlot);
                }
        }
-}
\ No newline at end of file
+}