diff mbox series

[ovs-dev,ovn,v10,4/8] I-P engine: Provide the option for an engine to clear tracked engine data in every run.

Message ID 20200608135015.1379055-1-numans@ovn.org
State Superseded
Headers show
Series Incremental processing improvements. | expand

Commit Message

Numan Siddique June 8, 2020, 1:50 p.m. UTC
From: Numan Siddique <numans@ovn.org>

A new function is added in the engine node called - clear_tracked_data() to
clear any engine data which was tracked during the engine run. This tracked data
has to be part of the engine 'data'. engine_init_run() calls clear_tracked_data()
and each engine node interested in tracking the data needs to implement the
en_<ENGINE_NODE_NAME>clear_tracked_data() function.

With this patch, an engine node can store any changes done to the engine data
separately in the engine change handlers. The parent of this engine node
can use this tracked data for incrementally processing the changes. Upcoming
patches in the series will make use of this.

Signed-off-by: Numan Siddique <numans@ovn.org>
---
 lib/inc-proc-eng.c | 6 +++++-
 lib/inc-proc-eng.h | 9 +++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

Comments

Dumitru Ceara June 8, 2020, 4:12 p.m. UTC | #1
On 6/8/20 3:50 PM, numans@ovn.org wrote:
> From: Numan Siddique <numans@ovn.org>
> 
> A new function is added in the engine node called - clear_tracked_data() to
> clear any engine data which was tracked during the engine run. This tracked data
> has to be part of the engine 'data'. engine_init_run() calls clear_tracked_data()
> and each engine node interested in tracking the data needs to implement the
> en_<ENGINE_NODE_NAME>clear_tracked_data() function.
> 
> With this patch, an engine node can store any changes done to the engine data
> separately in the engine change handlers. The parent of this engine node
> can use this tracked data for incrementally processing the changes. Upcoming
> patches in the series will make use of this.
> 
> Signed-off-by: Numan Siddique <numans@ovn.org>
> ---
>  lib/inc-proc-eng.c | 6 +++++-
>  lib/inc-proc-eng.h | 9 +++++++++
>  2 files changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
> index 9b1479a1c..a9389f75b 100644
> --- a/lib/inc-proc-eng.c
> +++ b/lib/inc-proc-eng.c
> @@ -260,6 +260,10 @@ engine_init_run(void)
>      VLOG_DBG("Initializing new run");
>      for (size_t i = 0; i < engine_n_nodes; i++) {
>          engine_set_node_state(engine_nodes[i], EN_STALE);
> +
> +        if (engine_nodes[i]->clear_tracked_data) {
> +            engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
> +        }
>      }
>  }
>  
> @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
>  
>          if (engine_nodes[i]->state == EN_ABORTED) {
>              engine_run_aborted = true;
> -            return;
> +            break;

I guess this is a leftover from a previous iteration of the series. It
should be fine to return here.

With this fixed:

Acked-by: Dumitru Ceara <dceara@redhat.com>

Thanks,
Dumitru

>          }
>      }
>  }
> diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
> index 780c3cd22..552f2051a 100644
> --- a/lib/inc-proc-eng.h
> +++ b/lib/inc-proc-eng.h
> @@ -149,6 +149,10 @@ struct engine_node {
>       * doesn't store pointers to DB records it's still safe to use).
>       */
>      bool (*is_valid)(struct engine_node *);
> +
> +    /* Method to clear up tracked data maintained by the engine node in the
> +     * engine 'data'. It may be NULL. */
> +    void (*clear_tracked_data)(void *tracked_data);
>  };
>  
>  /* Initialize the data for the engine nodes. It calls each node's
> @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
>          .run = en_##NAME##_run, \
>          .cleanup = en_##NAME##_cleanup, \
>          .is_valid = en_##NAME##_is_valid, \
> +        .clear_tracked_data = NULL, \
>      };
>  
>  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
> @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
>      static bool (*en_##NAME##_is_valid)(struct engine_node *node) = NULL; \
>      ENGINE_NODE_DEF(NAME, NAME_STR)
>  
> +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
> +    ENGINE_NODE(NAME, NAME_STR) \
> +    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
> +
>  /* Macro to define member functions of an engine node which represents
>   * a table of OVSDB */
>  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
>
Numan Siddique June 8, 2020, 5:34 p.m. UTC | #2
On Mon, Jun 8, 2020 at 9:42 PM Dumitru Ceara <dceara@redhat.com> wrote:

