On Fri, Oct 18, 2024 at 4:18 PM Mark Michelson <[email protected]> wrote: > > Acked-by: Mark Michelson <[email protected]>
This patch needs a rebase. Numan > > On 10/18/24 06:09, Ales Musil wrote: > > The NB DNS has exactly one corresponding row in SB database. > > Use the NB UUID for the SB representation which makes the processing easier > > and the link between the rows is obvious at first glance. > > > > Signed-off-by: Ales Musil <[email protected]> > > --- > > controller/pinctrl.c | 76 ++++++++++++++++++++++++-------------------- > > northd/northd.c | 21 +++--------- > > 2 files changed, 45 insertions(+), 52 deletions(-) > > > > diff --git a/controller/pinctrl.c b/controller/pinctrl.c > > index b891435c1..8a681ede7 100644 > > --- a/controller/pinctrl.c > > +++ b/controller/pinctrl.c > > @@ -3273,6 +3273,8 @@ put_be32(struct ofpbuf *buf, ovs_be32 x) > > } > > > > struct dns_data { > > + struct hmap_node hmap_node; > > + struct uuid uuid; > > uint64_t *dps; > > size_t n_dps; > > struct smap records; > > @@ -3280,7 +3282,20 @@ struct dns_data { > > bool delete; > > }; > > > > -static struct shash dns_cache = SHASH_INITIALIZER(&dns_cache); > > +static struct hmap dns_cache = HMAP_INITIALIZER(&dns_cache); > > + > > +static struct dns_data * > > +dns_cache_find_data(const struct uuid *uuid) > > +{ > > + struct dns_data *dns_data; > > + size_t hash = uuid_hash(uuid); > > + HMAP_FOR_EACH_WITH_HASH (dns_data, hmap_node, hash, &dns_cache) { > > + if (uuid_equals(&dns_data->uuid, uuid)) { > > + return dns_data; > > + } > > + } > > + return NULL; > > +} > > > > /* Called by pinctrl_run(). Runs within the main ovn-controller > > * thread context. */ > > @@ -3288,25 +3303,20 @@ static void > > sync_dns_cache(const struct sbrec_dns_table *dns_table) > > OVS_REQUIRES(pinctrl_mutex) > > { > > - struct shash_node *iter; > > - SHASH_FOR_EACH (iter, &dns_cache) { > > - struct dns_data *d = iter->data; > > - d->delete = true; > > + struct dns_data *dns_data; > > + HMAP_FOR_EACH (dns_data, hmap_node, &dns_cache) { > > + dns_data->delete = true; > > } > > > > const struct sbrec_dns *sbrec_dns; > > SBREC_DNS_TABLE_FOR_EACH (sbrec_dns, dns_table) { > > - const char *dns_id = smap_get(&sbrec_dns->external_ids, "dns_id"); > > - if (!dns_id) { > > - continue; > > - } > > - > > - struct dns_data *dns_data = shash_find_data(&dns_cache, dns_id); > > + const struct uuid *uuid = &sbrec_dns->header_.uuid; > > + dns_data = dns_cache_find_data(uuid); > > if (!dns_data) { > > dns_data = xmalloc(sizeof *dns_data); > > smap_init(&dns_data->records); > > smap_init(&dns_data->options); > > - shash_add(&dns_cache, dns_id, dns_data); > > + hmap_insert(&dns_cache, &dns_data->hmap_node, uuid_hash(uuid)); > > dns_data->n_dps = 0; > > dns_data->dps = NULL; > > } else { > > @@ -3333,14 +3343,13 @@ sync_dns_cache(const struct sbrec_dns_table > > *dns_table) > > } > > } > > > > - SHASH_FOR_EACH_SAFE (iter, &dns_cache) { > > - struct dns_data *d = iter->data; > > - if (d->delete) { > > - shash_delete(&dns_cache, iter); > > - smap_destroy(&d->records); > > - smap_destroy(&d->options); > > - free(d->dps); > > - free(d); > > + HMAP_FOR_EACH_SAFE (dns_data, hmap_node, &dns_cache) { > > + if (dns_data->delete) { > > + hmap_remove(&dns_cache, &dns_data->hmap_node); > > + smap_destroy(&dns_data->records); > > + smap_destroy(&dns_data->options); > > + free(dns_data->dps); > > + free(dns_data); > > } > > } > > } > > @@ -3348,14 +3357,12 @@ sync_dns_cache(const struct sbrec_dns_table > > *dns_table) > > static void > > destroy_dns_cache(void) > > { > > - struct shash_node *iter; > > - SHASH_FOR_EACH_SAFE (iter, &dns_cache) { > > - struct dns_data *d = iter->data; > > - shash_delete(&dns_cache, iter); > > - smap_destroy(&d->records); > > - smap_destroy(&d->options); > > - free(d->dps); > > - free(d); > > + struct dns_data *dns_data; > > + HMAP_FOR_EACH_POP (dns_data, hmap_node, &dns_cache) { > > + smap_destroy(&dns_data->records); > > + smap_destroy(&dns_data->options); > > + free(dns_data->dps); > > + free(dns_data); > > } > > } > > > > @@ -3543,17 +3550,16 @@ pinctrl_handle_dns_lookup( > > uint64_t dp_key = ntohll(pin->flow_metadata.flow.metadata); > > const char *answer_data = NULL; > > bool ovn_owned = false; > > - struct shash_node *iter; > > - SHASH_FOR_EACH (iter, &dns_cache) { > > - struct dns_data *d = iter->data; > > - ovn_owned = smap_get_bool(&d->options, "ovn-owned", false); > > - for (size_t i = 0; i < d->n_dps; i++) { > > - if (d->dps[i] == dp_key) { > > + struct dns_data *dns_data; > > + HMAP_FOR_EACH (dns_data, hmap_node, &dns_cache) { > > + ovn_owned = smap_get_bool(&dns_data->options, "ovn-owned", false); > > + for (size_t i = 0; i < dns_data->n_dps; i++) { > > + if (dns_data->dps[i] == dp_key) { > > /* DNS records in SBDB are stored in lowercase. Convert to > > * lowercase to perform case insensitive lookup > > */ > > char *query_name_lower = > > str_tolower(ds_cstr(&query_name)); > > - answer_data = smap_get(&d->records, query_name_lower); > > + answer_data = smap_get(&dns_data->records, > > query_name_lower); > > free(query_name_lower); > > if (answer_data) { > > break; > > diff --git a/northd/northd.c b/northd/northd.c > > index 0dac661b0..a81defe49 100644 > > --- a/northd/northd.c > > +++ b/northd/northd.c > > @@ -18162,7 +18162,7 @@ struct dns_info { > > }; > > > > static inline struct dns_info * > > -get_dns_info_from_hmap(struct hmap *dns_map, struct uuid *uuid) > > +get_dns_info_from_hmap(struct hmap *dns_map, const struct uuid *uuid) > > { > > struct dns_info *dns_info; > > size_t hash = uuid_hash(uuid); > > @@ -18208,15 +18208,8 @@ sync_dns_entries(struct ovsdb_idl_txn *ovnsb_txn, > > > > const struct sbrec_dns *sbrec_dns; > > SBREC_DNS_TABLE_FOR_EACH_SAFE (sbrec_dns, sbrec_dns_table) { > > - const char *nb_dns_uuid = smap_get(&sbrec_dns->external_ids, > > "dns_id"); > > - struct uuid dns_uuid; > > - if (!nb_dns_uuid || !uuid_from_string(&dns_uuid, nb_dns_uuid)) { > > - sbrec_dns_delete(sbrec_dns); > > - continue; > > - } > > - > > struct dns_info *dns_info = > > - get_dns_info_from_hmap(&dns_map, &dns_uuid); > > + get_dns_info_from_hmap(&dns_map, &sbrec_dns->header_.uuid); > > if (dns_info) { > > dns_info->sb_dns = sbrec_dns; > > } else { > > @@ -18227,14 +18220,8 @@ sync_dns_entries(struct ovsdb_idl_txn *ovnsb_txn, > > struct dns_info *dns_info; > > HMAP_FOR_EACH_POP (dns_info, hmap_node, &dns_map) { > > if (!dns_info->sb_dns) { > > - sbrec_dns = sbrec_dns_insert(ovnsb_txn); > > - dns_info->sb_dns = sbrec_dns; > > - char *dns_id = xasprintf( > > - UUID_FMT, UUID_ARGS(&dns_info->nb_dns->header_.uuid)); > > - const struct smap external_ids = > > - SMAP_CONST1(&external_ids, "dns_id", dns_id); > > - sbrec_dns_set_external_ids(sbrec_dns, &external_ids); > > - free(dns_id); > > + dns_info->sb_dns = sbrec_dns_insert_persist_uuid( > > + ovnsb_txn, &dns_info->nb_dns->header_.uuid); > > } > > > > /* Copy DNS options to SB*/ > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
