From 6ab6933678c5fe60b9705789584c1d102752fa5b Mon Sep 17 00:00:00 2001 From: bdemsky Date: Sat, 20 Jan 2018 14:06:59 -0800 Subject: [PATCH] Another file --- version2/src/C/Table.cc | 2 - version2/src/C/Transaction.cc | 69 ++++++++++++++++++++++++----------- version2/src/C/Transaction.h | 5 ++- version2/src/C/vector.h | 6 ++- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/version2/src/C/Table.cc b/version2/src/C/Table.cc index 5e69e13..4c0331e 100644 --- a/version2/src/C/Table.cc +++ b/version2/src/C/Table.cc @@ -174,7 +174,6 @@ void Table::init() { pendingSendArbitrationRounds = new Vector(); lastArbitrationDataLocalSequenceNumberSeenFromArbitrator = new Hashtable(); - // Other init stuff numberOfSlots = buffer->capacity(); setResizeThreshold(); @@ -1316,7 +1315,6 @@ search: * Checks for malicious activity and updates the local copy of the block chain-> */ void Table::validateAndUpdate(Array *newSlots, bool acceptUpdatesToLocal) { - // The cloud communication layer has checked slot HMACs already // before decoding if (newSlots->length() == 0) { diff --git a/version2/src/C/Transaction.cc b/version2/src/C/Transaction.cc index a3083ee..2398544 100644 --- a/version2/src/C/Transaction.cc +++ b/version2/src/C/Transaction.cc @@ -6,7 +6,8 @@ #include "TransactionStatus.h" Transaction::Transaction() : - parts(new Hashtable()), + parts(new Vector()), + partCount(0), missingParts(NULL), partsPendingSend(new Vector()), fldisComplete(false), @@ -18,12 +19,14 @@ Transaction::Transaction() : clientLocalSequenceNumber(-1), arbitratorId(-1), machineId(-1), - transactionId(NULL), + transactionId(Pair(0,0)), hadServerFailure(false) { } void Transaction::addPartEncode(TransactionPart *newPart) { - parts->put(newPart->getPartNumber(), newPart); + TransactionPart * old=parts->setExpand(newPart->getPartNumber(), newPart); + if (old == NULL) + partCount++; partsPendingSend->add(newPart->getPartNumber()); sequenceNumber = newPart->getSequenceNumber(); @@ -48,11 +51,13 @@ void Transaction::addPartDecode(TransactionPart *newPart) { clientLocalSequenceNumber = newPart->getClientLocalSequenceNumber(); machineId = newPart->getMachineId(); - TransactionPart *previoslySeenPart = parts->put(newPart->getPartNumber(), newPart); - - if (previoslySeenPart != NULL) { + TransactionPart *previouslySeenPart = parts->setExpand(newPart->getPartNumber(), newPart); + if (previouslySeenPart == NULL) + partCount++; + + if (previouslySeenPart != NULL) { // Set dead the old one since the new one is a rescued version of this part - previoslySeenPart->setDead(); + previouslySeenPart->setDead(); } else if (newPart->isLastPart()) { missingParts = new Hashset(); hasLastPart = true; @@ -96,9 +101,11 @@ int64_t Transaction::getSequenceNumber() { void Transaction::setSequenceNumber(int64_t _sequenceNumber) { sequenceNumber = _sequenceNumber; - - for (int32_t i : parts->keySet()) { - parts->get(i)->setSequenceNumber(sequenceNumber); + + for (int32_t i = 0; i < parts->size(); i++) { + TransactionPart * tp = parts->get(i); + if (tp !=NULL) + tp->setSequenceNumber(sequenceNumber); } } @@ -106,7 +113,7 @@ int64_t Transaction::getClientLocalSequenceNumber() { return clientLocalSequenceNumber; } -Hashtable *Transaction::getParts() { +Vector *Transaction::getParts() { return parts; } @@ -152,8 +159,23 @@ TransactionStatus *Transaction::getTransactionStatus() { void Transaction::removeSentParts(Vector *sentParts) { nextPartToSend = 0; - if (partsPendingSend->removeAll(sentParts)) - { + bool changed = false; + uint lastusedindex = 0; + for(uint i=0; i < partsPendingSend->size(); i++) { + int32_t parti = partsPendingSend->get(i); + for(uint j=0; j < sentParts->size(); j++) { + int32_t partj = sentParts->get(j); + if (parti == partj) { + changed = true; + goto NextElement; + } + } + partsPendingSend->set(lastusedindex++, parti); + NextElement: + ; + } + if (changed) { + partsPendingSend->setSize(lastusedindex); flddidSendAPartToServer = true; transactionStatus->setTransactionSequenceNumber(sequenceNumber); } @@ -168,7 +190,7 @@ Hashset *Transaction::getKeyValueUpdateSet() { } int Transaction::getNumberOfParts() { - return parts->size(); + return partCount; } int64_t Transaction::getMachineId() { @@ -197,9 +219,10 @@ void Transaction::setDead() { isDead = true; // Make all the parts of this transaction dead - for (int32_t partNumber : parts->keySet()) { + for (int32_t partNumber = 0; partNumber < parts->size(); partNumber ++) { TransactionPart *part = parts->get(partNumber); - part->setDead(); + if (part != NULL) + part->setDead(); } } @@ -208,10 +231,9 @@ TransactionPart *Transaction::getPart(int index) { } void Transaction::decodeTransactionData() { - // Calculate the size of the data section int dataSize = 0; - for (int i = 0; i < parts->keySet()->size(); i++) { + for (int i = 0; i < parts->size(); i++) { TransactionPart *tp = parts->get(i); dataSize += tp->getDataSize(); } @@ -220,7 +242,7 @@ void Transaction::decodeTransactionData() { int currentPosition = 0; // Stitch all the data sections together - for (int i = 0; i < parts->keySet()->size(); i++) { + for (int i = 0; i < parts->size(); i++) { TransactionPart *tp = parts->get(i); System_arraycopy(tp->getData(), 0, combinedData, currentPosition, tp->getDataSize()); currentPosition += tp->getDataSize(); @@ -247,8 +269,9 @@ void Transaction::decodeTransactionData() { } bool Transaction::evaluateGuard(Hashtable *committedKeyValueTable, Hashtable *speculatedKeyValueTable, Hashtable *pendingTransactionSpeculatedKeyValueTable) { - for (KeyValue *kvGuard : keyValueGuardSet) { - + SetIterator* kvit=keyValueGuardSet->iterator(); + while(kvit->hasNext()) { + KeyValue *kvGuard = kvit->next(); // First check if the key is in the speculative table, this is the value of the latest assumption KeyValue *kv = NULL; @@ -277,15 +300,17 @@ bool Transaction::evaluateGuard(Hashtable *committedKey } else { printf("%s null\n", kvGuard->getValue()->internalBytes()->internalArray()); } - + delete kvit; return false; } } else { if (kv != NULL) { + delete kvit; return false; } } } + delete kvit; return true; } diff --git a/version2/src/C/Transaction.h b/version2/src/C/Transaction.h index 4be64ff..f635a7a 100644 --- a/version2/src/C/Transaction.h +++ b/version2/src/C/Transaction.h @@ -5,7 +5,8 @@ class Transaction { private: - Hashtable *parts; + Vector *parts; + uint partCount; Hashset *missingParts; Vector *partsPendingSend; bool fldisComplete; @@ -33,7 +34,7 @@ public: int64_t getSequenceNumber(); void setSequenceNumber(int64_t _sequenceNumber); int64_t getClientLocalSequenceNumber(); - Hashtable *getParts(); + Vector *getParts(); bool didSendAPartToServer(); void resetNextPartToSend(); TransactionPart *getNextPartToSend(); diff --git a/version2/src/C/vector.h b/version2/src/C/vector.h index 00ff962..fcdbe0c 100644 --- a/version2/src/C/vector.h +++ b/version2/src/C/vector.h @@ -65,10 +65,14 @@ public: return array[index]; } - void setExpand(uint index, type item) { + type setExpand(uint index, type item) { + type retval = (type) 0; if (index >= fldsize) setSize(index + 1); + else + retval = array[index]; set(index, item); + return retval; } void set(uint index, type item) { -- 2.34.1