5 #ifndef ctrlplane_db_table_h
6 #define ctrlplane_db_table_h
11 #include <boost/function.hpp>
12 #include <boost/intrusive_ptr.hpp>
13 #include <tbb/atomic.h>
24 class ShowTableListener;
48 std::unique_ptr<DBRequestKey>
key;
49 std::unique_ptr<DBRequestData>
data;
61 typedef boost::function<void(DBTablePartBase *, DBEntryBase *)>
ChangeCallback;
88 const std::string &
name =
"unspecified");
100 virtual size_t Size()
const {
return 0; }
114 void FillListeners(std::vector<ShowTableListener> *listeners)
const;
148 std::unique_ptr<ListenerInfo>
info_;
176 typedef boost::function<bool(DBTablePartBase *, DBEntryBase *)>
WalkFn;
259 virtual size_t Size()
const;
309 static unsigned int walk_sleep_usecs_;
315 char *wait = getenv(
"DB_WALKER_WAIT_USECS");
317 walk_sleep_usecs_ = (
unsigned int) strtoul(wait, NULL, 0);
318 if (walk_sleep_usecs_ > 1000000)
319 walk_sleep_usecs_ = 1000000;
324 if (walk_sleep_usecs_) {
325 usleep(walk_sleep_usecs_);
422 int prev = walker->
refcount_.fetch_and_decrement();
uint64_t walk_again_count() const
friend void intrusive_ptr_add_ref(DBTableWalk *walker)
static const int kIterationToYield
tbb::atomic< uint64_t > walk_request_count_
int intrusive_ptr_add_ref(const AsPath *cpath)
const DB * database() const
uint64_t walk_request_count() const
void WalkTable(DBTableWalkRef walk)
bool WalkCallback(DBTablePartBase *tpart, DBEntryBase *entry)
uint64_t enqueue_count() const
void RunNotify(DBTablePartBase *tpart, DBEntryBase *entry)
uint64_t walk_count() const
DISALLOW_COPY_AND_ASSIGN(DBRequest)
virtual bool OnChange(DBEntry *entry, const DBRequest *req)
void AddToDBStateCount(ListenerId listener, int count)
void incr_walk_cancel_count()
std::vector< DBTablePartition * > partitions_
virtual void RetryDelete()
DBTableBase(DB *db, const std::string &name)
tbb::atomic< bool > walk_again_
uint64_t input_count() const
DBTable::WalkCompleteFn walk_complete() const
std::unique_ptr< DBRequestData > data
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
boost::function< void(DBTablePartBase *, DBEntryBase *)> ChangeCallback
virtual DBEntry * Add(const DBRequest *req)
virtual size_t Size() const
bool Enqueue(DBRequest *req)
virtual void Change(DBEntryBase *entry)
tbb::atomic< uint64_t > walk_count_
void reset_notify_count()
WalkState walk_state() const
tbb::atomic< uint64_t > walk_again_count_
uint64_t GetDBStateCount(ListenerId listener)
int GetPartitionId(const DBRequestKey *key)
void Swap(DBRequest *rhs)
virtual size_t Hash(const DBEntry *entry) const
void FillListeners(std::vector< ShowTableListener > *listeners) const
void Unregister(ListenerId listener)
static void db_walker_wait()
void ReleaseWalker(DBTableWalkRef &walk)
boost::function< void(DBTableWalkRef, DBTableBase *)> WalkCompleteFn
tbb::atomic< int > refcount_
DISALLOW_COPY_AND_ASSIGN(DBTableWalk)
DBTable::WalkCompleteFn walk_complete_
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
uint64_t notify_count() const
std::unique_ptr< TableWalker > walker_
tbb::atomic< uint64_t > walk_complete_count_
virtual size_t Hash(const DBRequestKey *key) const
void WalkAgain(DBTableWalkRef walk)
uint64_t walk_complete_count() const
virtual size_t Size() const
DBTable(DB *db, const std::string &name)
virtual bool Delete(DBEntry *entry, const DBRequest *req)
virtual void Change(DBEntryBase *)=0
void incr_enqueue_count()
friend void intrusive_ptr_release(DBTableWalk *walker)
void SetWalkIterationToYield(int count)
std::unique_ptr< DBRequestKey > key
uint64_t walk_cancel_count() const
virtual void AddRemoveCallback(const DBEntryBase *entry, bool add) const
DISALLOW_COPY_AND_ASSIGN(DBTable)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const =0
std::unique_ptr< ListenerInfo > info_
DBEntry * FindNoLock(const DBEntry *entry)
void incr_walk_complete_count()
const std::string & name() const
void EnqueueRemove(DBEntryBase *db_entry)
virtual DBTablePartition * AllocPartition(int index)
uint64_t decr_walker_count()
virtual bool MayDelete() const
bool walk_is_active() const
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
DBTableWalk(DBTable *table, DBTable::WalkFn walk_fn, DBTable::WalkCompleteFn walk_complete)
tbb::atomic< WalkState > walk_state_
bool InvokeWalkCb(DBTablePartBase *part, DBEntryBase *entry)
size_t GetListenerCount() const
int max_walk_iteration_to_yield_
static void DBStateClear(DBTable *table, ListenerId id)
bool HasListeners() const
DBTable::WalkFn walk_fn() const
static const int kInvalidId
DBEntry * Find(const DBEntry *entry)
void WalkCompleteCallback(DBTableBase *tbl_base)
boost::function< bool(DBTablePartBase *, DBEntryBase *)> WalkFn
void reset_enqueue_count()
uint64_t walker_count() const
void intrusive_ptr_release(const AsPath *cpath)
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
tbb::atomic< uint64_t > walk_cancel_count_
DBTable::DBTableWalkRef walk_ref_
virtual int PartitionCount() const
void set_walk_requested()
int GetWalkIterationToYield()
tbb::atomic< uint64_t > walker_count_
void incr_walk_again_count()
void SetWalkTaskId(int task_id)
void incr_walk_request_count()
DBRequest(DBOperation op)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)=0
virtual void Input(DBTablePartition *tbl_partition, DBClient *client, DBRequest *req)