"Ansari, Shad" <shad.ans...@hpe.com> wrote on 03/31/2016 06:55:52 PM:

> From: "Ansari, Shad" <shad.ans...@hpe.com>
> To: Ryan Moats/Omaha/IBM@IBMUS
> Cc: "dev@openvswitch.org" <dev@openvswitch.org>
> Date: 03/31/2016 06:55 PM
> Subject: RE: [ovs-dev] [PATCH 1/1] ovsdb-idl: Retain column values
> of deleted rows until change-track is cleared.
>
> > > My experience with trying to clear the change track and re-establish
it
> > > leads
> > > to history being lost [this is likely from my not fully understanding
what
> > > happens with sequence numbers over turning tracking on and off] and
so it
> > > is
> > > more efficient to just leave change tracking on.  Under this
scenario, I'm
> > > pretty convinced that this code would amount to a memory leak.
> > >
> >
> > Could you provide more exact description of the problem and the
> steps/code to
> > reproduce.
>
> I ran valgrind on idl test cases with this change and they all came out
clean:
> make check-valgrind TESTSUITEFLAGS='-k idl'
> find . -name "valgrind.*" | xargs cat
>

Apply this patch set:


diff --git a/ovn/controller/lflow.c b/ovn/controller/lflow.c
index bcad318..f9bcdc0 100644
--- a/ovn/controller/lflow.c
+++ b/ovn/controller/lflow.c
@@ -204,7 +204,7 @@ add_logical_flows(struct controller_ctx *ctx, const
struct lport_index *lports,
     uint32_t conj_id_ofs = 1;

     const struct sbrec_logical_flow *lflow;
-    SBREC_LOGICAL_FLOW_FOR_EACH (lflow, ctx->ovnsb_idl) {
+    SBREC_LOGICAL_FLOW_FOR_EACH_TRACKED (lflow, ctx->ovnsb_idl) {
         /* Determine translation of logical table IDs to physical table
IDs. */
         bool ingress = !strcmp(lflow->pipeline, "ingress");

@@ -391,7 +391,7 @@ add_neighbor_flows(struct controller_ctx *ctx,
     ofpbuf_init(&ofpacts, 0);

     const struct sbrec_mac_binding *b;
-    SBREC_MAC_BINDING_FOR_EACH (b, ctx->ovnsb_idl) {
+    SBREC_MAC_BINDING_FOR_EACH_TRACKED (b, ctx->ovnsb_idl) {
         const struct sbrec_port_binding *pb
             = lport_lookup_by_name(lports, b->logical_port);
         if (!pb) {
diff --git a/ovn/controller/ovn-controller.c
b/ovn/controller/ovn-controller.c
index 6027011..d0a5cbe 100644
--- a/ovn/controller/ovn-controller.c
+++ b/ovn/controller/ovn-controller.c
@@ -285,6 +285,7 @@ main(int argc, char *argv[])
     char *ovnsb_remote = get_ovnsb_remote(ovs_idl_loop.idl);
     struct ovsdb_idl_loop ovnsb_idl_loop = OVSDB_IDL_LOOP_INITIALIZER(
         ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true, true));
+    ovsdb_idl_track_add_all(ovnsb_idl_loop.idl);
     ovsdb_idl_get_initial_snapshot(ovnsb_idl_loop.idl);

     int probe_interval = 0;
@@ -379,6 +380,7 @@ main(int argc, char *argv[])
         }
         ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
         ovsdb_idl_loop_commit_and_wait(&ovs_idl_loop);
+        ovsdb_idl_track_clear(ovnsb_idl_loop.idl);
         poll_block();
         if (should_service_stop()) {
             exiting = true;


Run make check TESTSUITEFLAGS='-k ovn'

It looks like the calls to SBREC_*_EACH_TRACKED only show you the
incremental changes since tracking was turned on.  Now, that may
in fact be how it was intended to work, but if so, then I question
it's usefulness.  In ovn-controller, I can foresee code paths that
differ only in that one uses SBREC_*_FOR_EACH_TRACKED and the other
uses SBREC_*_FOR_EACH, and that's going to be a bit ugly.

Ryan
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to