[ovs-dev] [PATCH 1/1] ovsdb-idl: memory leak while destroying database

Ben Pfaff blp at ovn.org
Mon Jul 1 21:50:34 UTC 2019


On Mon, Jul 01, 2019 at 12:24:38PM +0200, Damjan Skvarc wrote:
> While checking unit tests with valgrind option (make check-valgrind) I have
> noticed
> several memory leaks of the following format:

Thanks.  I applied this to master.

I noticed that the call to ovsdb_idl_db_clear() could be moved into
ovsdb_idl_db_destroy() instead of being in two places, so I did that,
so what I pushed was the following.

--8<--------------------------cut here-------------------------->8--

From: Damjan Skvarc <damjan.skvarc at gmail.com>
Date: Mon, 1 Jul 2019 12:24:38 +0200
Subject: [PATCH] ovsdb-idl: memory leak while destroying database

While checking unit tests with valgrind option (make check-valgrind) I have
noticed several memory leaks of the following format:

.....
==20019== 13,883 (296 direct, 13,587 indirect) bytes in 1 blocks are definitely lost in loss record 346 of 346
==20019==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20019==    by 0x530F52: xcalloc (util.c:121)
==20019==    by 0x5037A1: ovsdb_idl_row_create__ (ovsdb-idl.c:3120)
==20019==    by 0x5045A3: ovsdb_idl_row_create (ovsdb-idl.c:3133)
==20019==    by 0x507240: ovsdb_idl_process_update2 (ovsdb-idl.c:2478)
==20019==    by 0x507240: ovsdb_idl_db_parse_update__ (ovsdb-idl.c:2328)
==20019==    by 0x507240: ovsdb_idl_db_parse_update (ovsdb-idl.c:2380)
==20019==    by 0x508128: ovsdb_idl_process_response (ovsdb-idl.c:742)
==20019==    by 0x508128: ovsdb_idl_process_msg (ovsdb-idl.c:831)
==20019==    by 0x508128: ovsdb_idl_run (ovsdb-idl.c:915)
==20019==    by 0x4106D9: bridge_run (bridge.c:2977)
==20019==    by 0x40719C: main (ovs-vswitchd.c:127)
==20019==
==20019== LEAK SUMMARY:
==20019==    definitely lost: 296 bytes in 1 blocks
==20019==    indirectly lost: 13,587 bytes in 10 blocks
==20019==      possibly lost: 0 bytes in 0 blocks
==20019==    still reachable: 43,563 bytes in 440 blocks
==20019==         suppressed: 288 bytes in 1 blocks
....

The problem is that table records maintained by database which is going to
be destroyed with ovsdb_idl_db_destroy() function are not destroyed.

Signed-off-by: Damijan Skvarc <damjan.skvarc at gmail.com>
Signed-off-by: Ben Pfaff <blp at ovn.org>
---
 lib/ovsdb-idl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index d27e205d2ff6..5c6109603113 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -239,6 +239,7 @@ static bool ovsdb_idl_check_server_db(struct ovsdb_idl *);
 static void ovsdb_idl_send_monitor_request(struct ovsdb_idl *,
                                            struct ovsdb_idl_db *,
                                            enum ovsdb_idl_monitor_method);
+static void ovsdb_idl_db_clear(struct ovsdb_idl_db *db);
 
 struct ovsdb_idl {
     struct ovsdb_idl_db server;
@@ -557,6 +558,7 @@ ovsdb_idl_db_destroy(struct ovsdb_idl_db *db)
 {
     ovs_assert(!db->txn);
     ovsdb_idl_db_txn_abort_all(db);
+    ovsdb_idl_db_clear(db);
     for (size_t i = 0; i < db->class_->n_tables; i++) {
         struct ovsdb_idl_table *table = &db->tables[i];
         ovsdb_idl_condition_destroy(&table->condition);
@@ -581,7 +583,6 @@ ovsdb_idl_destroy(struct ovsdb_idl *idl)
     if (idl) {
         ovsdb_idl_clear(idl);
         jsonrpc_session_close(idl->session);
-
         ovsdb_idl_db_destroy(&idl->server);
         ovsdb_idl_db_destroy(&idl->data);
         json_destroy(idl->request_id);
-- 
2.20.1



More information about the dev mailing list