Skip to content

Commit 68e12bc

Browse files
committed
Not4Review debugging
1 parent d880861 commit 68e12bc

File tree

1 file changed

+134
-69
lines changed

1 file changed

+134
-69
lines changed

Server/src/redis/MsgBusImpl_redis.cpp

Lines changed: 134 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -102,92 +102,157 @@ void MsgBusImpl_redis::update_Peer(obj_bgp_peer &peer, obj_peer_up_event *up, ob
102102
/**
103103
* Abstract method Implementation - See MsgBusInterface.hpp for details
104104
*/
105-
void MsgBusImpl_redis::update_unicastPrefix(obj_bgp_peer &peer, vector<obj_rib> &rib,
106-
obj_path_attr *attr, unicast_prefix_action_code code) {
107-
if (attr == NULL)
105+
void MsgBusImpl_redis::update_unicastPrefix(obj_bgp_peer &peer,
106+
std::vector<obj_rib> &rib,
107+
obj_path_attr *attr,
108+
unicast_prefix_action_code code)
109+
{
110+
if (code == UNICAST_PREFIX_ACTION_ADD && attr == nullptr) {
111+
LOG_INFO("update_unicastPrefix: ADD requested but attr==NULL (peer=%s) — ignoring", peer.peer_addr);
108112
return;
113+
}
114+
115+
const char* actionStr = (code == UNICAST_PREFIX_ACTION_ADD) ? "add" : "del";
116+
117+
std::string ts, path_hash_str, peer_hash_str, router_hash_str;
118+
getTimestamp(peer.timestamp_secs, peer.timestamp_us, ts);
119+
if (attr) hash_toStr(attr->hash_id, path_hash_str);
120+
hash_toStr(peer.hash_id, peer_hash_str);
121+
hash_toStr(peer.router_hash_id, router_hash_str);
122+
123+
LOG_INFO("MsgBusImpl_redis update_unicastPrefix[start] action=%s peer=%s as=%u ts=%s rib_size=%zu isAdjIn=%d isPrePolicy=%d",
124+
actionStr, peer.peer_addr, peer.peer_as, ts.c_str(), rib.size(),
125+
(int)peer.isAdjIn, (int)peer.isPrePolicy);
126+
127+
std::vector<std::string> del_keys;
128+
del_keys.reserve(rib.size());
129+
130+
size_t add_count = 0, del_count = 0;
109131

110-
vector<string> del_keys;
111-
string neigh = peer.peer_addr;
112-
113-
for (size_t i = 0; i < rib.size(); i++) {
114-
// Loop through the vector array of rib entries
115-
vector<swss::FieldValueTuple> addFieldValues;
116-
addFieldValues.reserve(MAX_ATTRIBUTES_COUNT);
117-
118-
// rib table schema as BGP_RIB_OUT_TABLE|192.181.168.0/25|10.0.0.59
119-
vector<string> keys;
120-
string redisMgr_pfx = rib[i].prefix;
121-
redisMgr_pfx += "/";
122-
redisMgr_pfx += to_string(rib[i].prefix_len);
123-
keys.reserve(MAX_ATTRIBUTES_COUNT);
124-
keys.emplace_back(redisMgr_pfx);
132+
for (size_t i = 0; i < rib.size(); ++i) {
133+
// Compose "prefix/len"
134+
std::string pfx_len = std::string(rib[i].prefix) + "/" + std::to_string(rib[i].prefix_len);
135+
136+
// Redis key parts
137+
std::vector<std::string> keys;
138+
keys.reserve(2);
139+
keys.emplace_back(pfx_len);
125140
keys.emplace_back(peer.peer_addr);
126141

127-
switch (code) {
142+
// RIB hash
143+
std::string rib_hash_str;
144+
hash_toStr(rib[i].hash_id, rib_hash_str);
145+
146+
LOG_INFO("MsgBusImpl_redis RIB[%zu] prefix=%s/%d isIPv4=%d path_id=%u labels=%s rib_hash=%s",
147+
i, rib[i].prefix, rib[i].prefix_len, (int)rib[i].isIPv4,
148+
(unsigned)rib[i].path_id, rib[i].labels, rib_hash_str.c_str());
149+
150+
if (code == UNICAST_PREFIX_ACTION_ADD) {
151+
const char* origin = attr->origin; // C-string
152+
const std::string& as_path = attr->as_path; // std::string
153+
uint32_t as_path_count = attr->as_path_count;
154+
uint32_t origin_as = attr->origin_as;
155+
const char* next_hop = attr->next_hop; // C-string
156+
uint32_t med = attr->med;
157+
uint32_t local_pref = attr->local_pref;
158+
const char* aggregator = attr->aggregator; // C-string
159+
const std::string& comm = attr->community_list; // std::string
160+
const std::string& ext_comm = attr->ext_community_list;// std::string
161+
const char* cluster_list = attr->cluster_list; // C-string
162+
int atomic_agg = (int)attr->atomic_agg;
163+
int nexthop_isIPv4 = (int)attr->nexthop_isIPv4;
164+
const char* originator_id = attr->originator_id; // C-string
165+
uint32_t path_id = rib[i].path_id;
166+
const char* labels = rib[i].labels; // C-string
167+
int isPrePolicy = (int)peer.isPrePolicy;
168+
int isAdjIn = (int)peer.isAdjIn;
169+
const std::string& large_comm= attr->large_community_list;
128170

129-
case UNICAST_PREFIX_ACTION_ADD:
130171
{
131-
addFieldValues.emplace_back(make_pair("origin", string(attr->origin)));
132-
addFieldValues.emplace_back(make_pair("as_path", attr->as_path));
133-
stringstream as_path_count;
134-
as_path_count << attr->as_path_count;
135-
addFieldValues.emplace_back(make_pair("as_path_count", as_path_count.str()));
136-
stringstream origin_as;
137-
origin_as << attr->origin_as;
138-
addFieldValues.emplace_back(make_pair("origin_as", origin_as.str()));
139-
addFieldValues.emplace_back(make_pair("next_hop", string(attr->next_hop)));
140-
stringstream local_pref;
141-
local_pref << attr->local_pref;
142-
addFieldValues.emplace_back(make_pair("local_pref", local_pref.str()));
143-
addFieldValues.emplace_back(make_pair("community_list", attr->community_list));
144-
addFieldValues.emplace_back(make_pair("ext_community_list", attr->ext_community_list));
145-
addFieldValues.emplace_back(make_pair("large_community_list", attr->large_community_list));
146-
addFieldValues.emplace_back(make_pair("originator_id", string(attr->originator_id)));
147-
148-
for (const auto& fieldValue : addFieldValues) {
149-
const std::string& field = std::get<0>(fieldValue);
150-
const std::string& value = std::get<1>(fieldValue);
151-
DEBUG("MsgBusImpl_redis update_unicastPrefix field = %s, value = %s", field.c_str(), value.c_str());
152-
}
153-
if(peer.isAdjIn)
154-
{
155-
redisMgr_.WriteBMPTable(BMP_TABLE_RIB_IN, keys, addFieldValues);
156-
}
157-
else
158-
{
159-
redisMgr_.WriteBMPTable(BMP_TABLE_RIB_OUT, keys, addFieldValues);
160-
}
172+
char raw[4096];
173+
std::snprintf(raw, sizeof(raw),
174+
"%s\t%llu\t%s\t%s\t%s\t%s\t%s\t%" PRIu32 "\t%s\t%s\t%d\t%d\t%s\t%s\t%u\t%u\t%s\t%u\t%u\t%s\t%s\t%s\t%s\t%d\t%d\t%s\t%u\t%s\t%d\t%d\t%s",
175+
actionStr,
176+
(unsigned long long)0, /* seq if you have one */
177+
rib_hash_str.c_str(), router_hash_str.c_str(),
178+
path_hash_str.c_str(), peer_hash_str.c_str(),
179+
peer.peer_addr,
180+
(unsigned)peer.peer_as, ts.c_str(),
181+
rib[i].prefix, rib[i].prefix_len, (int)rib[i].isIPv4,
182+
origin, as_path.c_str(), as_path_count,
183+
origin_as, next_hop, med, local_pref,
184+
aggregator, comm.c_str(), ext_comm.c_str(), cluster_list,
185+
atomic_agg, nexthop_isIPv4,
186+
originator_id, path_id,
187+
labels, isPrePolicy, isAdjIn,
188+
large_comm.c_str());
189+
190+
LOG_INFO("RAW_LINE[%zu]=%s", i, raw);
161191
}
162-
break;
163192

164-
case UNICAST_PREFIX_ACTION_DEL:
165-
{
166-
string com_key;
167-
if(peer.isAdjIn)
168-
{
169-
com_key = BMP_TABLE_RIB_IN;
170-
}
171-
else
172-
{
173-
com_key = BMP_TABLE_RIB_OUT;
174-
}
175-
com_key += redisMgr_.GetKeySeparator();
176-
com_key += redisMgr_pfx;
177-
com_key += redisMgr_.GetKeySeparator();
178-
com_key += neigh;
179-
del_keys.push_back(com_key);
180-
}
181-
break;
193+
194+
std::vector<swss::FieldValueTuple> fvs;
195+
fvs.reserve(32);
196+
fvs.emplace_back(std::make_pair("origin", std::string(origin)));
197+
fvs.emplace_back(std::make_pair("as_path", as_path));
198+
fvs.emplace_back(std::make_pair("as_path_count", std::to_string(as_path_count)));
199+
fvs.emplace_back(std::make_pair("origin_as", std::to_string(origin_as)));
200+
fvs.emplace_back(std::make_pair("next_hop", std::string(next_hop)));
201+
fvs.emplace_back(std::make_pair("med", std::to_string(med)));
202+
fvs.emplace_back(std::make_pair("local_pref", std::to_string(local_pref)));
203+
fvs.emplace_back(std::make_pair("aggregator", std::string(aggregator)));
204+
fvs.emplace_back(std::make_pair("community_list", comm));
205+
fvs.emplace_back(std::make_pair("ext_community_list", ext_comm));
206+
fvs.emplace_back(std::make_pair("cluster_list", std::string(cluster_list)));
207+
fvs.emplace_back(std::make_pair("atomic_agg", std::to_string(atomic_agg)));
208+
fvs.emplace_back(std::make_pair("nexthop_isIPv4", std::to_string(nexthop_isIPv4)));
209+
fvs.emplace_back(std::make_pair("originator_id", std::string(originator_id)));
210+
fvs.emplace_back(std::make_pair("large_community_list", large_comm));
211+
212+
// RIB & peer context; hashes & ts
213+
fvs.emplace_back(std::make_pair("path_id", std::to_string(path_id)));
214+
fvs.emplace_back(std::make_pair("labels", std::string(labels)));
215+
fvs.emplace_back(std::make_pair("isIPv4", std::to_string((int)rib[i].isIPv4)));
216+
fvs.emplace_back(std::make_pair("peer_as", std::to_string(peer.peer_as)));
217+
fvs.emplace_back(std::make_pair("isPrePolicy", std::to_string(isPrePolicy)));
218+
fvs.emplace_back(std::make_pair("isAdjIn", std::to_string(isAdjIn)));
219+
fvs.emplace_back(std::make_pair("rib_hash", rib_hash_str));
220+
fvs.emplace_back(std::make_pair("path_hash", path_hash_str));
221+
fvs.emplace_back(std::make_pair("peer_hash", peer_hash_str));
222+
fvs.emplace_back(std::make_pair("router_hash", router_hash_str));
223+
fvs.emplace_back(std::make_pair("ts", ts));
224+
225+
226+
const char* table = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
227+
LOG_INFO("MsgBusImpl_redis ADD -> table=%s key=%s|%s fields_count=%zu",
228+
table, pfx_len.c_str(), peer.peer_addr, fvs.size());
229+
230+
if (peer.isAdjIn)
231+
redisMgr_.WriteBMPTable(BMP_TABLE_RIB_IN, keys, fvs);
232+
else
233+
redisMgr_.WriteBMPTable(BMP_TABLE_RIB_OUT, keys, fvs);
234+
235+
++add_count;
236+
} else {
237+
std::string com_key = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
238+
com_key += redisMgr_.GetKeySeparator() + pfx_len;
239+
com_key += redisMgr_.GetKeySeparator() + peer.peer_addr;
240+
LOG_INFO("MsgBusImpl_redis DEL -> key=%s", com_key.c_str());
241+
del_keys.push_back(com_key);
242+
++del_count;
182243
}
183244
}
184245

185246
if (!del_keys.empty()) {
247+
LOG_INFO("MsgBusImpl_redis RemoveEntityFromBMPTable count=%zu", del_keys.size());
186248
redisMgr_.RemoveEntityFromBMPTable(del_keys);
187249
}
250+
251+
LOG_INFO("MsgBusImpl_redis update_unicastPrefix[done] action=%s adds=%zu dels=%zu", actionStr, add_count, del_count);
188252
}
189253

190254

255+
191256
/**
192257
* Abstract method Implementation - See MsgBusInterface.hpp for details
193258
*/

0 commit comments

Comments
 (0)