/* */ #ifndef _D_DHT_BUCKET_H_ #define _D_DHT_BUCKET_H_ #include "common.h" #include "DHTConstants.h" #include "DHTNodeDecl.h" #include "DHTBucketDecl.h" #include "TimeA2.h" class Logger; class DHTBucket { private: size_t _prefixLength; // this bucket contains nodes of distance between [_min, _max](inclusive). unsigned char _min[DHT_ID_LENGTH]; unsigned char _max[DHT_ID_LENGTH]; DHTNodeHandle _localNode; // sorted in ascending order DHTNodes _nodes; DHTNodes _cachedNodes; Time _lastUpdated; const Logger* _logger; public: DHTBucket(const DHTNodeHandle& localNode); DHTBucket(size_t prefixLength, const unsigned char* max, const unsigned char* min, const DHTNodeHandle& localNode); ~DHTBucket(); static const size_t K = 8; static const size_t CACHE_SIZE = 2; void getRandomNodeID(unsigned char* nodeID) const; DHTBucketHandle split(); bool isInRange(const DHTNodeHandle& node) const; bool isInRange(const unsigned char* nodeID) const; bool addNode(const DHTNodeHandle& node); bool splitAllowed() const; size_t getPrefixLength() const { return _prefixLength; } const unsigned char* getMaxID() const { return _max; } const unsigned char* getMinID() const { return _min; } size_t countNode() const; const DHTNodes& getNodes() const; DHTNodes getGoodNodes() const; void dropNode(const DHTNodeHandle& node); void moveToHead(const DHTNodeHandle& node); void moveToTail(const DHTNodeHandle& node); bool contains(const DHTNodeHandle& node) const; DHTNodeHandle getNode(const unsigned char* nodeID, const string& ipaddr, uint16_t port) const; bool operator==(const DHTBucket& bucket) const; bool needsRefresh() const; void notifyUpdate(); bool containsQuestionableNode() const; DHTNodeHandle getLRUQuestionableNode() const; }; #endif // _D_DHT_BUCKET_H_