From 41a8aeb4348e2aaf77b262b20581a760a8f77a85 Mon Sep 17 00:00:00 2001 From: tkwa Date: Thu, 18 Aug 2016 15:21:29 -0700 Subject: [PATCH] Commented Java code --- doc/iotcloud.tex | 17 ++++----- src/java/iotcloud/SlotBuffer.java | 2 +- src/java/iotcloud/Table.java | 61 +++++++++++++++++-------------- 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/doc/iotcloud.tex b/doc/iotcloud.tex index 4d0c9f4..fd8a719 100644 --- a/doc/iotcloud.tex +++ b/doc/iotcloud.tex @@ -228,7 +228,6 @@ $Slot(SL_s,s_s)= \tuple{s, sv}$ \textit{such that} $\tuple{s, sv} $SeqN(\tuple{s, sv})=s$ \\ $SlotVal(\tuple{s, sv})=sv$ \\ $CreateLastSL(s,sv,id)=\tuple{s,sv,id}=sl_{last}$ \\ -$CreateEntLV(kv_s,s_s)=\tuple{kv_s,s_s}$ \\ $Decrypt(SK_s,sv_s)=Dat_s=\tuple{s,id,hmac_p,DE,hmac_c}$ \\ $GetSeqN(Dat_s = \tuple{s,id,hmac_p,DE,hmac_c})=s$ \\ $GetMacId(Dat_s = \tuple{s,id,hmac_p,DE,hmac_c})=id$ \\ @@ -272,7 +271,7 @@ $MaxSMSeqN(SM_s)= s$ \textit{such that} $\tuple{s, id} \in SM_s \begin{algorithmic}[1] \Function{GetQueSta}{$DE_s$} \State $de_{qs} \gets ss$ \textit{such that} $ss \in DE_s, - de_s \in D \land type(de_s) = "qs"$ + de_s \in D \land type(de_s) = ``qs"$ \If{$de_{qs} \neq \emptyset$} \State $qs_{ret} \gets GetQS(de_{qs})$ \Else @@ -284,14 +283,14 @@ $MaxSMSeqN(SM_s)= s$ \textit{such that} $\tuple{s, id} \in SM_s \begin{algorithmic}[1] \Function{GetSlotSeq}{$DE_s$} -\State $DE_{ss} \gets \{de | de \in DE_s \land type(de) = "ss"\}$ +\State $DE_{ss} \gets \{de | de \in DE_s \land type(de) = ``ss"\}$ \State \Return{$DE_{ss}$} \EndFunction \end{algorithmic} \begin{algorithmic}[1] \Function{GetColRes}{$DE_s$} -\State $DE_{cr} \gets \{de | de \in DE_s \land type(de) = "cr"\}$ +\State $DE_{cr} \gets \{de | de \in DE_s \land type(de) = ``cr"\}$ \State \Return{$DE_{cr}$} \EndFunction \end{algorithmic} @@ -449,7 +448,7 @@ $MaxSMSeqN(SM_s)= s$ \textit{such that} $\tuple{s, id} \in SM_s \begin{algorithmic}[1] \Function{UpdateDT}{$DT_s,DE_s,LV_s,s_s$} -\State $DE_{s_{kv}} \gets \{de_s | de_s \in DE_s, type(de_s) = "kv"\}$ +\State $DE_{s_{kv}} \gets \{de_s | de_s \in DE_s, type(de_s) = ``kv"\}$ \ForAll{$de_s \in DE_s$} \State $kv_s \gets GetKV(de_s)$ \State $LV_s \gets \Call{UpdateKVLivEnt}{LV_s,kv_s,s_s}$ @@ -663,16 +662,16 @@ $\tuple{ck,\tuple{k, v}} \in KV_s \wedge \ForAll{$de_s \in DE_s$} \State $live \gets \Call{CheckLiveness}{s_s,de_s}$ \If{$live$} - \If{$de_s = kv$} + \If{$type(de_s) = ``kv"$} \State $\tuple{k_s,v_s} \gets GetKV(de_s)$ \State $KV \gets \Call{PutKVPair}{KV,\tuple{k_s,v_s}}$ - \ElsIf{$de_s = ss$} + \ElsIf{$type(de_s) = ``ss"$} \State $\tuple{id_s,s_{s_{last}}} \gets GetSS(de_s)$ \State $SS \gets \Call{PutSSPair}{SS,\tuple{id_s,s_{s_{last}}}}$ - \ElsIf{$de_s = cr$} + \ElsIf{$type(de_s) = ``cr"$} \State $\tuple{s_s,id_s} \gets GetCR(de_s)$ \State $CR \gets \Call{PutCRPair}{CR,\tuple{s_s,id_s}}$ - \ElsIf{$de_s = qs$} + \ElsIf{$type(de_s) = ``qs"$} \State $reinsert_{qs} \gets true$ \EndIf \EndIf diff --git a/src/java/iotcloud/SlotBuffer.java b/src/java/iotcloud/SlotBuffer.java index ac9dee1..14bc926 100644 --- a/src/java/iotcloud/SlotBuffer.java +++ b/src/java/iotcloud/SlotBuffer.java @@ -1,7 +1,7 @@ package iotcloud; /** - * Buffer that holds the live set of slots. + * Circular buffer that holds the live set of slots. * @author Brian Demsky * @version 1.0 */ diff --git a/src/java/iotcloud/Table.java b/src/java/iotcloud/Table.java index 7c798ad..1d6259a 100644 --- a/src/java/iotcloud/Table.java +++ b/src/java/iotcloud/Table.java @@ -14,17 +14,22 @@ import java.util.Random; */ final public class Table { - private int numslots; + private int numslots; //number of slots stored in buffer + + //table of key-value pairs private HashMap table=new HashMap(); + + // machine id -> (sequence number, Slot or LastMessage); records last message by each client private HashMap > lastmessagetable=new HashMap >(); + // machine id -> ... private HashMap > watchlist = new HashMap >(); private Vector rejectedmessagelist=new Vector(); private SlotBuffer buffer; private CloudComm cloud; - private long sequencenumber; + private long sequencenumber; //Largest sequence number a client has received private long localmachineid; private TableStatus lastTableStatus; - static final int FREE_SLOTS = 10; + static final int FREE_SLOTS = 10; //number of slots that should be kept free static final int SKIP_THRESHOLD = 10; private long liveslotcount=0; private int chance; @@ -32,7 +37,7 @@ final public class Table { static final double RESIZE_THRESHOLD = 0.75; static final int REJECTED_THRESHOLD = 5; private int resizethreshold; - private long lastliveslotseqn; + private long lastliveslotseqn; //smallest sequence number with a live entry private Random random=new Random(); public Table(String baseurl, String password, long _localmachineid) { @@ -108,6 +113,7 @@ final public class Table { liveslotcount--; } + private void setResizeThreshold() { int resize_lower=(int) (RESIZE_THRESHOLD * numslots); resizethreshold=resize_lower-1+random.nextInt(numslots-resize_lower); @@ -116,9 +122,8 @@ final public class Table { private boolean tryput(IoTString key, IoTString value, boolean resize) { Slot s=new Slot(this, sequencenumber+1, localmachineid, buffer.getSlot(sequencenumber).getHMAC()); int newsize = 0; - if (liveslotcount > resizethreshold) { - resize=true; - newsize = (int) (numslots * RESIZE_MULTIPLE); + if (liveslotcount > resizethreshold) { + resize=true; //Resize is forced } if (resize) { @@ -127,7 +132,7 @@ final public class Table { s.addEntry(status); } - if (!rejectedmessagelist.isEmpty()) { + if (! rejectedmessagelist.isEmpty()) { /* TODO: We should avoid generating a rejected message entry if * there is already a sufficient entry in the queue (e.g., * equalsto value of true and same sequence number). */ @@ -138,13 +143,13 @@ final public class Table { RejectedMessage rm=new RejectedMessage(s, localmachineid, old_seqn, new_seqn, false); s.addEntry(rm); } else { - long prev_seqn=-1; + long prev_seqn = -1; int i=0; /* Go through list of missing messages */ - for(;i liveentries = prevslot.getLiveEntries(resize); for(Entry liveentry:liveentries) { if (s.hasSpace(liveentry)) { s.addEntry(liveentry); - } else if (seqn==firstiffull) { + } else if (seqn==firstiffull) { //if there's no space but the entry is about to fall off the queue if (!resize) { - System.out.print("B"); + System.out.print("B"); //? return tryput(key, value, true); } } @@ -203,6 +208,9 @@ final public class Table { insertedkv=true; } + /* now go through live entries from least to greatest sequence number until + * either all live slots added, or the slot doesn't have enough room + * for SKIP_THRESHOLD consecutive entries*/ int skipcount=0; search: for(; seqn <= newestseqnum; seqn++) { @@ -249,8 +257,7 @@ final public class Table { private void validateandupdate(Slot[] newslots, boolean acceptupdatestolocal) { /* The cloud communication layer has checked slot HMACs already before decoding */ - if (newslots.length==0) - return; + if (newslots.length==0) return; long firstseqnum=newslots[0].getSequenceNumber(); if (firstseqnum <= sequencenumber) @@ -259,7 +266,7 @@ final public class Table { SlotIndexer indexer = new SlotIndexer(newslots, buffer); checkHMACChain(indexer, newslots); - HashSet machineSet=new HashSet(lastmessagetable.keySet()); + HashSet machineSet=new HashSet(lastmessagetable.keySet()); // initExpectedSize(firstseqnum); for(Slot slot: newslots) { @@ -293,7 +300,7 @@ final public class Table { private void initExpectedSize(long firstsequencenumber) { long prevslots = firstsequencenumber; - expectedsize = (prevslots < ((long) numslots))?(int) prevslots:numslots; + expectedsize = (prevslots < ((long) numslots))? (int) prevslots : numslots; currmaxsize = numslots; } @@ -333,18 +340,18 @@ final public class Table { long newseqnum=entry.getNewSeqNum(); boolean isequal=entry.getEqual(); long machineid=entry.getMachineID(); - for(long seqnum=oldseqnum; seqnum<=newseqnum; seqnum++) { + for(long seqnum=oldseqnum; seqnum <= newseqnum; seqnum++) { Slot slot=indexer.getSlot(seqnum); if (slot != null) { long slotmachineid=slot.getMachineID(); - if (isequal!=(slotmachineid==machineid)) { + if (isequal != (slotmachineid==machineid)) { throw new Error("Server Error: Trying to insert rejected message for slot "+seqnum); } } } HashSet watchset=new HashSet(); - for(Map.Entry > lastmsg_entry:lastmessagetable.entrySet()) { + for(Map.Entry > lastmsg_entry : lastmessagetable.entrySet()) { long entry_mid=lastmsg_entry.getKey(); /* We've seen it, don't need to continue to watch. Our next * message will implicitly acknowledge it. */ -- 2.34.1