> On 6/8/20 3:50 PM, numans@ovn.org wrote:
> > From: Numan Siddique <numans@ovn.org>
> >
> > A new function is added in the engine node called - clear_tracked_data()
> to
> > clear any engine data which was tracked during the engine run. This
> tracked data
> > has to be part of the engine 'data'. engine_init_run() calls
> clear_tracked_data()
> > and each engine node interested in tracking the data needs to implement
> the
> > en_<ENGINE_NODE_NAME>clear_tracked_data() function.
> >
> > With this patch, an engine node can store any changes done to the engine
> data
> > separately in the engine change handlers. The parent of this engine node
> > can use this tracked data for incrementally processing the changes.
> Upcoming
> > patches in the series will make use of this.
> >
> > Signed-off-by: Numan Siddique <numans@ovn.org>
> > ---
> >  lib/inc-proc-eng.c | 6 +++++-
> >  lib/inc-proc-eng.h | 9 +++++++++
> >  2 files changed, 14 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
> > index 9b1479a1c..a9389f75b 100644
> > --- a/lib/inc-proc-eng.c
> > +++ b/lib/inc-proc-eng.c
> > @@ -260,6 +260,10 @@ engine_init_run(void)
> >      VLOG_DBG("Initializing new run");
> >      for (size_t i = 0; i < engine_n_nodes; i++) {
> >          engine_set_node_state(engine_nodes[i], EN_STALE);
> > +
> > +        if (engine_nodes[i]->clear_tracked_data) {
> > +            engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
> > +        }
> >      }
> >  }
> >
> > @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
> >
> >          if (engine_nodes[i]->state == EN_ABORTED) {
> >              engine_run_aborted = true;
> > -            return;
> > +            break;
>
> I guess this is a leftover from a previous iteration of the series. It
> should be fine to return here.
>

Oops. Thanks. I'll fix it.

Thanks
Numan


>
> With this fixed:
>
> Acked-by: Dumitru Ceara <dceara@redhat.com>
>
> Thanks,
> Dumitru
>
> >          }
> >      }
> >  }
> > diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
> > index 780c3cd22..552f2051a 100644
> > --- a/lib/inc-proc-eng.h
> > +++ b/lib/inc-proc-eng.h
> > @@ -149,6 +149,10 @@ struct engine_node {
> >       * doesn't store pointers to DB records it's still safe to use).
> >       */
> >      bool (*is_valid)(struct engine_node *);
> > +
> > +    /* Method to clear up tracked data maintained by the engine node in
> the
> > +     * engine 'data'. It may be NULL. */
> > +    void (*clear_tracked_data)(void *tracked_data);
> >  };
> >
> >  /* Initialize the data for the engine nodes. It calls each node's
> > @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct engine_node
> *, const char *name,
> >          .run = en_##NAME##_run, \
> >          .cleanup = en_##NAME##_cleanup, \
> >          .is_valid = en_##NAME##_is_valid, \
> > +        .clear_tracked_data = NULL, \
> >      };
> >
> >  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
> > @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct engine_node
> *, const char *name,
> >      static bool (*en_##NAME##_is_valid)(struct engine_node *node) =
> NULL; \
> >      ENGINE_NODE_DEF(NAME, NAME_STR)
> >
> > +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
> > +    ENGINE_NODE(NAME, NAME_STR) \
> > +    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
> > +
> >  /* Macro to define member functions of an engine node which represents
> >   * a table of OVSDB */
> >  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
>
Dumitru Ceara June 9, 2020, 7:59 a.m. UTC | #3
On 6/8/20 7:34 PM, Numan Siddique wrote:
> 
> 
> On Mon, Jun 8, 2020 at 9:42 PM Dumitru Ceara <dceara@redhat.com
> <mailto:dceara@redhat.com>> wrote:
> 
>     On 6/8/20 3:50 PM, numans@ovn.org <mailto:numans@ovn.org> wrote:
>     > From: Numan Siddique <numans@ovn.org <mailto:numans@ovn.org>>
>     >
>     > A new function is added in the engine node called -
>     clear_tracked_data() to
>     > clear any engine data which was tracked during the engine run.
>     This tracked data
>     > has to be part of the engine 'data'. engine_init_run() calls
>     clear_tracked_data()
>     > and each engine node interested in tracking the data needs to
>     implement the
>     > en_<ENGINE_NODE_NAME>clear_tracked_data() function.
>     >
>     > With this patch, an engine node can store any changes done to the
>     engine data
>     > separately in the engine change handlers. The parent of this
>     engine node
>     > can use this tracked data for incrementally processing the
>     changes. Upcoming
>     > patches in the series will make use of this.
>     >
>     > Signed-off-by: Numan Siddique <numans@ovn.org <mailto:numans@ovn.org>>
>     > ---
>     >  lib/inc-proc-eng.c | 6 +++++-
>     >  lib/inc-proc-eng.h | 9 +++++++++
>     >  2 files changed, 14 insertions(+), 1 deletion(-)
>     >
>     > diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
>     > index 9b1479a1c..a9389f75b 100644
>     > --- a/lib/inc-proc-eng.c
>     > +++ b/lib/inc-proc-eng.c
>     > @@ -260,6 +260,10 @@ engine_init_run(void)
>     >      VLOG_DBG("Initializing new run");
>     >      for (size_t i = 0; i < engine_n_nodes; i++) {
>     >          engine_set_node_state(engine_nodes[i], EN_STALE);
>     > +
>     > +        if (engine_nodes[i]->clear_tracked_data) {
>     > +           
>     engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
>     > +        }
>     >      }
>     >  }
>     > 
>     > @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
>     > 
>     >          if (engine_nodes[i]->state == EN_ABORTED) {
>     >              engine_run_aborted = true;
>     > -            return;
>     > +            break;
> 
>     I guess this is a leftover from a previous iteration of the series. It
>     should be fine to return here.
> 
> 
> Oops. Thanks. I'll fix it.
> 
> Thanks
> Numan

Hi Numan,

While reviewing the following patches I realized that it might be useful
if in this patch we'd also call engine_nodes[i]->clear_tracked_data() in
engine_cleanup(), what do you think?

Thanks,
Dumitru

>  
> 
> 
>     With this fixed:
> 
>     Acked-by: Dumitru Ceara <dceara@redhat.com <mailto:dceara@redhat.com>>
> 
>     Thanks,
>     Dumitru
> 
>     >          }
>     >      }
>     >  }
>     > diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
>     > index 780c3cd22..552f2051a 100644
>     > --- a/lib/inc-proc-eng.h
>     > +++ b/lib/inc-proc-eng.h
>     > @@ -149,6 +149,10 @@ struct engine_node {
>     >       * doesn't store pointers to DB records it's still safe to use).
>     >       */
>     >      bool (*is_valid)(struct engine_node *);
>     > +
>     > +    /* Method to clear up tracked data maintained by the engine
>     node in the
>     > +     * engine 'data'. It may be NULL. */
>     > +    void (*clear_tracked_data)(void *tracked_data);
>     >  };
>     > 
>     >  /* Initialize the data for the engine nodes. It calls each node's
>     > @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct
>     engine_node *, const char *name,
>     >          .run = en_##NAME##_run, \
>     >          .cleanup = en_##NAME##_cleanup, \
>     >          .is_valid = en_##NAME##_is_valid, \
>     > +        .clear_tracked_data = NULL, \
>     >      };
>     > 
>     >  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
>     > @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct
>     engine_node *, const char *name,
>     >      static bool (*en_##NAME##_is_valid)(struct engine_node *node)
>     = NULL; \
>     >      ENGINE_NODE_DEF(NAME, NAME_STR)
>     > 
>     > +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
>     > +    ENGINE_NODE(NAME, NAME_STR) \
>     > +    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
>     > +
>     >  /* Macro to define member functions of an engine node which
>     represents
>     >   * a table of OVSDB */
>     >  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
>     >
> 
>     _______________________________________________
>     dev mailing list
>     dev@openvswitch.org <mailto:dev@openvswitch.org>
>     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Numan Siddique June 9, 2020, 8:46 a.m. UTC | #4
On Tue, Jun 9, 2020 at 1:30 PM Dumitru Ceara <dceara@redhat.com> wrote:

