From e399be47c4d44642af6599ae1b983c10bea42155 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Nov 2012 13:39:37 -0800 Subject: [PATCH 1/5] Remove metadata field parameters. --- src/cpp/ripple/FieldNames.cpp | 22 +--------------------- src/cpp/ripple/FieldNames.h | 18 ++---------------- 2 files changed, 3 insertions(+), 37 deletions(-) diff --git a/src/cpp/ripple/FieldNames.cpp b/src/cpp/ripple/FieldNames.cpp index 2789f33aba..d51adf8ad0 100644 --- a/src/cpp/ripple/FieldNames.cpp +++ b/src/cpp/ripple/FieldNames.cpp @@ -30,27 +30,6 @@ static int initFields() { sfTxnSignature.notSigningField(); sfTxnSignatures.notSigningField(); sfSignature.notSigningField(); - - sfHighQualityIn.setMeta(SFM_CHANGE); sfHighQualityOut.setMeta(SFM_CHANGE); - sfLowQualityIn.setMeta(SFM_CHANGE); sfLowQualityOut.setMeta(SFM_CHANGE); - - sfLowLimit.setMeta(SFM_ALWAYS); sfHighLimit.setMeta(SFM_ALWAYS); - sfTakerPays.setMeta(SFM_ALWAYS); sfTakerGets.setMeta(SFM_ALWAYS); - sfQualityIn.setMeta(SFM_ALWAYS); sfQualityOut.setMeta(SFM_ALWAYS); - - sfBalance.setMeta(SFM_ALWAYS); - - sfPublicKey.setMeta(SFM_CHANGE); sfMessageKey.setMeta(SFM_CHANGE); - sfSigningPubKey.setMeta(SFM_CHANGE); sfAuthorizedKey.setMeta(SFM_CHANGE); - sfSigningAccounts.setMeta(SFM_CHANGE); - - sfWalletLocator.setMeta(SFM_ALWAYS); - sfWalletSize.setMeta(SFM_ALWAYS); - sfNickname.setMeta(SFM_CHANGE); - sfAmount.setMeta(SFM_ALWAYS); - sfDomain.setMeta(SFM_CHANGE); - sfOwner.setMeta(SFM_ALWAYS); - return 0; } static const int f = initFields(); @@ -60,6 +39,7 @@ SField::SField(SerializedTypeID tid, int fv) : fieldCode(FIELD_CODE(tid, fv)), f { // call with the map mutex fieldName = lexical_cast_i(tid) + "/" + lexical_cast_i(fv); codeToField[fieldCode] = this; + assert((fv != 1) || ((tid != STI_ARRAY) && (tid!=STI_OBJECT))); } SField::ref SField::getField(int code) diff --git a/src/cpp/ripple/FieldNames.h b/src/cpp/ripple/FieldNames.h index 3a0ae9a3a1..8b1d5636a5 100644 --- a/src/cpp/ripple/FieldNames.h +++ b/src/cpp/ripple/FieldNames.h @@ -33,14 +33,6 @@ enum SOE_Flags SOE_OPTIONAL = 1, // optional }; -enum SF_Meta -{ - SFM_NEVER = 0, - SFM_CHANGE = 1, - SFM_DELETE = 2, - SFM_ALWAYS = 3 -}; - class SField { public: @@ -59,19 +51,17 @@ public: const SerializedTypeID fieldType; // STI_* const int fieldValue; // Code number for protocol std::string fieldName; - SF_Meta fieldMeta; bool signingField; SField(int fc, SerializedTypeID tid, int fv, const char* fn) : - fieldCode(fc), fieldType(tid), fieldValue(fv), fieldName(fn), fieldMeta(SFM_NEVER), signingField(true) + fieldCode(fc), fieldType(tid), fieldValue(fv), fieldName(fn), signingField(true) { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; } SField(SerializedTypeID tid, int fv, const char *fn) : - fieldCode(FIELD_CODE(tid, fv)), fieldType(tid), fieldValue(fv), fieldName(fn), - fieldMeta(SFM_NEVER), signingField(true) + fieldCode(FIELD_CODE(tid, fv)), fieldType(tid), fieldValue(fv), fieldName(fn), signingField(true) { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; @@ -95,10 +85,6 @@ public: bool isBinary() const { return fieldValue < 256; } bool isDiscardable() const { return fieldValue > 256; } - SF_Meta getMeta() const { return fieldMeta; } - bool shouldMetaDel() const { return (fieldMeta == SFM_DELETE) || (fieldMeta == SFM_ALWAYS); } - bool shouldMetaMod() const { return (fieldMeta == SFM_CHANGE) || (fieldMeta == SFM_ALWAYS); } - void setMeta(SF_Meta m) { fieldMeta = m; } bool isSigningField() const { return signingField; } void notSigningField() { signingField = false; } From 4fe3f7c7e0a2a247c7fb999441331c8f0091919e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Nov 2012 13:40:02 -0800 Subject: [PATCH 2/5] Include ledger entry type in metadata. Include more new/changed/final field values in transactions metadata. --- src/cpp/ripple/LedgerEntrySet.cpp | 23 +++++++++++++++-------- src/cpp/ripple/SerializeProto.h | 3 ++- src/cpp/ripple/TransactionMeta.cpp | 4 +++- src/cpp/ripple/TransactionMeta.h | 2 +- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/cpp/ripple/LedgerEntrySet.cpp b/src/cpp/ripple/LedgerEntrySet.cpp index e7d361c671..50fea37747 100644 --- a/src/cpp/ripple/LedgerEntrySet.cpp +++ b/src/cpp/ripple/LedgerEntrySet.cpp @@ -394,12 +394,10 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) continue; SLE::pointer origNode = mLedger->getSLE(it.first); - - if (origNode && (origNode->getType() == ltDIR_NODE)) // No metadata for dir nodes - continue; - SLE::pointer curNode = it.second.mEntry; - mSet.setAffectedNode(it.first, *type); + uint16 nodeType = curNode ? curNode->getFieldU16(sfLedgerEntry) : origNode->getFieldU16(sfLedgerEntry); + + mSet.setAffectedNode(it.first, *type, nodeType); if (type == &sfDeletedNode) { @@ -408,8 +406,8 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) STObject finals(sfFinalFields); BOOST_FOREACH(const SerializedType& obj, *curNode) - { // search the deleted node for values saved on delete - if (obj.getFName().shouldMetaDel() && !obj.isDefault()) + { // save non-default values + if (!obj.isDefault() && (obj.getFName() != sfLedgerEntryType)) finals.addObject(obj); } if (!finals.empty()) @@ -421,7 +419,7 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) STObject mods(sfPreviousFields); BOOST_FOREACH(const SerializedType& obj, *origNode) { // search the original node for values saved on modify - if (obj.getFName().shouldMetaMod() && !obj.isDefault() && !curNode->hasMatchingEntry(obj)) + if (!obj.isDefault() && (obj.getFName() != sfLedgerEntryType) && !curNode->hasMatchingEntry(obj)) mods.addObject(obj); } if (!mods.empty()) @@ -432,6 +430,15 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) { assert(!origNode); threadOwners(curNode, mLedger, newMod); + + STObject news(sfNewFields); + BOOST_FOREACH(const SerializedType& obj, *curNode) + { // save non-default values + if (!obj.isDefault() && (obj.getFName() != sfLedgerEntryType)) + news.addObject(obj); + } + if (!news.empty()) + mSet.getAffectedNode(it.first, *type).addObject(news); } if ((type == &sfCreatedNode) || (type == &sfModifiedNode)) diff --git a/src/cpp/ripple/SerializeProto.h b/src/cpp/ripple/SerializeProto.h index 59acb547a6..00677319a8 100644 --- a/src/cpp/ripple/SerializeProto.h +++ b/src/cpp/ripple/SerializeProto.h @@ -133,7 +133,8 @@ FIELD(ModifiedNode, OBJECT, 5) FIELD(PreviousFields, OBJECT, 6) FIELD(FinalFields, OBJECT, 7) - FIELD(TemplateEntry, OBJECT, 8) + FIELD(NewFields, OBJECT, 8) + FIELD(TemplateEntry, OBJECT, 9) // array of objects // ARRAY/1 is reserved for end of array diff --git a/src/cpp/ripple/TransactionMeta.cpp b/src/cpp/ripple/TransactionMeta.cpp index 182a25a77c..f7b21bb8de 100644 --- a/src/cpp/ripple/TransactionMeta.cpp +++ b/src/cpp/ripple/TransactionMeta.cpp @@ -31,13 +31,14 @@ bool TransactionMetaSet::isNodeAffected(const uint256& node) const return false; } -void TransactionMetaSet::setAffectedNode(const uint256& node, SField::ref type) +void TransactionMetaSet::setAffectedNode(const uint256& node, SField::ref type, uint16 nodeType) { // make sure the node exists and force its type BOOST_FOREACH(STObject& it, mNodes) { if (it.getFieldH256(sfLedgerIndex) == node) { it.setFName(type); + it.setFieldU16(sfLedgerEntryType, nodeType); return; } } @@ -47,6 +48,7 @@ void TransactionMetaSet::setAffectedNode(const uint256& node, SField::ref type) assert(obj.getFName() == type); obj.setFieldH256(sfLedgerIndex, node); + obj.setFieldU16(sfLedgerEntryType, nodeType); } /* diff --git a/src/cpp/ripple/TransactionMeta.h b/src/cpp/ripple/TransactionMeta.h index 994e325a01..a22058089e 100644 --- a/src/cpp/ripple/TransactionMeta.h +++ b/src/cpp/ripple/TransactionMeta.h @@ -39,7 +39,7 @@ public: uint32 getLgrSeq() { return mLedger; } bool isNodeAffected(const uint256&) const; - void setAffectedNode(const uint256&, SField::ref type); + void setAffectedNode(const uint256&, SField::ref type, uint16 nodeType); STObject& getAffectedNode(const uint256&, SField::ref type); STObject& getAffectedNode(const uint256&); const STObject& peekAffectedNode(const uint256&) const; From 9e36f54e244ecea0dddef48f70f2fc6b9ce00b54 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Nov 2012 13:40:27 -0800 Subject: [PATCH 3/5] Cleanup. --- src/cpp/ripple/RippleAddress.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/RippleAddress.cpp b/src/cpp/ripple/RippleAddress.cpp index 46d769d302..a194a16bce 100644 --- a/src/cpp/ripple/RippleAddress.cpp +++ b/src/cpp/ripple/RippleAddress.cpp @@ -792,7 +792,7 @@ void RippleAddress::setSeedRandom() // XXX Maybe we should call MakeNewKey uint128 key; - RAND_bytes((unsigned char *) &key, sizeof(key)); + RAND_bytes(key.begin(), key.size()); RippleAddress::setSeed(key); } From 6f445771098d73b8930516a1bb2fc022059dce56 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Nov 2012 13:56:26 -0800 Subject: [PATCH 4/5] Be more explicity about make_pair types. --- src/cpp/ripple/TaggedCache.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/cpp/ripple/TaggedCache.h b/src/cpp/ripple/TaggedCache.h index aee675042f..fa3c6541aa 100644 --- a/src/cpp/ripple/TaggedCache.h +++ b/src/cpp/ripple/TaggedCache.h @@ -29,9 +29,10 @@ public: typedef c_Key key_type; typedef c_Data data_type; - typedef boost::weak_ptr weak_data_ptr; - typedef boost::shared_ptr data_ptr; - typedef std::pair cache_entry; + typedef boost::weak_ptr weak_data_ptr; + typedef boost::shared_ptr data_ptr; + typedef std::pair cache_entry; + typedef std::pair cache_pair; protected: mutable boost::recursive_mutex mLock; @@ -156,7 +157,7 @@ template bool TaggedCache::touch } // In map but not cache, put in cache - mCache.insert(std::make_pair(key, std::make_pair(time(NULL), weak_data_ptr(cit->second.second)))); + mCache.insert(cache_pair(key, cache_entry(time(NULL), weak_data_ptr(cit->second.second)))); return true; } @@ -180,7 +181,7 @@ bool TaggedCache::canonicalize(const key_type& key, boost::shared typename boost::unordered_map::iterator mit = mMap.find(key); if (mit == mMap.end()) { // not in map - mCache.insert(std::make_pair(key, std::make_pair(time(NULL), data))); + mCache.insert(cache_pair(key, cache_entry(time(NULL), data))); mMap.insert(std::make_pair(key, data)); return false; } @@ -189,7 +190,7 @@ bool TaggedCache::canonicalize(const key_type& key, boost::shared if (!cachedData) { // in map, but expired. Update in map, insert in cache mit->second = data; - mCache.insert(std::make_pair(key, std::make_pair(time(NULL), data))); + mCache.insert(cache_pair(key, cache_entry(time(NULL), data))); return true; } @@ -208,7 +209,7 @@ bool TaggedCache::canonicalize(const key_type& key, boost::shared cit->second.second = data; } else // no, add to cache - mCache.insert(std::make_pair(key, std::make_pair(time(NULL), data))); + mCache.insert(cache_pair(key, cache_entry(time(NULL), data))); return true; } @@ -235,7 +236,7 @@ boost::shared_ptr TaggedCache::fetch(const key_type& key) if (cit != mCache.end()) cit->second.first = time(NULL); // Yes, refresh else // No, add to cache - mCache.insert(std::make_pair(key, std::make_pair(time(NULL), cachedData))); + mCache.insert(cache_pair(key, cache_entry(time(NULL), cachedData))); return cachedData; } From c725d78e2414c346c28945bbfc938b768a763d6f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 12 Nov 2012 14:17:35 -0800 Subject: [PATCH 5/5] Trivial change to force push. --- src/cpp/ripple/TaggedCache.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/TaggedCache.h b/src/cpp/ripple/TaggedCache.h index fa3c6541aa..1c334c1668 100644 --- a/src/cpp/ripple/TaggedCache.h +++ b/src/cpp/ripple/TaggedCache.h @@ -12,7 +12,7 @@ #include "Log.h" extern LogPartition TaggedCachePartition; -// This class implemented a cache and a map. The cache keeps objects alive +// This class implements a cache and a map. The cache keeps objects alive // in the map. The map allows multiple code paths that reference objects // with the same tag to get the same actual object.