7 #include <boost/foreach.hpp>
22 #include "bgp/routing-instance/routing_instance_analytics_types.h"
24 using std::ostringstream;
34 #define RPR_TRACE(obj, ...) \
36 if (LoggingDisabled()) break; \
37 bgp_log_test::LogServerName(server()); \
38 Rpr##obj##Log::Send("RoutingInstance", \
39 SandeshLevel::SYS_DEBUG, __FILE__, __LINE__, __VA_ARGS__); \
40 Rpr##obj::TraceMsg(trace_buf_, __FILE__, __LINE__, __VA_ARGS__); \
43 #define RPR_TRACE_ONLY(obj, ...) \
45 if (LoggingDisabled()) break; \
46 bgp_log_test::LogServerName(server()); \
47 Rpr##obj::TraceMsg(trace_buf_, __FILE__, __LINE__, __VA_ARGS__); \
73 : replicator_(replicator),
77 table_delete_ref_(this, table->
deleter()) {
78 assert(table->
deleter() != NULL);
125 GroupList::const_iterator it =
list_.find(group);
126 return (it !=
list_.end() ? *it : NULL);
134 : replicator_(replicator) {
138 ReplicatedRtPathList::const_iterator it) {
139 pair<ReplicatedRtPathList::iterator, bool> result;
141 assert(result.second);
145 ReplicatedRtPathList::const_iterator it) {
156 vector<string> table_list;
201 "RoutePathReplicator");
238 TableStateList::const_iterator loc =
301 tbb::mutex::scoped_lock lock(
mutex_);
320 if (!table->
empty()) {
339 tbb::mutex::scoped_lock lock(
mutex_);
358 if (!table->
empty()) {
377 if (dbstate->
GetList().empty()) {
391 if (asn >
AS2_MAX && vn_index > 0xffff) {
478 bool route_unchanged =
false;
484 uint64_t optimizationThresholdTime = 30ULL * 60 * 1000000;
489 if ( (start - rt->
last_update_at() > optimizationThresholdTime) &&
493 time, optimising replication");
494 route_unchanged =
true;
508 DBStateSync(table, ts, rt, dbstate, &replicated_path_list);
515 if (dbstate == NULL) {
530 if (route_unchanged){
531 replicated_path_list = dbstate->
GetList();
533 replicated_path_list){
534 previousTables.insert(path.
table_);
539 for (Route::PathList::iterator it = rt->
GetPathList().begin();
565 ext_community = extcomm_ptr.get();
588 if (import_list.empty())
590 secondary_tables.insert(import_list.begin(), import_list.end());
598 if (secondary_tables.empty())
608 if (route_unchanged){
612 std::set_difference(secondary_tables.begin(), secondary_tables.end(),
613 previousTables.begin(), previousTables.end(),
614 std::inserter(addedTables, addedTables.end()));
616 secondary_tables = addedTables;
622 BOOST_FOREACH(
BgpTable *dest, secondary_tables) {
645 server_, table, rt, path, new_extcomm_ptr);
653 pair<RtReplicated::ReplicatedRtPathList::iterator, bool> result;
654 result = replicated_path_list.insert(rtinfo);
656 if (!route_unchanged)
657 assert(result.second);
667 DBStateSync(table, ts, rt, dbstate, &replicated_path_list);
687 return vector<string>();
691 return vector<string>();
712 if (rt_secondary->
count() == 0) {
717 partition->
Delete(rt_secondary);
719 partition->
Notify(rt_secondary);
DBTableBase::ListenerId listener_id() const
bool RemoveImportTable(Address::Family family, BgpTable *tbl)
std::set< BgpTable * > RtGroupMemberList
void JoinVpnTable(RtGroup *group)
BgpTable * GetTable(Address::Family fmly)
void WalkTable(DBTableWalkRef walk)
const BgpPath * BestPath() const
const RouteTargetList & GetExportList() const
void NotifyRtGroup(const RouteTarget &rt)
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
bool AddExportTable(Address::Family family, BgpTable *tbl)
int virtual_network_index() const
bool set_synchronize(const SetType *set1, const SetType *set2, AddFunctor add_fn, DelFunctor del_fn)
const RtGroupMemberList & GetExportTables(Address::Family family) const
bool RemoveSecondaryPath(const BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
bool HasDepRoutes() const
virtual BgpRoute * RouteReplicate(BgpServer *server, BgpTable *table, BgpRoute *src, const BgpPath *path, ExtCommunityPtr community)=0
TableState * AddTableState(BgpTable *table, RtGroup *group=NULL)
static std::string PathIdString(uint32_t path_id)
virtual bool IsVpnTable() const
RoutingInstance * routing_instance()
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
ReplicatedRtPathList * GetMutableList()
uint32_t route_count() const
virtual ~RoutePathReplicator()
RoutePathReplicator * replicator()
DBTableWalkRef AllocWalker(WalkFn walk_fn, WalkCompleteFn walk_complete)
void set_listener_id(DBTableBase::ListenerId listener_id)
RoutingInstanceMgr * routing_instance_mgr()
const uint32_t GetPathId() const
const RtGroupMemberList & GetImportTables(Address::Family family) const
void DeleteSecondaryPath(BgpTable *table, BgpRoute *rt, const RtReplicated::SecondaryRouteInfo &rtinfo)
std::string ToString() const
int GetVnIndexByExtCommunity(const ExtCommunity *community) const
RoutingInstance * GetDefaultRoutingInstance()
virtual bool IsReady() const =0
RoutePathReplicator * replicator_
void Delete(DBEntryBase *)
void DBStateSync(BgpTable *table, TableState *ts, BgpRoute *rt, RtReplicated *dbstate, const RtReplicated::ReplicatedRtPathList *future)
uint64_t GetDBStateCount(ListenerId listener)
virtual std::string ToString() const
virtual bool MayDelete() const
void Unregister(ListenerId listener)
void NotifyAllStaticRoutes()
const RtGroup * FindGroup(RtGroup *group) const
void ReleaseWalker(DBTableWalkRef &walk)
const bytes_type & GetExtCommunity() const
bool RouteListener(TableState *ts, DBTablePartBase *root, DBEntryBase *entry)
LifetimeActor * deleter()
boost::scoped_ptr< DeleteActor > deleter_
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
#define RPR_TRACE(obj,...)
void WalkAgain(DBTableWalkRef walk)
TableStateList table_state_list_
const uint64_t last_update_at() const
PathSource GetSource() const
RtGroup * LocateRtGroup(const RouteTarget &rt)
void AddRouteInfo(BgpTable *table, BgpRoute *rt, ReplicatedRtPathList::const_iterator it)
ExtCommunityDB * extcomm_db()
void RemoveRtGroup(const RouteTarget &rt)
virtual const std::string & ToString() const =0
#define CHECK_CONCURRENCY(...)
bool HasVrfTables(Address::Family family) const
std::set< SecondaryRouteInfo > ReplicatedRtPathList
RoutePathReplicator(BgpServer *server, Address::Family family)
ReplicatedRtPathList replicate_list_
void RemoveTableState(BgpTable *table, RtGroup *group)
virtual void UpdateSecondaryTablesForReplication(BgpRoute *rt, TableSet *secondary_tables)
virtual std::string ToString() const =0
std::vector< std::string > GetTableNameList(const BgpPath *path) const
bool HasExportTarget(const ExtCommunity *extcomm) const
bool IsVrfOriginated() const
void DeleteRouteInfo(BgpTable *table, BgpRoute *rt, ReplicatedRtPathList::const_iterator it)
virtual bool IsRouteAggregationSupported() const
const std::string & name() const
int PathCompare(const BgpPath &rhs, bool allow_ecmp) const
bool AddImportTable(Address::Family family, BgpTable *tbl)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
RtGroup * GetRtGroup(const RouteTarget &rt)
std::vector< std::string > GetReplicatedTableNameList(const BgpTable *table, const BgpRoute *route, const BgpPath *path) const
void set_walk_ref(DBTable::DBTableWalkRef walk_ref)
void DeleteTableState(BgpTable *table)
void RequestWalk(BgpTable *table)
DeleteActor(TableState *ts)
const DBTable::DBTableWalkRef & walk_ref() const
bool IsMasterRoutingInstance() const
bool IsContributingRoute(const BgpRoute *route) const
BgpPath * FindSecondaryPath(BgpRoute *src_rt, BgpPath::PathSource src, const IPeer *peer, uint32_t path_id)
const ExtCommunity * ext_community() const
void Join(BgpTable *table, const RouteTarget &rt, bool import)
void BulkReplicationDone(DBTableBase *dbtable)
static ExtCommunityPtr UpdateExtCommunity(BgpServer *server, const RoutingInstance *rtinstance, const ExtCommunity *ext_community, const ExtCommunity::ExtCommunityList &export_list)
static uint64_t UTCTimestampUsec()
void StopPathResolution(int part_id, const BgpPath *path)
const BgpAttr * GetAttr() const
const ReplicatedRtPathList & GetList() const
static const int kInvalidId
std::string ToString() const
LifetimeActor * deleter()
RtReplicated(RoutePathReplicator *replicator)
const bytes_type & GetExtCommunity() const
Address::Family family() const
TableState * FindTableState(BgpTable *table)
void RemoveGroup(RtGroup *group)
bool NeedsResolution() const
static ExtCommunityPtr UpdateOriginVn(BgpServer *server, const ExtCommunity *ext_community, int vn_index)
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
void Notify(DBEntryBase *entry)
bool RemoveExportTable(Address::Family family, BgpTable *tbl)
#define RPR_TRACE_ONLY(obj,...)
void Leave(BgpTable *table, const RouteTarget &rt, bool import)
void LeaveVpnTable(RtGroup *group)
virtual bool IsReplicated() const
void AddGroup(RtGroup *group)
as_t autonomous_system() const
const RtReplicated * GetReplicationState(BgpTable *table, BgpRoute *rt) const
friend class RtReplicated
TableState(RoutePathReplicator *replicator, BgpTable *table)
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
PathResolver * path_resolver()
const PathList & GetPathList() const
RTargetGroupMgr * rtarget_group_mgr()