11 #ifndef __SANDESH_STATE_MACHINE_H__
12 #define __SANDESH_STATE_MACHINE_H__
14 #include <boost/asio.hpp>
15 #include <boost/ptr_container/ptr_map.hpp>
16 #include <boost/statechart/state_machine.hpp>
17 #include <tbb/mutex.h>
18 #include <tbb/atomic.h>
24 #include <sandesh/sandesh_statistics.h>
26 namespace sc = boost::statechart;
50 class SandeshStateMachineStats;
51 class SandeshGeneratorStats;
58 public sc::state_machine<SandeshStateMachine, ssm::Idle> {
71 template <
class Ev>
void OnIdle(
const Ev &event);
126 tbb::mutex::scoped_lock lock(
smutex_);
131 tbb::mutex::scoped_lock lock(
smutex_);
135 tbb::mutex::scoped_lock lock(
smutex_);
155 SandeshGeneratorBasicStats &basic_msg_stats);
157 SandeshGeneratorBasicStats *basic_msg_stats);
159 SandeshGeneratorStats &detail_msg_stats);
161 SandeshGeneratorStats *detail_msg_stats);
169 boost::intrusive_ptr<const sc::event_base>
event;
182 template <
typename Ev>
void Enqueue(
const Ev &event);
184 bool LogEvent(
const sc::event_base *event);
193 void UpdateEventStats(
const sc::event_base &event,
bool enqueue,
bool fail);
SandeshMessageStatistics message_stats_
void GetDetailMessageStatistics(SandeshGeneratorStats *detail_msg_stats)
DISALLOW_COPY_AND_ASSIGN(SandeshStateMachine)
void ResourceUpdate(bool rsc)
friend class SandeshClientStateMachineTest
bool GetDetailStatistics(SandeshStateMachineStats *sm_stats, SandeshGeneratorStats *detail_msg_stats)
void UpdateEventDequeueFail(const sc::event_base &event)
void set_state(ssm::SsmState state)
void UpdateEventEnqueueFail(const sc::event_base &event)
void GetBasicMessageStatistics(SandeshGeneratorBasicStats *basic_msg_stats)
bool GetStatistics(SandeshStateMachineStats &sm_stats, SandeshGeneratorBasicStats &basic_msg_stats)
size_t GetMaxQueueCount() const
void IdleHoldTimerFired()
bool OnSandeshMessage(SandeshSession *session, const std::string &msg)
bool get_resource() const
WorkQueue< EventContainer > EventQueue
void ReleaseSandesh(const Ev &event)
void SetDeferDequeue(bool defer)
void SetDeferSessionReader(bool defer_reader)
void set_resource(bool r)
int idle_hold_time() const
void ResetQueueWaterMarkInfo()
void StartIdleHoldTimer()
void reset_idle_hold_time()
void SetGeneratorKey(const std::string &generator)
void GetEventStatistics(SandeshStateMachineStats *sm_stats)
bool IdleHoldTimerRunning()
void set_session(SandeshSession *session)
bool GetBasicStatistics(SandeshStateMachineStats *sm_stats, SandeshGeneratorBasicStats *basic_msg_stats)
SandeshStateMachine(const char *prefix, SandeshConnection *connection)
SandeshConnection * connection_
SandeshConnection * connection()
void UpdateEventDequeue(const sc::event_base &event)
void set_last_event(const std::string &event)
bool LogEvent(const sc::event_base *event)
void SetAdminState(bool down)
ssm::SsmState last_state_
std::string generator_key_
SandeshSession * session()
void UpdateEventEnqueue(const sc::event_base &event)
void PassiveOpen(SandeshSession *session)
void UpdateRxMsgStats(const std::string &msg_name, size_t msg_size)
const std::string & generator_key() const
const std::string & LastStateName() const
void DeleteTcpSession(const Ev &event)
void ProcessMessage(const Ev &event)
void UpdateRxMsgFailStats(const std::string &msg_name, size_t msg_size, SandeshRxDropReason::type dreason)
static const int kIdleHoldTime
void OnSessionEvent(TcpSession *session, TcpSession::Event event)
friend bool GetEvSandeshMessageRecvSize(EventContainer *ec, size_t *msg_size)
SandeshEventStatistics event_stats_
void OnIdle(const Ev &event)
friend class SandeshServerStateMachineTest
tbb::atomic< ssm::SsmState > state_
SandeshMessageBuilder * builder_
bool DequeueEvent(EventContainer ec)
const std::string last_event() const
void SetQueueWaterMarkInfo(Sandesh::QueueWaterMarkInfo &wm)
void SandeshUVESend(SandeshUVE *usnh)
SandeshSession * session_
void TimerErrorHandler(std::string name, std::string error)
ssm::SsmState get_state() const
void CancelIdleHoldTimer()
void DeleteSession(SandeshSession *session)
bool GetQueueCount(uint64_t &queue_count) const
void set_idle_hold_time(int idle_hold_time)
void unconsumed_event(const sc::event_base &event)
bool IdleHoldTimerExpired()
const std::string & StateName() const
SandeshLevel::type message_drop_level_
static const int kQueueSize
bool GetMessageDropLevel(std::string &drop_level) const
void Enqueue(const Ev &event)
void UpdateEventStats(const sc::event_base &event, bool enqueue, bool fail)
void SetSandeshMessageDropLevel(size_t queue_count, SandeshLevel::type level, boost::function< void(void)> cb)
boost::tuple< size_t, SandeshLevel::type, bool, bool > QueueWaterMarkInfo
size_t AtomicDecrementQueueCount(EventContainer *entry)
size_t AtomicIncrementQueueCount(EventContainer *entry)
size_t max_queue_len() const
boost::function< bool(SandeshStateMachine *)> EvValidate
boost::function< bool(StateMachine *)> EvValidate
boost::intrusive_ptr< const sc::event_base > event
EventContainer(const EventContainer &)=default
static uint64_t UTCTimestampUsec()