@@ -102,89 +102,137 @@ 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+ // Only require attr for ADD, not for DEL
111+ if (code == UNICAST_PREFIX_ACTION_ADD && attr == NULL ) {
112+ LOG_INFO (" MsgBusImpl_redis update_unicastPrefix: ADD requested but attr == NULL (peer=%s) — ignoring" , peer.peer_addr );
108113 return ;
114+ }
115+
116+ const char * actionStr = (code == UNICAST_PREFIX_ACTION_ADD) ? " add" : " del" ;
117+
118+ // Timestamp, like Kafka path
119+ std::string ts;
120+ getTimestamp (peer.timestamp_secs , peer.timestamp_us , ts);
109121
110- vector<string> del_keys;
111- string neigh = peer.peer_addr ;
122+ // Optional hashes (parity with Kafka; computed/available in caller or elsewhere)
123+ std::string path_hash_str, peer_hash_str, router_hash_str;
124+ if (attr) hash_toStr (attr->hash_id , path_hash_str);
125+ hash_toStr (peer.hash_id , peer_hash_str);
126+ hash_toStr (peer.router_hash_id , router_hash_str);
112127
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);
128+ LOG_INFO (" MsgBusImpl_redis update_unicastPrefix[start] action=%s peer=%s as=%u ts=%s rib_size=%zu isAdjIn=%d isPrePolicy=%d" ,
129+ actionStr, peer.peer_addr , peer.peer_as , ts.c_str (), rib.size (),
130+ (int )peer.isAdjIn , (int )peer.isPrePolicy );
117131
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 ;
132+ std::vector<std::string> del_keys;
133+ del_keys.reserve (rib.size ());
134+
135+ const std::string neigh = peer.peer_addr ;
136+ size_t add_count = 0 , del_count = 0 ;
137+
138+ for (size_t i = 0 ; i < rib.size (); ++i) {
139+ // Key parts: "prefix/len" + neighbor
140+ std::string redisMgr_pfx = rib[i].prefix ;
121141 redisMgr_pfx += " /" ;
122- redisMgr_pfx += to_string (rib[i].prefix_len );
123- keys.reserve (MAX_ATTRIBUTES_COUNT);
142+ redisMgr_pfx += std::to_string (rib[i].prefix_len );
143+
144+ std::vector<std::string> keys;
145+ keys.reserve (2 );
124146 keys.emplace_back (redisMgr_pfx);
125- keys.emplace_back (peer. peer_addr );
147+ keys.emplace_back (neigh );
126148
127- switch (code) {
149+ // RIB hash (if present on the entry)
150+ std::string rib_hash_str;
151+ hash_toStr (rib[i].hash_id , rib_hash_str); // safe even if zeros
152+
153+ LOG_INFO (" MsgBusImpl_redis RIB[%zu] prefix=%s/%d isIPv4=%d path_id=%u labels=%s rib_hash=%s" ,
154+ i, rib[i].prefix , rib[i].prefix_len , (int )rib[i].isIPv4 ,
155+ (unsigned )rib[i].path_id , rib[i].labels , rib_hash_str.c_str ());
128156
157+ switch (code) {
129158 case UNICAST_PREFIX_ACTION_ADD:
130159 {
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);
160+ std::vector<swss::FieldValueTuple> fvs;
161+ fvs.reserve (32 );
162+
163+ fvs.emplace_back (std::make_pair (" prefix" , std::string (rib[i].prefix )));
164+ fvs.emplace_back (std::make_pair (" prefix_len" , std::to_string (rib[i].prefix_len )));
165+
166+ fvs.emplace_back (std::make_pair (" origin" , std::string (attr->origin )));
167+ fvs.emplace_back (std::make_pair (" as_path" , attr->as_path ));
168+ fvs.emplace_back (std::make_pair (" as_path_count" , std::to_string (attr->as_path_count )));
169+ fvs.emplace_back (std::make_pair (" origin_as" , std::to_string (attr->origin_as )));
170+ fvs.emplace_back (std::make_pair (" next_hop" , std::string (attr->next_hop )));
171+ fvs.emplace_back (std::make_pair (" med" , std::to_string (attr->med )));
172+ fvs.emplace_back (std::make_pair (" local_pref" , std::to_string (attr->local_pref )));
173+ fvs.emplace_back (std::make_pair (" aggregator" , std::string (attr->aggregator )));
174+ fvs.emplace_back (std::make_pair (" community_list" , attr->community_list ));
175+ fvs.emplace_back (std::make_pair (" ext_community_list" , attr->ext_community_list ));
176+ fvs.emplace_back (std::make_pair (" cluster_list" , attr->cluster_list ));
177+ fvs.emplace_back (std::make_pair (" atomic_agg" , std::to_string (attr->atomic_agg )));
178+ fvs.emplace_back (std::make_pair (" nexthop_isIPv4" , std::to_string ((int )attr->nexthop_isIPv4 )));
179+ fvs.emplace_back (std::make_pair (" originator_id" , std::string (attr->originator_id )));
180+ fvs.emplace_back (std::make_pair (" large_community_list" ,attr->large_community_list ));
181+
182+ // RIB-derived
183+ fvs.emplace_back (std::make_pair (" path_id" , std::to_string (rib[i].path_id )));
184+ fvs.emplace_back (std::make_pair (" labels" , std::string (rib[i].labels )));
185+ fvs.emplace_back (std::make_pair (" isIPv4" , std::to_string ((int )rib[i].isIPv4 )));
186+
187+ // Peer/context
188+ fvs.emplace_back (std::make_pair (" peer_as" , std::to_string (peer.peer_as )));
189+ fvs.emplace_back (std::make_pair (" isPrePolicy" , std::to_string ((int )peer.isPrePolicy )));
190+ fvs.emplace_back (std::make_pair (" isAdjIn" , std::to_string ((int )peer.isAdjIn )));
191+
192+
193+ // Existing DEBUG per field (retain or drop)
194+ for (const auto & fv : fvs) {
195+ LOG_INFO (" MsgBusImpl_redis update_unicastPrefix field = %s, value = %s" ,
196+ std::get<0 >(fv).c_str (), std::get<1 >(fv).c_str ());
156197 }
198+
199+ const char * table = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
200+ const std::string full_key = std::string (table)
201+ + redisMgr_.GetKeySeparator () + redisMgr_pfx
202+ + redisMgr_.GetKeySeparator () + neigh;
203+
204+ LOG_INFO (" MsgBusImpl_redis ADD -> table=%s key=%s fields_count=%zu" , table, full_key.c_str (), fvs.size ());
205+
206+ if (peer.isAdjIn )
207+ redisMgr_.WriteBMPTable (BMP_TABLE_RIB_IN, keys, fvs);
157208 else
158- {
159- redisMgr_.WriteBMPTable (BMP_TABLE_RIB_OUT, keys, addFieldValues);
160- }
161- }
162- break ;
209+ redisMgr_.WriteBMPTable (BMP_TABLE_RIB_OUT, keys, fvs);
210+
211+ ++add_count;
212+ } break ;
163213
164214 case UNICAST_PREFIX_ACTION_DEL:
165215 {
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- }
216+ std::string com_key = peer.isAdjIn ? BMP_TABLE_RIB_IN : BMP_TABLE_RIB_OUT;
175217 com_key += redisMgr_.GetKeySeparator ();
176218 com_key += redisMgr_pfx;
177219 com_key += redisMgr_.GetKeySeparator ();
178220 com_key += neigh;
221+
222+ LOG_INFO (" DEL -> key=%s" , com_key.c_str ());
179223 del_keys.push_back (com_key);
180- }
181- break ;
224+ ++del_count;
225+ } break ;
182226 }
183227 }
184228
185229 if (!del_keys.empty ()) {
230+ LOG_INFO (" RemoveEntityFromBMPTable count=%zu" , del_keys.size ());
186231 redisMgr_.RemoveEntityFromBMPTable (del_keys);
187232 }
233+
234+ LOG_INFO (" MsgBusImpl_redis end update_unicastPrefix[done] action=%s rib_size=%zu adds=%zu dels=%zu peer=%s as=%u ts=%s" ,
235+ actionStr, rib.size (), add_count, del_count, peer.peer_addr , peer.peer_as , ts.c_str ());
188236}
189237
190238
0 commit comments