> On 6/8/20 7:34 PM, Numan Siddique wrote:
> >
> >
> > On Mon, Jun 8, 2020 at 9:42 PM Dumitru Ceara <dceara@redhat.com
> > <mailto:dceara@redhat.com>> wrote:
> >
> >     On 6/8/20 3:50 PM, numans@ovn.org <mailto:numans@ovn.org> wrote:
> >     > From: Numan Siddique <numans@ovn.org <mailto:numans@ovn.org>>
> >     >
> >     > A new function is added in the engine node called -
> >     clear_tracked_data() to
> >     > clear any engine data which was tracked during the engine run.
> >     This tracked data
> >     > has to be part of the engine 'data'. engine_init_run() calls
> >     clear_tracked_data()
> >     > and each engine node interested in tracking the data needs to
> >     implement the
> >     > en_<ENGINE_NODE_NAME>clear_tracked_data() function.
> >     >
> >     > With this patch, an engine node can store any changes done to the
> >     engine data
> >     > separately in the engine change handlers. The parent of this
> >     engine node
> >     > can use this tracked data for incrementally processing the
> >     changes. Upcoming
> >     > patches in the series will make use of this.
> >     >
> >     > Signed-off-by: Numan Siddique <numans@ovn.org <mailto:
> numans@ovn.org>>
> >     > ---
> >     >  lib/inc-proc-eng.c | 6 +++++-
> >     >  lib/inc-proc-eng.h | 9 +++++++++
> >     >  2 files changed, 14 insertions(+), 1 deletion(-)
> >     >
> >     > diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
> >     > index 9b1479a1c..a9389f75b 100644
> >     > --- a/lib/inc-proc-eng.c
> >     > +++ b/lib/inc-proc-eng.c
> >     > @@ -260,6 +260,10 @@ engine_init_run(void)
> >     >      VLOG_DBG("Initializing new run");
> >     >      for (size_t i = 0; i < engine_n_nodes; i++) {
> >     >          engine_set_node_state(engine_nodes[i], EN_STALE);
> >     > +
> >     > +        if (engine_nodes[i]->clear_tracked_data) {
> >     > +
> >     engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
> >     > +        }
> >     >      }
> >     >  }
> >     >
> >     > @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
> >     >
> >     >          if (engine_nodes[i]->state == EN_ABORTED) {
> >     >              engine_run_aborted = true;
> >     > -            return;
> >     > +            break;
> >
> >     I guess this is a leftover from a previous iteration of the series.
> It
> >     should be fine to return here.
> >
> >
> > Oops. Thanks. I'll fix it.
> >
> > Thanks
> > Numan
>
> Hi Numan,
>
> While reviewing the following patches I realized that it might be useful
> if in this patch we'd also call engine_nodes[i]->clear_tracked_data() in
> engine_cleanup(), what do you think?
>

I think we can call.  But since its part of engine data, engine data
cleanup should
free up any memory right ? Even if clear_tracked_data() is not called,
engine_data_cleanup()
should not leak the memory. The patch 6 in this series does that.

 Thanks
Numan


> Thanks,
> Dumitru
>
> >
> >
> >
> >     With this fixed:
> >
> >     Acked-by: Dumitru Ceara <dceara@redhat.com <mailto:dceara@redhat.com
> >>
> >
> >     Thanks,
> >     Dumitru
> >
> >     >          }
> >     >      }
> >     >  }
> >     > diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
> >     > index 780c3cd22..552f2051a 100644
> >     > --- a/lib/inc-proc-eng.h
> >     > +++ b/lib/inc-proc-eng.h
> >     > @@ -149,6 +149,10 @@ struct engine_node {
> >     >       * doesn't store pointers to DB records it's still safe to
> use).
> >     >       */
> >     >      bool (*is_valid)(struct engine_node *);
> >     > +
> >     > +    /* Method to clear up tracked data maintained by the engine
> >     node in the
> >     > +     * engine 'data'. It may be NULL. */
> >     > +    void (*clear_tracked_data)(void *tracked_data);
> >     >  };
> >     >
> >     >  /* Initialize the data for the engine nodes. It calls each node's
> >     > @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct
> >     engine_node *, const char *name,
> >     >          .run = en_##NAME##_run, \
> >     >          .cleanup = en_##NAME##_cleanup, \
> >     >          .is_valid = en_##NAME##_is_valid, \
> >     > +        .clear_tracked_data = NULL, \
> >     >      };
> >     >
> >     >  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
> >     > @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct
> >     engine_node *, const char *name,
> >     >      static bool (*en_##NAME##_is_valid)(struct engine_node *node)
> >     = NULL; \
> >     >      ENGINE_NODE_DEF(NAME, NAME_STR)
> >     >
> >     > +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
> >     > +    ENGINE_NODE(NAME, NAME_STR) \
> >     > +    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
> >     > +
> >     >  /* Macro to define member functions of an engine node which
> >     represents
> >     >   * a table of OVSDB */
> >     >  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
> >     >
> >
> >     _______________________________________________
> >     dev mailing list
> >     dev@openvswitch.org <mailto:dev@openvswitch.org>
> >     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Dumitru Ceara June 9, 2020, 9:05 a.m. UTC | #5
On 6/9/20 10:46 AM, Numan Siddique wrote:
> 
> 
> On Tue, Jun 9, 2020 at 1:30 PM Dumitru Ceara <dceara@redhat.com
> <mailto:dceara@redhat.com>> wrote:
> 
>     On 6/8/20 7:34 PM, Numan Siddique wrote:
>     >
>     >
>     > On Mon, Jun 8, 2020 at 9:42 PM Dumitru Ceara <dceara@redhat.com
>     <mailto:dceara@redhat.com>
>     > <mailto:dceara@redhat.com <mailto:dceara@redhat.com>>> wrote:
>     >
>     >     On 6/8/20 3:50 PM, numans@ovn.org <mailto:numans@ovn.org>
>     <mailto:numans@ovn.org <mailto:numans@ovn.org>> wrote:
>     >     > From: Numan Siddique <numans@ovn.org <mailto:numans@ovn.org>
>     <mailto:numans@ovn.org <mailto:numans@ovn.org>>>
>     >     >
>     >     > A new function is added in the engine node called -
>     >     clear_tracked_data() to
>     >     > clear any engine data which was tracked during the engine run.
>     >     This tracked data
>     >     > has to be part of the engine 'data'. engine_init_run() calls
>     >     clear_tracked_data()
>     >     > and each engine node interested in tracking the data needs to
>     >     implement the
>     >     > en_<ENGINE_NODE_NAME>clear_tracked_data() function.
>     >     >
>     >     > With this patch, an engine node can store any changes done
>     to the
>     >     engine data
>     >     > separately in the engine change handlers. The parent of this
>     >     engine node
>     >     > can use this tracked data for incrementally processing the
>     >     changes. Upcoming
>     >     > patches in the series will make use of this.
>     >     >
>     >     > Signed-off-by: Numan Siddique <numans@ovn.org
>     <mailto:numans@ovn.org> <mailto:numans@ovn.org <mailto:numans@ovn.org>>>
>     >     > ---
>     >     >  lib/inc-proc-eng.c | 6 +++++-
>     >     >  lib/inc-proc-eng.h | 9 +++++++++
>     >     >  2 files changed, 14 insertions(+), 1 deletion(-)
>     >     >
>     >     > diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
>     >     > index 9b1479a1c..a9389f75b 100644
>     >     > --- a/lib/inc-proc-eng.c
>     >     > +++ b/lib/inc-proc-eng.c
>     >     > @@ -260,6 +260,10 @@ engine_init_run(void)
>     >     >      VLOG_DBG("Initializing new run");
>     >     >      for (size_t i = 0; i < engine_n_nodes; i++) {
>     >     >          engine_set_node_state(engine_nodes[i], EN_STALE);
>     >     > +
>     >     > +        if (engine_nodes[i]->clear_tracked_data) {
>     >     > +           
>     >     engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
>     >     > +        }
>     >     >      }
>     >     >  }
>     >     > 
>     >     > @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
>     >     > 
>     >     >          if (engine_nodes[i]->state == EN_ABORTED) {
>     >     >              engine_run_aborted = true;
>     >     > -            return;
>     >     > +            break;
>     >
>     >     I guess this is a leftover from a previous iteration of the
>     series. It
>     >     should be fine to return here.
>     >
>     >
>     > Oops. Thanks. I'll fix it.
>     >
>     > Thanks
>     > Numan
> 
>     Hi Numan,
> 
>     While reviewing the following patches I realized that it might be useful
>     if in this patch we'd also call engine_nodes[i]->clear_tracked_data() in
>     engine_cleanup(), what do you think?
> 
> 
> I think we can call.  But since its part of engine data, engine data
> cleanup should
> free up any memory right ? Even if clear_tracked_data() is not called,
> engine_data_cleanup()
> should not leak the memory. The patch 6 in this series does that.
> 

In patch 6 we call en_runtime_data_clear_tracked_data() from
en_runtime_data_cleanup() which puts the burden on the I-P engine user
to make sure to not forget to call the clear_tracked_data callback from
the cleanup handler

I think this should always be done, for all nodes, regardless of data
contents, so I'd make sure that happens by calling the
clear_tracked_data callback from within engine_data_cleanup().

Thanks,
Dumitru

>  Thanks
> Numan
> 
> 
>     Thanks,
>     Dumitru
> 
>     >  
>     >
>     >
>     >     With this fixed:
>     >
>     >     Acked-by: Dumitru Ceara <dceara@redhat.com
>     <mailto:dceara@redhat.com> <mailto:dceara@redhat.com
>     <mailto:dceara@redhat.com>>>
>     >
>     >     Thanks,
>     >     Dumitru
>     >
>     >     >          }
>     >     >      }
>     >     >  }
>     >     > diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
>     >     > index 780c3cd22..552f2051a 100644
>     >     > --- a/lib/inc-proc-eng.h
>     >     > +++ b/lib/inc-proc-eng.h
>     >     > @@ -149,6 +149,10 @@ struct engine_node {
>     >     >       * doesn't store pointers to DB records it's still safe
>     to use).
>     >     >       */
>     >     >      bool (*is_valid)(struct engine_node *);
>     >     > +
>     >     > +    /* Method to clear up tracked data maintained by the engine
>     >     node in the
>     >     > +     * engine 'data'. It may be NULL. */
>     >     > +    void (*clear_tracked_data)(void *tracked_data);
>     >     >  };
>     >     > 
>     >     >  /* Initialize the data for the engine nodes. It calls each
>     node's
>     >     > @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct
>     >     engine_node *, const char *name,
>     >     >          .run = en_##NAME##_run, \
>     >     >          .cleanup = en_##NAME##_cleanup, \
>     >     >          .is_valid = en_##NAME##_is_valid, \
>     >     > +        .clear_tracked_data = NULL, \
>     >     >      };
>     >     > 
>     >     >  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
>     >     > @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct
>     >     engine_node *, const char *name,
>     >     >      static bool (*en_##NAME##_is_valid)(struct engine_node
>     *node)
>     >     = NULL; \
>     >     >      ENGINE_NODE_DEF(NAME, NAME_STR)
>     >     > 
>     >     > +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
>     >     > +    ENGINE_NODE(NAME, NAME_STR) \
>     >     > +    en_##NAME.clear_tracked_data =
>     en_##NAME##_clear_tracked_data;
>     >     > +
>     >     >  /* Macro to define member functions of an engine node which
>     >     represents
>     >     >   * a table of OVSDB */
>     >     >  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
>     >     >
>     >
>     >     _______________________________________________
>     >     dev mailing list
>     >     dev@openvswitch.org <mailto:dev@openvswitch.org>
>     <mailto:dev@openvswitch.org <mailto:dev@openvswitch.org>>
>     >     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>     >
> 
>     _______________________________________________
>     dev mailing list
>     dev@openvswitch.org <mailto:dev@openvswitch.org>
>     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Numan Siddique June 9, 2020, 9:17 a.m. UTC | #6
On Tue, Jun 9, 2020 at 2:35 PM Dumitru Ceara <dceara@redhat.com> wrote:

