A bit more cleanup

Signed-off-by: Anthony Fieroni <bvbfan@abv.bg>
This commit is contained in:
Anthony Fieroni 2019-07-15 08:48:24 +03:00
parent c83062bfa8
commit 8af7ed9450
3 changed files with 41 additions and 48 deletions

View file

@ -41,60 +41,38 @@ uint256 getValueHash(const COutPoint& outPoint, int nHeightOfLastTakeover)
return result;
}
template <typename T>
bool equals(const T& lhs, const T& rhs)
{
return lhs == rhs;
}
template <typename T>
bool equals(const T& value, const COutPoint& outPoint)
{
return value.outPoint == outPoint;
}
template <typename T>
bool equals(const T& value, const std::string& name, const COutPoint& outPoint)
{
return value.name == name && value.outPoint == outPoint;
}
template <typename K, typename V>
bool equals(const std::pair<K, V>& pair, const std::string& name, const COutPoint& outPoint)
bool equals(const std::pair<K, V>& pair, const CNameOutPointType& point)
{
return pair.first == name && pair.second.outPoint == outPoint;
return pair.first == point.name && pair.second.outPoint == point.outPoint;
}
template <typename T>
auto findOutPoint(T& cont, const COutPoint& outPoint) -> decltype(cont.begin())
template <typename T, typename C>
auto findOutPoint(T& cont, const C& point) -> decltype(cont.begin())
{
using type = typename T::value_type;
static_assert(std::is_same<typename std::remove_const<T>::type, std::vector<type>>::value, "T should be a vector type");
return std::find_if(cont.begin(), cont.end(), [&outPoint](const type& val) {
return equals(val, outPoint);
return std::find_if(cont.begin(), cont.end(), [&point](const type& val) {
return equals(val, point);
});
}
template <typename T>
auto findOutPoint(T& cont, const std::string& name, const COutPoint& outPoint) -> decltype(cont.begin())
template <typename T, typename C>
bool eraseOutPoint(std::vector<T>& cont, const C& point, T* value = nullptr)
{
using type = typename T::value_type;
static_assert(std::is_same<typename std::remove_const<T>::type, std::vector<type>>::value, "T should be a vector type");
return std::find_if(cont.begin(), cont.end(), [&name, &outPoint](const type& val) {
return equals(val, name, outPoint);
});
}
template <typename T>
bool eraseOutPoint(std::vector<T>& cont, const COutPoint& outPoint, T* value = nullptr)
{
auto it = findOutPoint(cont, outPoint);
if (it == cont.end())
return false;
if (value)
std::swap(*it, *value);
cont.erase(it);
return true;
}
template <typename T>
bool eraseOutPoint(std::vector<T>& cont, const std::string& name, const COutPoint& outPoint, T* value = nullptr)
{
auto it = findOutPoint(cont, name, outPoint);
auto it = findOutPoint(cont, point);
if (it == cont.end())
return false;
if (value)
@ -269,7 +247,7 @@ bool CClaimTrieCacheBase::haveInQueue(const std::string& name, const COutPoint&
if (itNameRow != nameRow->second.end()) {
nValidAtHeight = itNameRow->nHeight;
if (auto row = getQueueCacheRow<T>(nValidAtHeight)) {
auto iRow = findOutPoint(row->second, name, outPoint);
auto iRow = findOutPoint(row->second, CNameOutPointType{name, outPoint});
if (iRow != row->second.end()) {
if (iRow->second.nValidAtHeight != nValidAtHeight)
LogPrintf("%s: An inconsistency was found in the support queue. Please report this to the developers:\nDifferent nValidAtHeight between named queue and height queue\n: name: %s, txid: %s, nOut: %d, nValidAtHeight in named queue: %d, nValidAtHeight in height queue: %d current height: %d\n", __func__, name, outPoint.hash.GetHex(), outPoint.n, nValidAtHeight, iRow->second.nValidAtHeight, nNextHeight);
@ -856,7 +834,7 @@ bool CClaimTrieCacheBase::removeFromQueue(const std::string& name, const COutPoi
auto itQueueName = findOutPoint(itQueueNameRow->second, outPoint);
if (itQueueName != itQueueNameRow->second.end()) {
if (auto itQueueRow = getQueueCacheRow<T>(itQueueName->nHeight)) {
auto itQueue = findOutPoint(itQueueRow->second, name, outPoint);
auto itQueue = findOutPoint(itQueueRow->second, CNameOutPointType{name, outPoint});
if (itQueue != itQueueRow->second.end()) {
std::swap(value, itQueue->second);
itQueueNameRow->second.erase(itQueueName);
@ -933,7 +911,7 @@ bool CClaimTrieCacheBase::remove(T& value, const std::string& name, const COutPo
if (removeFromQueue(adjusted, outPoint, value) || removeFromCache(name, outPoint, value, fCheckTakeover)) {
int expirationHeight = value.nHeight + expirationTime();
if (auto itQueueRow = getExpirationQueueCacheRow<T>(expirationHeight))
eraseOutPoint(itQueueRow->second, adjusted, outPoint);
eraseOutPoint(itQueueRow->second, CNameOutPointType{adjusted, outPoint});
nValidAtHeight = value.nValidAtHeight;
return true;
}
@ -1285,7 +1263,7 @@ void CClaimTrieCacheBase::reactivate(const expirationQueueRowType& row, int heig
for (auto e = row.begin(); e != row.end(); ++e) {
// remove and insert with new expiration time
if (auto itQueueRow = getExpirationQueueCacheRow<T>(height))
eraseOutPoint(itQueueRow->second, e->name, e->outPoint);
eraseOutPoint(itQueueRow->second, CNameOutPointType{e->name, e->outPoint});
int extend_expiration = Params().GetConsensus().nExtendedClaimExpirationTime - Params().GetConsensus().nOriginalClaimExpirationTime;
int new_expiration_height = increment ? height + extend_expiration : height - extend_expiration;
@ -1294,8 +1272,15 @@ void CClaimTrieCacheBase::reactivate(const expirationQueueRowType& row, int heig
}
}
template void CClaimTrieCacheBase::reactivate<CClaimValue>(const expirationQueueRowType& row, int height, bool increment);
template void CClaimTrieCacheBase::reactivate<CSupportValue>(const expirationQueueRowType& row, int height, bool increment);
void CClaimTrieCacheBase::reactivateClaim(const expirationQueueRowType& row, int height, bool increment)
{
reactivate<CClaimValue>(row, height, increment);
}
void CClaimTrieCacheBase::reactivateSupport(const expirationQueueRowType& row, int height, bool increment)
{
reactivate<CSupportValue>(row, height, increment);
}
int CClaimTrieCacheBase::getNumBlocksOfContinuousOwnership(const std::string& name) const
{

View file

@ -256,6 +256,11 @@ struct CNameOutPointType
{
}
bool operator==(const CNameOutPointType& other) const
{
return name == other.name && outPoint == other.outPoint;
}
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>
@ -484,15 +489,15 @@ protected:
int getNumBlocksOfContinuousOwnership(const std::string& name) const;
void reactivateClaim(const expirationQueueRowType& row, int height, bool increment);
void reactivateSupport(const expirationQueueRowType& row, int height, bool increment);
expirationQueueType expirationQueueCache;
expirationQueueType supportExpirationQueueCache;
int nNextHeight; // Height of the block that is being worked on, which is
// one greater than the height of the chain's tip
template <typename T>
void reactivate(const expirationQueueRowType& row, int height, bool increment);
private:
uint256 hashBlock;
@ -566,6 +571,9 @@ private:
template <typename T>
void undoIncrement(const std::string& name, insertUndoType& insertUndo, std::vector<queueEntryType<T>>& expireUndo);
template <typename T>
void reactivate(const expirationQueueRowType& row, int height, bool increment);
// for unit test
friend struct ClaimTrieChainFixture;
friend class CClaimTrieCacheTest;

View file

@ -69,14 +69,14 @@ bool CClaimTrieCacheExpirationFork::forkForExpirationChange(bool increment)
if (key.first == EXP_QUEUE_ROW) {
expirationQueueRowType row;
if (pcursor->GetValue(row)) {
reactivate<CClaimValue>(row, height, increment);
reactivateClaim(row, height, increment);
} else {
return error("%s(): error reading expiration queue rows from disk", __func__);
}
} else if (key.first == SUPPORT_EXP_QUEUE_ROW) {
expirationQueueRowType row;
if (pcursor->GetValue(row)) {
reactivate<CSupportValue>(row, height, increment);
reactivateSupport(row, height, increment);
} else {
return error("%s(): error reading support expiration queue rows from disk", __func__);
}