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;
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_;
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 input_count() const
bool Enqueue(DBRequest *req)
void AddToDBStateCount(ListenerId listener, int count)
tbb::atomic< uint64_t > walk_again_count_
size_t GetListenerCount() const
const DB * database() const
virtual DBTablePartBase * GetTablePartition(const DBEntryBase *entry)=0
tbb::atomic< uint64_t > walk_complete_count_
virtual DBTablePartBase * GetTablePartition(const int index)=0
void incr_walk_request_count()
tbb::atomic< uint64_t > walk_cancel_count_
void incr_walk_cancel_count()
void RunNotify(DBTablePartBase *tpart, DBEntryBase *entry)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)=0
boost::function< void(DBTablePartBase *, DBEntryBase *)> ChangeCallback
virtual void RetryDelete()
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
uint64_t enqueue_count() const
void EnqueueRemove(DBEntryBase *db_entry)
uint64_t GetDBStateCount(ListenerId listener)
std::unique_ptr< ListenerInfo > info_
uint64_t walk_cancel_count() const
bool HasListeners() const
uint64_t decr_walker_count()
virtual bool MayDelete() const
virtual void AddRemoveCallback(const DBEntryBase *entry, bool add) const
uint64_t notify_count() const
void incr_walk_complete_count()
uint64_t walk_count() const
uint64_t walk_complete_count() const
uint64_t walk_again_count() const
void reset_enqueue_count()
static const int kInvalidId
void incr_enqueue_count()
uint64_t walk_request_count() const
tbb::atomic< uint64_t > walk_request_count_
virtual void Change(DBEntryBase *)=0
void Unregister(ListenerId listener)
void FillListeners(std::vector< ShowTableListener > *listeners) const
uint64_t walker_count() const
tbb::atomic< uint64_t > walk_count_
void reset_notify_count()
virtual size_t Size() const
tbb::atomic< uint64_t > walker_count_
DBTableBase(DB *db, const std::string &name)
const std::string & name() const
void incr_walk_again_count()
DBTable::WalkCompleteFn walk_complete() const
WalkState walk_state() const
DBTable::WalkFn walk_fn() const
tbb::atomic< bool > walk_again_
tbb::atomic< WalkState > walk_state_
friend void intrusive_ptr_release(DBTableWalk *walker)
friend void intrusive_ptr_add_ref(DBTableWalk *walker)
DISALLOW_COPY_AND_ASSIGN(DBTableWalk)
DBTable::WalkCompleteFn walk_complete_
DBTableWalk(DBTable *table, DBTable::WalkFn walk_fn, DBTable::WalkCompleteFn walk_complete)
void set_walk_requested()
bool walk_is_active() const
tbb::atomic< int > refcount_
void WalkAgain(DBTableWalkRef walk)
int GetPartitionId(const DBRequestKey *key)
bool InvokeWalkCb(DBTablePartBase *part, DBEntryBase *entry)
virtual bool Delete(DBEntry *entry, const DBRequest *req)
std::unique_ptr< TableWalker > walker_
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const =0
virtual bool OnChange(DBEntry *entry, const DBRequest *req)
virtual void Input(DBTablePartition *tbl_partition, DBClient *client, DBRequest *req)
int max_walk_iteration_to_yield_
static const int kIterationToYield
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
virtual void Change(DBEntryBase *entry)
virtual size_t Size() const
int GetWalkIterationToYield()
DISALLOW_COPY_AND_ASSIGN(DBTable)
void SetWalkTaskId(int task_id)
virtual int PartitionCount() const
void WalkTable(DBTableWalkRef walk)
std::vector< DBTablePartition * > partitions_
DBTable::DBTableWalkRef walk_ref_
int GetPartitionId(const DBEntry *entry)
virtual size_t Hash(const DBRequestKey *key) const
virtual DBTablePartition * AllocPartition(int index)
bool WalkCallback(DBTablePartBase *tpart, DBEntryBase *entry)
DBEntry * Find(const DBEntry *entry)
void ReleaseWalker(DBTableWalkRef &walk)
boost::function< void(DBTableWalkRef, DBTableBase *)> WalkCompleteFn
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
static void DBStateClear(DBTable *table, ListenerId id)
virtual DBEntry * Add(const DBRequest *req)
DBTable(DB *db, const std::string &name)
DBEntry * FindNoLock(const DBEntry *entry)
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
void SetWalkIterationToYield(int count)
void WalkCompleteCallback(DBTableBase *tbl_base)
static void db_walker_wait()
boost::function< bool(DBTablePartBase *, DBEntryBase *)> WalkFn
virtual size_t Hash(const DBEntry *entry) const
void intrusive_ptr_release(DBTableWalk *walker)
void intrusive_ptr_add_ref(DBTableWalk *walker)
DISALLOW_COPY_AND_ASSIGN(DBRequest)
std::unique_ptr< DBRequestKey > key
DBRequest(DBOperation op)
void Swap(DBRequest *rhs)
std::unique_ptr< DBRequestData > data