From c7740f0e3cbcd9a7233258f22e6168b1cd8853a8 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 13 Mar 2018 03:03:11 +0100 Subject: Fix add data operation not working correctly Reminder: do not get reference to hash map value... duh Add thread-safe logging (log is in order now!). Store data immediately to database when WE add it instead of waiting for response from remote peers. TODO: Test with multiple peers (not only localhost) --- include/Database.hpp | 4 ++-- include/DatabaseStorage.hpp | 13 ++++++++----- include/Hash.hpp | 5 ++++- include/Log.hpp | 12 ++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 include/Log.hpp (limited to 'include') diff --git a/include/Database.hpp b/include/Database.hpp index 64a381c..6bc7bc5 100644 --- a/include/Database.hpp +++ b/include/Database.hpp @@ -141,9 +141,9 @@ namespace odhtdb void commitStagedAddObject(const std::unique_ptr &stagedObject); ntp::NtpTimestamp getSyncedTimestampUtc() const; DatabaseCreateRequest deserializeCreateRequest(const std::shared_ptr &value, const Hash &hash, const std::shared_ptr encryptionKey); - void deserializeAddRequest(const std::shared_ptr &value, const Hash &hash, const std::shared_ptr encryptionKey); + void deserializeAddRequest(const std::shared_ptr &value, const Hash &requestDataHash, const std::shared_ptr encryptionKey); bool listenCreateData(std::shared_ptr value, const Hash &hash, const std::shared_ptr encryptionKey); - bool listenAddData(std::shared_ptr value, const Hash &hash, const std::shared_ptr encryptionKey); + bool listenAddData(std::shared_ptr value, const Hash &requestDataHash, const std::shared_ptr encryptionKey); private: dht::DhtRunner node; std::vector> stagedCreateObjects; diff --git a/include/DatabaseStorage.hpp b/include/DatabaseStorage.hpp index ee4d2ad..ad4f70b 100644 --- a/include/DatabaseStorage.hpp +++ b/include/DatabaseStorage.hpp @@ -52,7 +52,7 @@ namespace odhtdb DatabaseStorageNotFound(const std::string &errMsg) : std::runtime_error(errMsg) {} }; - using DatabaseStorageMap = MapHashKey; + using DatabaseStorageMap = MapHash; using DatabaseStorageQuarantineMap = Signature::MapPublicKey>; class DatabaseStorage @@ -61,10 +61,12 @@ namespace odhtdb // Throws DatabaseStorageAlreadyExists if data with hash already exists void createStorage(const Hash &hash, Group *creatorGroup, u64 timestamp, const u8 *data, usize dataSize); - // Throws DatabaseStorageNotFound if data with hash does not exist - void appendStorage(const Hash &hash, const User *creatorUser, u64 timestamp, const u8 *data, usize dataSize); + // Throws DatabaseStorageNotFound if data with @nodeHash hash has not been created yet. + // Throws DatabaseStorageAlreadyExists if same data has been added before (hash of @data, in @dataHash) + void appendStorage(const Hash &nodeHash, const Hash &dataHash, const User *creatorUser, u64 timestamp, const u8 *data, usize dataSize); - void addToQuarantine(const Signature::PublicKey &creatorPublicKey, u64 timestamp, const u8 *data, usize dataSize); + // Throws DatabaseStorageAlreadyExists if same data has been added before (hash of @data, in @dataHash) + void addToQuarantine(const Hash &dataHash, const Signature::PublicKey &creatorPublicKey, u64 timestamp, const u8 *data, usize dataSize); void addUser(User *user, const Hash &hash); @@ -85,7 +87,8 @@ namespace odhtdb private: DatabaseStorageMap storageMap; DatabaseStorageQuarantineMap quarantineStorageMap; - Signature::MapPublicKey userPublicKeyNodeMap; + SetHash storedDataHash; // Prevent duplicate data from being added + Signature::MapPublicKey userPublicKeyNodeMap; Signature::MapPublicKey publicKeyUserMap; DataViewMap groupByIdMap; }; diff --git a/include/Hash.hpp b/include/Hash.hpp index bd87b69..9dce168 100644 --- a/include/Hash.hpp +++ b/include/Hash.hpp @@ -3,6 +3,7 @@ #include "utils.hpp" #include #include +#include namespace odhtdb { @@ -51,5 +52,7 @@ namespace odhtdb }; template - using MapHashKey = std::unordered_map; + using MapHash = std::unordered_map; + + using SetHash = std::unordered_set; } diff --git a/include/Log.hpp b/include/Log.hpp new file mode 100644 index 0000000..d09c2a2 --- /dev/null +++ b/include/Log.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace odhtdb +{ + class Log + { + public: + static void debug(const char *fmt, ...); + static void warn(const char *fmt, ...); + static void error(const char *fmt, ...); + }; +} -- cgit v1.2.3