On Thu, Oct 14, 2021 at 4:46 AM Ilya Maximets <[email protected]> wrote:
>
> Added new function to return memory usage statistics for database
> objects inside IDL.  Statistics similar to what ovsdb-server reports.
> Not counting _Server database as it should be small, hence doesn't
> worth adding extra code to the ovsdb-cs module.  Can be added later
> if needed.
>
> ovs-vswitchd is a user in OVS, but this API will be mostly useful for
> OVN daemons.
>
> Signed-off-by: Ilya Maximets <[email protected]>
> ---
>  lib/ovsdb-idl.c   | 24 ++++++++++++++++++++++++
>  lib/ovsdb-idl.h   |  3 +++
>  vswitchd/bridge.c |  2 ++
>  3 files changed, 29 insertions(+)
>
> diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
> index 383a601f6..b22492d5e 100644
> --- a/lib/ovsdb-idl.c
> +++ b/lib/ovsdb-idl.c
> @@ -42,6 +42,7 @@
>  #include "openvswitch/poll-loop.h"
>  #include "openvswitch/shash.h"
>  #include "skiplist.h"
> +#include "simap.h"
>  #include "sset.h"
>  #include "svec.h"
>  #include "util.h"
> @@ -465,6 +466,29 @@ ovsdb_idl_wait(struct ovsdb_idl *idl)
>      ovsdb_cs_wait(idl->cs);
>  }
>
> +/* Returns memory usage statistics. */
> +void
> +ovsdb_idl_get_memory_usage(struct ovsdb_idl *idl, struct simap *usage)
> +{
> +    unsigned int cells = 0;
> +
> +    if (!idl) {
> +        return;
> +    }
> +
> +    for (size_t i = 0; i < idl->class_->n_tables; i++) {
> +        struct ovsdb_idl_table *table = &idl->tables[i];
> +        unsigned int n_columns = shash_count(&table->columns);
> +        unsigned int n_rows = hmap_count(&table->rows);
> +
> +        cells += n_rows * n_columns;
> +    }
> +
> +    simap_increase(usage, "idl-cells", cells);
> +    simap_increase(usage, "idl-outstanding-txns",
> +                   hmap_count(&idl->outstanding_txns));
> +}
> +
>  /* Returns a "sequence number" that represents the state of 'idl'.  When
>   * ovsdb_idl_run() changes the database, the sequence number changes.
The
>   * initial fetch of the entire contents of the remote database is
considered to
> diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
> index 16c8d5f70..d00599616 100644
> --- a/lib/ovsdb-idl.h
> +++ b/lib/ovsdb-idl.h
> @@ -55,6 +55,7 @@ struct ovsdb_idl_row;
>  struct ovsdb_idl_column;
>  struct ovsdb_idl_table;
>  struct ovsdb_idl_table_class;
> +struct simap;
>  struct uuid;
>
>  struct ovsdb_idl *ovsdb_idl_create(const char *remote,
> @@ -73,6 +74,8 @@ void ovsdb_idl_set_leader_only(struct ovsdb_idl *, bool
leader_only);
>  void ovsdb_idl_run(struct ovsdb_idl *);
>  void ovsdb_idl_wait(struct ovsdb_idl *);
>
> +void ovsdb_idl_get_memory_usage(struct ovsdb_idl *, struct simap *usage);
> +
>  void ovsdb_idl_set_lock(struct ovsdb_idl *, const char *lock_name);
>  bool ovsdb_idl_has_lock(const struct ovsdb_idl *);
>  bool ovsdb_idl_is_lock_contended(const struct ovsdb_idl *);
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index c790a56ad..5223aa897 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -3423,6 +3423,8 @@ bridge_get_memory_usage(struct simap *usage)
>      HMAP_FOR_EACH (br, node, &all_bridges) {
>          ofproto_get_memory_usage(br->ofproto, usage);
>      }
> +
> +    ovsdb_idl_get_memory_usage(idl, usage);
>  }
>
>  /* QoS unixctl user interface functions. */
> --
> 2.31.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Hi Ilya, I tested in sandbox:

[hanzhou@fedora tutorial]$ ovs-vsctl add-br br-int
[hanzhou@fedora tutorial]$ ovs-appctl memory/show
handlers:17 ports:1 revalidators:7 rules:5

It didn't show idl-xxx memory for vswitchd. Did I miss something?

Thanks,
Han
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to