From: Numan Siddique <num...@ovn.org> A sset is maintained in the 'struct local_datapath' of the logical ports claimed for it. A later patch will make use of this to check if a local_datapath is still relevant to the chassis or not.
Signed-off-by: Numan Siddique <num...@ovn.org> --- controller/binding.c | 84 ++++++++++++++++++++++++++--------------- controller/local_data.c | 14 ++++--- controller/local_data.h | 4 +- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/controller/binding.c b/controller/binding.c index cbd7749494..c76a0c06c5 100644 --- a/controller/binding.c +++ b/controller/binding.c @@ -1351,6 +1351,7 @@ is_postponed_port(const char *port_name) */ static bool claim_lport(const struct sbrec_port_binding *pb, + struct local_datapath *ld, const struct sbrec_port_binding *parent_pb, const struct sbrec_chassis *chassis_rec, const struct ovsrec_interface *iface_rec, @@ -1362,6 +1363,10 @@ claim_lport(const struct sbrec_port_binding *pb, { bool update_tracked = false; + if (ld) { + sset_add(&ld->claimed_lports, pb->logical_port); + } + if (can_bind == CAN_BIND_AS_MAIN) { if (pb->chassis != chassis_rec) { long long int now = time_msec(); @@ -1489,6 +1494,7 @@ release_lport_additional_chassis(const struct sbrec_port_binding *pb, static bool release_lport(const struct sbrec_port_binding *pb, + struct local_datapath *ld, const struct sbrec_chassis *chassis_rec, bool sb_readonly, struct hmap *tracked_datapaths, struct if_status_mgr *if_mgr) { @@ -1505,6 +1511,10 @@ release_lport(const struct sbrec_port_binding *pb, } update_lport_tracking(pb, tracked_datapaths, false); if_status_mgr_release_iface(if_mgr, pb->logical_port); + + if (ld) { + sset_find_and_delete(&ld->claimed_lports, pb->logical_port); + } return true; } @@ -1548,7 +1558,11 @@ release_binding_lport(const struct sbrec_chassis *chassis_rec, remove_related_lport(b_lport->pb, b_ctx_out); } if (is_binding_lport_this_chassis(b_lport, chassis_rec)) { - if (!release_lport(b_lport->pb, chassis_rec, sb_readonly, + struct local_datapath *ld = + get_local_datapath(b_ctx_out->local_datapaths, + b_lport->pb->datapath->tunnel_key); + + if (!release_lport(b_lport->pb, ld, chassis_rec, sb_readonly, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr)) { return false; @@ -1574,7 +1588,15 @@ consider_vif_lport_(const struct sbrec_port_binding *pb, const struct sbrec_port_binding *parent_pb = binding_lport_get_parent_pb(b_lport); - if (!claim_lport(pb, parent_pb, b_ctx_in->chassis_rec, + struct local_datapath *ld = + add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key, + b_ctx_in->sbrec_port_binding_by_datapath, + b_ctx_in->sbrec_port_binding_by_name, + pb->datapath, b_ctx_in->chassis_rec, + b_ctx_out->local_datapaths, + b_ctx_out->tracked_dp_bindings); + + if (!claim_lport(pb, ld, parent_pb, b_ctx_in->chassis_rec, b_lport->lbinding->iface, !b_ctx_in->ovnsb_idl_txn, !parent_pb, b_ctx_out->tracked_dp_bindings, @@ -1583,12 +1605,6 @@ consider_vif_lport_(const struct sbrec_port_binding *pb, return false; } - add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key, - b_ctx_in->sbrec_port_binding_by_datapath, - b_ctx_in->sbrec_port_binding_by_name, - pb->datapath, b_ctx_in->chassis_rec, - b_ctx_out->local_datapaths, - b_ctx_out->tracked_dp_bindings); update_related_lport(pb, b_ctx_out); update_local_lports(pb->logical_port, b_ctx_out); if (binding_lport_update_port_sec(b_lport, pb) && @@ -1625,7 +1641,10 @@ consider_vif_lport_(const struct sbrec_port_binding *pb, if (!lbinding_set || !can_bind) { remove_related_lport(pb, b_ctx_out); - return release_lport(pb, b_ctx_in->chassis_rec, + struct local_datapath *ld = + get_local_datapath(b_ctx_out->local_datapaths, + pb->datapath->tunnel_key); + return release_lport(pb, ld, b_ctx_in->chassis_rec, !b_ctx_in->ovnsb_idl_txn, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr); @@ -1761,7 +1780,10 @@ consider_container_lport(const struct sbrec_port_binding *pb, * if it was bound earlier. */ if (is_binding_lport_this_chassis(container_b_lport, b_ctx_in->chassis_rec)) { - return release_lport(pb, b_ctx_in->chassis_rec, + struct local_datapath *ld = + get_local_datapath(b_ctx_out->local_datapaths, + pb->datapath->tunnel_key); + return release_lport(pb, ld, b_ctx_in->chassis_rec, !b_ctx_in->ovnsb_idl_txn, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr); @@ -1900,12 +1922,12 @@ consider_nonvif_lport_(const struct sbrec_port_binding *pb, if (our_chassis) { update_local_lports(pb->logical_port, b_ctx_out); if (!ld) { - add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key, - b_ctx_in->sbrec_port_binding_by_datapath, - b_ctx_in->sbrec_port_binding_by_name, - pb->datapath, b_ctx_in->chassis_rec, - b_ctx_out->local_datapaths, - b_ctx_out->tracked_dp_bindings); + ld = add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key, + b_ctx_in->sbrec_port_binding_by_datapath, + b_ctx_in->sbrec_port_binding_by_name, + pb->datapath, b_ctx_in->chassis_rec, + b_ctx_out->local_datapaths, + b_ctx_out->tracked_dp_bindings); } else { /* Add the peer datapath to the local datapaths if it's * not present yet. @@ -1926,7 +1948,7 @@ consider_nonvif_lport_(const struct sbrec_port_binding *pb, update_related_lport(pb, b_ctx_out); enum can_bind can_bind = lport_can_bind_on_this_chassis( b_ctx_in->chassis_rec, pb); - return claim_lport(pb, NULL, b_ctx_in->chassis_rec, NULL, + return claim_lport(pb, ld, NULL, b_ctx_in->chassis_rec, NULL, !b_ctx_in->ovnsb_idl_txn, false, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr, @@ -1940,10 +1962,10 @@ consider_nonvif_lport_(const struct sbrec_port_binding *pb, || is_additional_chassis(pb, b_ctx_in->chassis_rec) || if_status_is_port_claimed(b_ctx_out->if_mgr, pb->logical_port)) { - if (!release_lport(pb, b_ctx_in->chassis_rec, - !b_ctx_in->ovnsb_idl_txn, - b_ctx_out->tracked_dp_bindings, - b_ctx_out->if_mgr)) { + if (!release_lport(pb, ld, b_ctx_in->chassis_rec, + !b_ctx_in->ovnsb_idl_txn, + b_ctx_out->tracked_dp_bindings, + b_ctx_out->if_mgr)) { return false; } @@ -2839,9 +2861,9 @@ handle_deleted_vif_lport(const struct sbrec_port_binding *pb, struct binding_ctx_in *b_ctx_in, struct binding_ctx_out *b_ctx_out) { + struct shash *binding_lports = &b_ctx_out->lbinding_data->lports; struct local_binding *lbinding = NULL; - struct shash *binding_lports = &b_ctx_out->lbinding_data->lports; struct binding_lport *b_lport = binding_lport_find(binding_lports, pb->logical_port); if (b_lport) { lbinding = b_lport->lbinding; @@ -2966,13 +2988,13 @@ consider_patch_port_for_local_datapaths(const struct sbrec_port_binding *pb, if (peer_ld && need_add_peer_to_local( b_ctx_in->sbrec_port_binding_by_name, peer, b_ctx_in->chassis_rec)) { - add_local_datapath( - b_ctx_in->sbrec_datapath_binding_by_key, - b_ctx_in->sbrec_port_binding_by_datapath, - b_ctx_in->sbrec_port_binding_by_name, - pb->datapath, b_ctx_in->chassis_rec, - b_ctx_out->local_datapaths, - b_ctx_out->tracked_dp_bindings); + ld = add_local_datapath( + b_ctx_in->sbrec_datapath_binding_by_key, + b_ctx_in->sbrec_port_binding_by_datapath, + b_ctx_in->sbrec_port_binding_by_name, + pb->datapath, b_ctx_in->chassis_rec, + b_ctx_out->local_datapaths, + b_ctx_out->tracked_dp_bindings); } } else { /* Add the peer datapath to the local datapaths if it's @@ -2993,7 +3015,7 @@ consider_patch_port_for_local_datapaths(const struct sbrec_port_binding *pb, /* If this chassis is requested - try to claim. */ if (pb->requested_chassis == b_ctx_in->chassis_rec) { - return claim_lport(pb, NULL, b_ctx_in->chassis_rec, NULL, + return claim_lport(pb, ld, NULL, b_ctx_in->chassis_rec, NULL, !b_ctx_in->ovnsb_idl_txn, false, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr, @@ -3007,7 +3029,7 @@ consider_patch_port_for_local_datapaths(const struct sbrec_port_binding *pb, || if_status_is_port_claimed(b_ctx_out->if_mgr, pb->logical_port)) { remove_local_lports(pb->logical_port, b_ctx_out); - if (!release_lport(pb, b_ctx_in->chassis_rec, + if (!release_lport(pb, ld, b_ctx_in->chassis_rec, !b_ctx_in->ovnsb_idl_txn, b_ctx_out->tracked_dp_bindings, b_ctx_out->if_mgr)) { diff --git a/controller/local_data.c b/controller/local_data.c index 4aee39d6b2..24e871f639 100644 --- a/controller/local_data.c +++ b/controller/local_data.c @@ -88,6 +88,7 @@ local_datapath_alloc(const struct sbrec_datapath_binding *dp) ld->is_transit_switch = datapath_is_transit_switch(dp); shash_init(&ld->external_ports); shash_init(&ld->multichassis_ports); + sset_init(&ld->claimed_lports); /* memory accounting - common part. */ local_datapath_usage += sizeof *ld; @@ -127,6 +128,7 @@ local_datapath_destroy(struct local_datapath *ld) free(ld->peer_ports); shash_destroy(&ld->external_ports); shash_destroy(&ld->multichassis_ports); + sset_destroy(&ld->claimed_lports); free(ld); } @@ -180,7 +182,7 @@ need_add_peer_to_local( return false; } -void +struct local_datapath * add_local_datapath(struct ovsdb_idl_index *sbrec_datapath_binding_by_key, struct ovsdb_idl_index *sbrec_port_binding_by_datapath, struct ovsdb_idl_index *sbrec_port_binding_by_name, @@ -189,11 +191,11 @@ add_local_datapath(struct ovsdb_idl_index *sbrec_datapath_binding_by_key, struct hmap *local_datapaths, struct hmap *tracked_datapaths) { - add_local_datapath__(sbrec_datapath_binding_by_key, - sbrec_port_binding_by_datapath, - sbrec_port_binding_by_name, 0, - dp, chassis, local_datapaths, - tracked_datapaths); + return add_local_datapath__(sbrec_datapath_binding_by_key, + sbrec_port_binding_by_datapath, + sbrec_port_binding_by_name, 0, + dp, chassis, local_datapaths, + tracked_datapaths); } void diff --git a/controller/local_data.h b/controller/local_data.h index 1d60dada86..d2eb33b1eb 100644 --- a/controller/local_data.h +++ b/controller/local_data.h @@ -63,6 +63,8 @@ struct local_datapath { struct shash external_ports; struct shash multichassis_ports; + + struct sset claimed_lports; }; struct local_datapath *local_datapath_alloc( @@ -78,7 +80,7 @@ need_add_peer_to_local( struct ovsdb_idl_index *sbrec_port_binding_by_name, const struct sbrec_port_binding *, const struct sbrec_chassis *); -void add_local_datapath( +struct local_datapath * add_local_datapath( struct ovsdb_idl_index *sbrec_datapath_binding_by_key, struct ovsdb_idl_index *sbrec_port_binding_by_datapath, struct ovsdb_idl_index *sbrec_port_binding_by_name, -- 2.48.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev