From 64a6a1701e7cac9688405019153eca5261adb899 Mon Sep 17 00:00:00 2001 From: Just Wonder Date: Sat, 13 Jun 2020 18:08:54 -0700 Subject: [PATCH] Fixed disassociation. --- src/coins.cpp | 6 +++--- src/keva/common.cpp | 37 +++++++++++++++++++++++++++++-------- src/keva/common.h | 6 +++++- src/txdb.cpp | 5 +++++ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 4ffd960c1..af27c3320 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -219,7 +219,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons // Handle namespace association. valtype associdateNamespace; - if (!cacheNames.getAssociateNamespaces(data.getValue(), associdateNamespace)) { + if (!cacheNames.getAssociateNamespaces(key, associdateNamespace)) { return; } @@ -227,7 +227,7 @@ void CCoinsViewCache::SetName(const valtype &nameSpace, const valtype &key, cons if (!GetNamespace(associdateNamespace, dummyData)) { return; } - cacheNames.associateNamespaces(nameSpace, associdateNamespace); + cacheNames.associateNamespaces(nameSpace, associdateNamespace, data); } void CCoinsViewCache::DeleteName(const valtype &nameSpace, const valtype &key) { @@ -239,7 +239,7 @@ void CCoinsViewCache::DeleteName(const valtype &nameSpace, const valtype &key) { // Handle namespace association. valtype associdateNamespace; - if (!cacheNames.getAssociateNamespaces(oldData.getValue(), associdateNamespace)) { + if (!cacheNames.getAssociateNamespaces(key, associdateNamespace)) { return; } diff --git a/src/keva/common.cpp b/src/keva/common.cpp index 1b4d613a8..d57712e83 100644 --- a/src/keva/common.cpp +++ b/src/keva/common.cpp @@ -186,7 +186,7 @@ bool CCacheKeyIterator::next(valtype& key, CKevaData& data) /* ************************************************************************** */ /* CKevaCache. */ -const std::string CKevaCache::associatePrefix = "_A_"; +const std::string CKevaCache::associatePrefix = "_f:"; bool CKevaCache::get(const valtype& nameSpace, const valtype& key, CKevaData& data) const @@ -215,6 +215,8 @@ void CKevaCache::set(const valtype& nameSpace, const valtype& key, const CKevaData& data) { auto name = std::make_tuple(nameSpace, key); + printf("set name is: %s\n", (EncodeBase58Check(nameSpace) + ValtypeToString(key)).c_str()); + printf("set, this is: %p, data value is: %s\n", this, ValtypeToString(data.getValue()).c_str()); const std::set::iterator di = deleted.find(name); if (di != deleted.end()) { deleted.erase(di); @@ -255,25 +257,39 @@ CKevaCache::getAssociateNamespaces(const valtype& value, valtype& nameSpace) } void -CKevaCache::associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther) +CKevaCache::associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther, const CKevaData& data) { auto name = std::make_tuple(nameSpaceOther, nameSpace); + printf("associateNamespaces, name is: %s\n", (EncodeBase58Check(nameSpaceOther) + EncodeBase58Check(nameSpace)).c_str()); + printf("associateNamespaces, this is: %p, data value is: %s\n", this, ValtypeToString(data.getValue()).c_str()); + + const std::set::iterator di = disassociations.find(name); + if (di != disassociations.end()) { + disassociations.erase(di); + } + const NamespaceMap::iterator ei = associations.find(name); - CKevaData data; - if (ei != entries.end()) + if (ei != associations.end()) { + printf("CKevaCache::associateNamespaces, REPLACE !!!\n"); ei->second = data; - else + } else { + printf("CKevaCache::associateNamespaces, INSERT !!!\n"); associations.insert(std::make_pair(name, data)); + } } void CKevaCache::disassociateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther) { auto name = std::make_tuple(nameSpaceOther, nameSpace); - const NamespaceMap::iterator ei = entries.find(name); - if (ei != entries.end()) { + const NamespaceMap::iterator ei = associations.find(name); + printf("CKevaCache::disassociateNamespaces, name is: %s\n", (EncodeBase58Check(nameSpaceOther) + EncodeBase58Check(nameSpace)).c_str()); + if (ei != associations.end()) { + printf("CKevaCache::disassociateNamespaces, erase!!!\n"); associations.erase(ei); } + + disassociations.insert(name); } CKevaIterator* @@ -298,15 +314,20 @@ CKevaCache::updateNamesForHeight (unsigned nHeight, void CKevaCache::apply(const CKevaCache& cache) { + printf("CKevaCache::apply!!!!\n"); for (EntryMap::const_iterator i = cache.entries.begin(); i != cache.entries.end(); ++i) { set(std::get<0>(i->first), std::get<1>(i->first), i->second); } for (NamespaceMap::const_iterator i = associations.begin(); i != associations.end(); ++i) { - set(std::get<0>(i->first), std::get<1>(i->first), i->second); + associateNamespaces(std::get<0>(i->first), std::get<1>(i->first), i->second); } for (std::set::const_iterator i = cache.deleted.begin(); i != cache.deleted.end(); ++i) { remove(std::get<0>(*i), std::get<1>(*i)); } + + for (std::set::const_iterator i = cache.disassociations.begin(); i != cache.disassociations.end(); ++i) { + disassociateNamespaces(std::get<0>(*i), std::get<1>(*i)); + } } diff --git a/src/keva/common.h b/src/keva/common.h index 9e3aa330f..bc64c693b 100644 --- a/src/keva/common.h +++ b/src/keva/common.h @@ -351,6 +351,9 @@ private: /** Namespace association. */ NamespaceMap associations; + /** Namespace disassociations. */ + std::set disassociations; + friend class CCacheKeyIterator; public: @@ -361,6 +364,7 @@ public: entries.clear(); deleted.clear(); associations.clear(); + disassociations.clear(); } /** @@ -406,7 +410,7 @@ public: bool getAssociateNamespaces(const valtype& value, valtype& nameSpace); /* Associate nameSpace with nameSpaceOther */ - void associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther); + void associateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther, const CKevaData& data); /* Disassociate nameSpace with nameSpaceOther */ void disassociateNamespaces(const valtype& nameSpace, const valtype& nameSpaceOther); diff --git a/src/txdb.cpp b/src/txdb.cpp index 5ae34151d..6d2b921c6 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -343,6 +343,11 @@ void CKevaCache::writeBatch (CDBBatch& batch) const std::pair name = std::make_pair(std::get<0>(*i), std::get<1>(*i)); batch.Erase(std::make_pair(DB_NAME, name)); } + + for (std::set::const_iterator i = disassociations.begin(); i != disassociations.end(); ++i) { + std::pair name = std::make_pair(std::get<0>(*i), std::get<1>(*i)); + batch.Erase(std::make_pair(DB_NS_ASSOC, name)); + } } bool CBlockTreeDB::ReadTxIndex(const uint256 &txid, CDiskTxPos &pos) {