On Fri, Nov 25, 2022 at 4:36 AM Ilya Maximets <[email protected]> wrote: > > OVSDB creates a separate object for each weak reference in order to > track them and there could be a significant amount of these objects > in the database. > > We also had problems with number of these objects growing out of > bounds recently. So, adding them to a memory report seems to be > a good thing. > > Counting them globally to cover all the copied instances in transactions > and the transaction history (even though there should be none). > It's also hard to count them per-database, because weak references > are stored on destination rows and can be destroyed either while > destroying the destination row or while removing the reference from > the source row. Also, not all the involved functions have direct > access to the database object. So, there is no single clear place > where counters should be updated. > > Signed-off-by: Ilya Maximets <[email protected]> > --- > ovsdb/ovsdb.c | 4 ++++ > ovsdb/ovsdb.h | 4 ++++ > ovsdb/row.c | 5 ++++- > ovsdb/transaction.c | 2 ++ > 4 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c > index 1c011fab0..11786f376 100644 > --- a/ovsdb/ovsdb.c > +++ b/ovsdb/ovsdb.c > @@ -43,6 +43,8 @@ > #include "openvswitch/vlog.h" > VLOG_DEFINE_THIS_MODULE(ovsdb); > > +size_t n_weak_refs = 0; > + > struct ovsdb_schema * > ovsdb_schema_create(const char *name, const char *version, const char *cksum) > { > @@ -546,6 +548,8 @@ ovsdb_get_memory_usage(const struct ovsdb *db, struct simap *usage) > if (db->storage) { > ovsdb_storage_get_memory_usage(db->storage, usage); > } > + > + simap_put(usage, "n-weak-refs", n_weak_refs); > } > > struct ovsdb_table * > diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h > index d05e7c64a..13d8bf407 100644 > --- a/ovsdb/ovsdb.h > +++ b/ovsdb/ovsdb.h > @@ -125,6 +125,10 @@ struct ovsdb { > struct ovsdb_compaction_state *snap_state; > }; > > +/* Total number of 'weak reference' objects in all databases > + * and transactions. */ > +extern size_t n_weak_refs; > + > struct ovsdb *ovsdb_create(struct ovsdb_schema *, struct ovsdb_storage *); > void ovsdb_destroy(struct ovsdb *); > > diff --git a/ovsdb/row.c b/ovsdb/row.c > index 3f0bb8acf..d7bfbdd36 100644 > --- a/ovsdb/row.c > +++ b/ovsdb/row.c > @@ -21,8 +21,9 @@ > > #include "openvswitch/dynamic-string.h" > #include "openvswitch/json.h" > -#include "ovsdb-error.h" > #include "openvswitch/shash.h" > +#include "ovsdb-error.h" > +#include "ovsdb.h" > #include "sort.h" > #include "table.h" > #include "util.h" > @@ -78,6 +79,7 @@ ovsdb_weak_ref_clone(struct ovsdb_weak_ref *src) > ovsdb_type_clone(&weak->type, &src->type); > weak->column_idx = src->column_idx; > weak->by_key = src->by_key; > + n_weak_refs++; > return weak; > } > > @@ -130,6 +132,7 @@ ovsdb_weak_ref_destroy(struct ovsdb_weak_ref *weak) > } > ovsdb_type_destroy(&weak->type); > free(weak); > + n_weak_refs--; > } > > struct ovsdb_row * > diff --git a/ovsdb/transaction.c b/ovsdb/transaction.c > index 5d7c70a51..03541af85 100644 > --- a/ovsdb/transaction.c > +++ b/ovsdb/transaction.c > @@ -613,6 +613,8 @@ add_weak_ref(const struct ovsdb_row *src, const struct ovsdb_row *dst_, > weak->column_idx = column->index; > hmap_node_nullify(&weak->dst_node); > ovs_list_push_back(ref_list, &weak->src_node); > + > + n_weak_refs++; > } > > static void > -- > 2.38.1 >
Acked-by: Han Zhou <[email protected]> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
