Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14864366
D9567.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
D9567.id.diff
View Options
diff --git a/src/txrequest.h b/src/txrequest.h
--- a/src/txrequest.h
+++ b/src/txrequest.h
@@ -117,10 +117,48 @@
* announcements, plus the number of announcements affected by an operation
* (amortized O(1) per announcement).
*/
+
+// Avoid littering this header file with implementation details.
+class InvRequestTrackerImplInterface {
+ friend class TxRequestTracker;
+
+ // The base class is responsible for building the child implementation.
+ // This is a hack that allows for hiding the concrete implementation details
+ // from the callsite.
+ static std::unique_ptr<InvRequestTrackerImplInterface>
+ BuildImpl(bool deterministic);
+
+public:
+ using ClearExpiredFun = const std::function<void()> &;
+ using EmplaceExpiredFun =
+ const std::function<void(const NodeId &, const uint256 &)> &;
+
+ virtual ~InvRequestTrackerImplInterface() = default;
+
+ virtual void ReceivedInv(NodeId peer, const uint256 &txid, bool preferred,
+ std::chrono::microseconds reqtime) = 0;
+ virtual void DisconnectedPeer(NodeId peer) = 0;
+ virtual void ForgetTxId(const uint256 &txid) = 0;
+ virtual std::vector<uint256>
+ GetRequestable(NodeId peer, std::chrono::microseconds now,
+ ClearExpiredFun clearExpired,
+ EmplaceExpiredFun emplaceExpired) = 0;
+ virtual void RequestedTx(NodeId peer, const uint256 &txid,
+ std::chrono::microseconds expiry) = 0;
+ virtual void ReceivedResponse(NodeId peer, const uint256 &txid) = 0;
+ virtual size_t CountInFlight(NodeId peer) const = 0;
+ virtual size_t CountCandidates(NodeId peer) const = 0;
+ virtual size_t Count(NodeId peer) const = 0;
+ virtual size_t Size() const = 0;
+ virtual uint64_t ComputePriority(const uint256 &txid, NodeId peer,
+ bool preferred) const = 0;
+ virtual void SanityCheck() const = 0;
+ virtual void
+ PostGetRequestableSanityCheck(std::chrono::microseconds now) const = 0;
+};
+
class TxRequestTracker {
- // Avoid littering this header file with implementation details.
- class Impl;
- const std::unique_ptr<Impl> m_impl;
+ const std::unique_ptr<InvRequestTrackerImplInterface> m_impl;
public:
//! Construct a TxRequestTracker.
diff --git a/src/txrequest.cpp b/src/txrequest.cpp
--- a/src/txrequest.cpp
+++ b/src/txrequest.cpp
@@ -351,14 +351,10 @@
return ret;
}
-using clearExpiredFun = const std::function<void()> &;
-using emplaceExpiredFun =
- const std::function<void(const NodeId &, const uint256 &)> &;
-
} // namespace
/** Actual implementation for TxRequestTracker's data structure. */
-class TxRequestTracker::Impl {
+class InvRequestTrackerImpl : public InvRequestTrackerImplInterface {
//! The current sequence number. Increases for every announcement. This is
//! used to sort txid returned by GetRequestable in announcement order.
SequenceNumber m_current_sequence{0};
@@ -587,8 +583,8 @@
//! - CANDIDATE_{READY,BEST} announcements with reqtime > now are turned
//! into CANDIDATE_DELAYED.
void SetTimePoint(std::chrono::microseconds now,
- clearExpiredFun clearExpired,
- emplaceExpiredFun emplaceExpired) {
+ ClearExpiredFun clearExpired,
+ EmplaceExpiredFun emplaceExpired) {
clearExpired();
// Iterate over all CANDIDATE_DELAYED and REQUESTED from old to new, as
// long as they're in the past, and convert them to CANDIDATE_READY and
@@ -624,7 +620,7 @@
}
public:
- Impl(bool deterministic)
+ InvRequestTrackerImpl(bool deterministic)
: m_computer(deterministic),
// Explicitly initialize m_index as we need to pass a reference to
// m_computer to ByTxHashViewExtractor.
@@ -637,8 +633,10 @@
// Disable copying and assigning (a default copy won't work due the stateful
// ByTxIdViewExtractor).
- Impl(const Impl &) = delete;
- Impl &operator=(const Impl &) = delete;
+ InvRequestTrackerImpl(const InvRequestTrackerImpl &) = delete;
+ InvRequestTrackerImpl &operator=(const InvRequestTrackerImpl &) = delete;
+
+ ~InvRequestTrackerImpl() = default;
void DisconnectedPeer(NodeId peer) {
auto &index = m_index.get<ByPeer>();
@@ -719,8 +717,8 @@
//! Find the TxIds to request now from peer.
std::vector<uint256> GetRequestable(NodeId peer,
std::chrono::microseconds now,
- clearExpiredFun clearExpired,
- emplaceExpiredFun emplaceExpired) {
+ ClearExpiredFun clearExpired,
+ EmplaceExpiredFun emplaceExpired) {
// Move time.
SetTimePoint(now, clearExpired, emplaceExpired);
@@ -861,8 +859,13 @@
}
};
+std::unique_ptr<InvRequestTrackerImplInterface>
+InvRequestTrackerImplInterface::BuildImpl(bool deterministic) {
+ return std::make_unique<InvRequestTrackerImpl>(deterministic);
+}
+
TxRequestTracker::TxRequestTracker(bool deterministic)
- : m_impl{std::make_unique<TxRequestTracker::Impl>(deterministic)} {}
+ : m_impl{InvRequestTrackerImplInterface::BuildImpl(deterministic)} {}
TxRequestTracker::~TxRequestTracker() = default;
@@ -911,17 +914,17 @@
std::vector<TxId> TxRequestTracker::GetRequestable(
NodeId peer, std::chrono::microseconds now,
std::vector<std::pair<NodeId, TxId>> *expired) {
- clearExpiredFun clearExpired = [expired]() {
+ InvRequestTrackerImplInterface::ClearExpiredFun clearExpired = [expired]() {
if (expired) {
expired->clear();
}
};
- emplaceExpiredFun emplaceExpired = [expired](const NodeId &nodeid,
- const uint256 &txid) {
- if (expired) {
- expired->emplace_back(nodeid, TxId(txid));
- }
- };
+ InvRequestTrackerImplInterface::EmplaceExpiredFun emplaceExpired =
+ [expired](const NodeId &nodeid, const uint256 &txid) {
+ if (expired) {
+ expired->emplace_back(nodeid, TxId(txid));
+ }
+ };
std::vector<uint256> hashes =
m_impl->GetRequestable(peer, now, clearExpired, emplaceExpired);
return std::vector<TxId>(hashes.begin(), hashes.end());
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, May 20, 19:04 (3 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5863215
Default Alt Text
D9567.id.diff (6 KB)
Attached To
D9567: Abstract out the TxRequestTracker public interface
Event Timeline
Log In to Comment