> On 6/9/20 10:46 AM, Numan Siddique wrote:
> >
> >
> > On Tue, Jun 9, 2020 at 1:30 PM Dumitru Ceara <dceara@redhat.com
> > <mailto:dceara@redhat.com>> wrote:
> >
> >     On 6/8/20 7:34 PM, Numan Siddique wrote:
> >     >
> >     >
> >     > On Mon, Jun 8, 2020 at 9:42 PM Dumitru Ceara <dceara@redhat.com
> >     <mailto:dceara@redhat.com>
> >     > <mailto:dceara@redhat.com <mailto:dceara@redhat.com>>> wrote:
> >     >
> >     >     On 6/8/20 3:50 PM, numans@ovn.org <mailto:numans@ovn.org>
> >     <mailto:numans@ovn.org <mailto:numans@ovn.org>> wrote:
> >     >     > From: Numan Siddique <numans@ovn.org <mailto:numans@ovn.org>
> >     <mailto:numans@ovn.org <mailto:numans@ovn.org>>>
> >     >     >
> >     >     > A new function is added in the engine node called -
> >     >     clear_tracked_data() to
> >     >     > clear any engine data which was tracked during the engine
> run.
> >     >     This tracked data
> >     >     > has to be part of the engine 'data'. engine_init_run() calls
> >     >     clear_tracked_data()
> >     >     > and each engine node interested in tracking the data needs to
> >     >     implement the
> >     >     > en_<ENGINE_NODE_NAME>clear_tracked_data() function.
> >     >     >
> >     >     > With this patch, an engine node can store any changes done
> >     to the
> >     >     engine data
> >     >     > separately in the engine change handlers. The parent of this
> >     >     engine node
> >     >     > can use this tracked data for incrementally processing the
> >     >     changes. Upcoming
> >     >     > patches in the series will make use of this.
> >     >     >
> >     >     > Signed-off-by: Numan Siddique <numans@ovn.org
> >     <mailto:numans@ovn.org> <mailto:numans@ovn.org <mailto:
> numans@ovn.org>>>
> >     >     > ---
> >     >     >  lib/inc-proc-eng.c | 6 +++++-
> >     >     >  lib/inc-proc-eng.h | 9 +++++++++
> >     >     >  2 files changed, 14 insertions(+), 1 deletion(-)
> >     >     >
> >     >     > diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
> >     >     > index 9b1479a1c..a9389f75b 100644
> >     >     > --- a/lib/inc-proc-eng.c
> >     >     > +++ b/lib/inc-proc-eng.c
> >     >     > @@ -260,6 +260,10 @@ engine_init_run(void)
> >     >     >      VLOG_DBG("Initializing new run");
> >     >     >      for (size_t i = 0; i < engine_n_nodes; i++) {
> >     >     >          engine_set_node_state(engine_nodes[i], EN_STALE);
> >     >     > +
> >     >     > +        if (engine_nodes[i]->clear_tracked_data) {
> >     >     > +
> >     >     engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
> >     >     > +        }
> >     >     >      }
> >     >     >  }
> >     >     >
> >     >     > @@ -370,7 +374,7 @@ engine_run(bool recompute_allowed)
> >     >     >
> >     >     >          if (engine_nodes[i]->state == EN_ABORTED) {
> >     >     >              engine_run_aborted = true;
> >     >     > -            return;
> >     >     > +            break;
> >     >
> >     >     I guess this is a leftover from a previous iteration of the
> >     series. It
> >     >     should be fine to return here.
> >     >
> >     >
> >     > Oops. Thanks. I'll fix it.
> >     >
> >     > Thanks
> >     > Numan
> >
> >     Hi Numan,
> >
> >     While reviewing the following patches I realized that it might be
> useful
> >     if in this patch we'd also call
> engine_nodes[i]->clear_tracked_data() in
> >     engine_cleanup(), what do you think?
> >
> >
> > I think we can call.  But since its part of engine data, engine data
> > cleanup should
> > free up any memory right ? Even if clear_tracked_data() is not called,
> > engine_data_cleanup()
> > should not leak the memory. The patch 6 in this series does that.
> >
>
> In patch 6 we call en_runtime_data_clear_tracked_data() from
> en_runtime_data_cleanup() which puts the burden on the I-P engine user
> to make sure to not forget to call the clear_tracked_data callback from
> the cleanup handler
>
> I think this should always be done, for all nodes, regardless of data
> contents, so I'd make sure that happens by calling the
> clear_tracked_data callback from within engine_data_cleanup().
>


Ok. I agree with you. If engine was calling  clear_tracked_data() at the
end of every run,
there was no need to call it during engine_data_cleanup().

Thanks
Numan


> Thanks,
> Dumitru
>
> >  Thanks
> > Numan
> >
> >
> >     Thanks,
> >     Dumitru
> >
> >     >
> >     >
> >     >
> >     >     With this fixed:
> >     >
> >     >     Acked-by: Dumitru Ceara <dceara@redhat.com
> >     <mailto:dceara@redhat.com> <mailto:dceara@redhat.com
> >     <mailto:dceara@redhat.com>>>
> >     >
> >     >     Thanks,
> >     >     Dumitru
> >     >
> >     >     >          }
> >     >     >      }
> >     >     >  }
> >     >     > diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
> >     >     > index 780c3cd22..552f2051a 100644
> >     >     > --- a/lib/inc-proc-eng.h
> >     >     > +++ b/lib/inc-proc-eng.h
> >     >     > @@ -149,6 +149,10 @@ struct engine_node {
> >     >     >       * doesn't store pointers to DB records it's still safe
> >     to use).
> >     >     >       */
> >     >     >      bool (*is_valid)(struct engine_node *);
> >     >     > +
> >     >     > +    /* Method to clear up tracked data maintained by the
> engine
> >     >     node in the
> >     >     > +     * engine 'data'. It may be NULL. */
> >     >     > +    void (*clear_tracked_data)(void *tracked_data);
> >     >     >  };
> >     >     >
> >     >     >  /* Initialize the data for the engine nodes. It calls each
> >     node's
> >     >     > @@ -275,6 +279,7 @@ void engine_ovsdb_node_add_index(struct
> >     >     engine_node *, const char *name,
> >     >     >          .run = en_##NAME##_run, \
> >     >     >          .cleanup = en_##NAME##_cleanup, \
> >     >     >          .is_valid = en_##NAME##_is_valid, \
> >     >     > +        .clear_tracked_data = NULL, \
> >     >     >      };
> >     >     >
> >     >     >  #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
> >     >     > @@ -284,6 +289,10 @@ void engine_ovsdb_node_add_index(struct
> >     >     engine_node *, const char *name,
> >     >     >      static bool (*en_##NAME##_is_valid)(struct engine_node
> >     *node)
> >     >     = NULL; \
> >     >     >      ENGINE_NODE_DEF(NAME, NAME_STR)
> >     >     >
> >     >     > +#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
> >     >     > +    ENGINE_NODE(NAME, NAME_STR) \
> >     >     > +    en_##NAME.clear_tracked_data =
> >     en_##NAME##_clear_tracked_data;
> >     >     > +
> >     >     >  /* Macro to define member functions of an engine node which
> >     >     represents
> >     >     >   * a table of OVSDB */
> >     >     >  #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \
> >     >     >
> >     >
> >     >     _______________________________________________
> >     >     dev mailing list
> >     >     dev@openvswitch.org <mailto:dev@openvswitch.org>
> >     <mailto:dev@openvswitch.org <mailto:dev@openvswitch.org>>
> >     >     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >     >
> >
> >     _______________________________________________
> >     dev mailing list
> >     dev@openvswitch.org <mailto:dev@openvswitch.org>
> >     https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
index 9b1479a1c..a9389f75b 100644
--- a/lib/inc-proc-eng.c
+++ b/lib/inc-proc-eng.c
@@ -260,6 +260,10 @@  engine_init_run(void)
     VLOG_DBG("Initializing new run");
     for (size_t i = 0; i < engine_n_nodes; i++) {
         engine_set_node_state(engine_nodes[i], EN_STALE);
+
+        if (engine_nodes[i]->clear_tracked_data) {
+            engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
+        }
     }
 }
 
@@ -370,7 +374,7 @@  engine_run(bool recompute_allowed)
 
         if (engine_nodes[i]->state == EN_ABORTED) {
             engine_run_aborted = true;
-            return;
+            break;
         }
     }
 }
diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
index 780c3cd22..552f2051a 100644
--- a/lib/inc-proc-eng.h
+++ b/lib/inc-proc-eng.h
@@ -149,6 +149,10 @@  struct engine_node {
      * doesn't store pointers to DB records it's still safe to use).
      */
     bool (*is_valid)(struct engine_node *);
+
+    /* Method to clear up tracked data maintained by the engine node in the
+     * engine 'data'. It may be NULL. */
+    void (*clear_tracked_data)(void *tracked_data);
 };
 
 /* Initialize the data for the engine nodes. It calls each node's
@@ -275,6 +279,7 @@  void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
         .run = en_##NAME##_run, \
         .cleanup = en_##NAME##_cleanup, \
         .is_valid = en_##NAME##_is_valid, \
+        .clear_tracked_data = NULL, \
     };
 
 #define ENGINE_NODE_CUSTOM_DATA(NAME, NAME_STR) \
@@ -284,6 +289,10 @@  void engine_ovsdb_node_add_index(struct engine_node *, const char *name,
     static bool (*en_##NAME##_is_valid)(struct engine_node *node) = NULL; \
     ENGINE_NODE_DEF(NAME, NAME_STR)
 
+#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
+    ENGINE_NODE(NAME, NAME_STR) \
+    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
+
 /* Macro to define member functions of an engine node which represents
  * a table of OVSDB */
 #define ENGINE_FUNC_OVSDB(DB_NAME, TBL_NAME) \