fre. 22. nov. 2019, 19:10 skrev Numan Siddique <[email protected]>:
> On Fri, Nov 22, 2019 at 8:22 PM Frode Nordahl
> <[email protected]> wrote:
> >
> > Move paused state to ``struct northd_context`` and pass the
> > context to paused and status command handlers.
> >
> > On pause release the OVSDB lock on SB DB.
> >
> > Re-instante the lock on resume.
> >
> > Status command will now provide accurate information for 'paused',
> > 'active' and 'standby' states.
> >
> > Merge separate status command test into the pause and resume tests.
> >
> > Signed-off-by: Frode Nordahl <[email protected]>
>
> Hi Frode,
>
> Thanks for the patch.
>
Thank you for the review, Numan.
Using ctx in the ctl functions doesn't seem right to me.
> When the user runs "ovn-appctl -t ovn-northd pause/resume" and if
> ctx->ovnsb_idl is NULL,
> then ovn_northd_pause()/ovn_northd_resume() will just ignore these
> commands.
>
I don't actually expect the ``ctx->ovnsb_idl`` to ever be NULL. It's just a
bone marrow reaction to always check before handing off something that can
be dereferenced.
I think you can call ovsdb_idl_set_lock with the appropriate params in
> the main while loop itself
> depending on the value of "paused".
>
I see what you mean, and having calls on the idl outside the main loop may
quickly get us into trouble I guess.
The problem I'm left with is that the status command function would need
access to both the ``paused`` and ``had_lock`` states.
What would you think about putting those in a new struct that we pass to
the pause, resume and status command functions?
--
Frode Nordahl
Thanks
> Numan
>
> > ---
> > northd/ovn-northd.8.xml | 9 +++--
> > northd/ovn-northd.c | 87 +++++++++++++++++++++++++++--------------
> > tests/ovn-northd.at | 24 +++++++-----
> > 3 files changed, 79 insertions(+), 41 deletions(-)
> >
> > diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
> > index 9734e79e6..c6d5d96b9 100644
> > --- a/northd/ovn-northd.8.xml
> > +++ b/northd/ovn-northd.8.xml
> > @@ -74,13 +74,15 @@
> > <dt><code>pause</code></dt>
> > <dd>
> > Pauses the ovn-northd operation from processing any Northbound
> and
> > - Southbound database changes.
> > + Southbound database changes. This will also instruct
> ovn-northd to
> > + drop any lock on SB DB.
> > </dd>
> >
> > <dt><code>resume</code></dt>
> > <dd>
> > Resumes the ovn-northd operation to process Northbound and
> > - Southbound database contents and generate logical flows.
> > + Southbound database contents and generate logical flows. This
> will
> > + also instruct ovn-northd to aspire for the lock on SB DB.
> > </dd>
> >
> > <dt><code>is-paused</code></dt>
> > @@ -91,7 +93,8 @@
> > <dt><code>status</code></dt>
> > <dd>
> > Prints this server's status. Status will be "active" if
> ovn-northd has
> > - acquired OVSDB lock on NB DB, "standby" otherwise.
> > + acquired OVSDB lock on SB DB, "standby" if it has not or
> "paused" if
> > + this instance is paused.
> > </dd>
> > </dl>
> > </p>
> > diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> > index a943e1037..e19515d14 100644
> > --- a/northd/ovn-northd.c
> > +++ b/northd/ovn-northd.c
> > @@ -65,6 +65,7 @@ struct northd_context {
> > struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name;
> > struct ovsdb_idl_index *sbrec_mcast_group_by_name_dp;
> > struct ovsdb_idl_index *sbrec_ip_mcast_by_dp;
> > + bool paused;
> > };
> >
> > /* An IPv4 or IPv6 address */
> > @@ -10836,6 +10837,8 @@ add_column_noalert(struct ovsdb_idl *idl,
> > ovsdb_idl_omit_alert(idl, column);
> > }
> >
> > +#define OVN_NORTHD_SB_DB_LOCK_NAME "ovn_northd"
> > +
> > int
> > main(int argc, char *argv[])
> > {
> > @@ -10843,8 +10846,10 @@ main(int argc, char *argv[])
> > struct unixctl_server *unixctl;
> > int retval;
> > bool exiting;
> > - bool paused;
> > bool had_lock;
> > + struct northd_context ctx;
> > +
> > + memset(&ctx, 0, sizeof(ctx));
> >
> > fatal_ignore_sigpipe();
> > ovs_cmdl_proctitle_init(argc, argv);
> > @@ -10866,11 +10871,11 @@ main(int argc, char *argv[])
> > exit(EXIT_FAILURE);
> > }
> > unixctl_command_register("exit", "", 0, 0, ovn_northd_exit,
> &exiting);
> > - unixctl_command_register("pause", "", 0, 0, ovn_northd_pause,
> &paused);
> > - unixctl_command_register("resume", "", 0, 0, ovn_northd_resume,
> &paused);
> > + unixctl_command_register("pause", "", 0, 0, ovn_northd_pause, &ctx);
> > + unixctl_command_register("resume", "", 0, 0, ovn_northd_resume,
> &ctx);
> > unixctl_command_register("is-paused", "", 0, 0,
> ovn_northd_is_paused,
> > - &paused);
> > - unixctl_command_register("status", "", 0, 0, ovn_northd_status,
> &had_lock);
> > + &ctx);
> > + unixctl_command_register("status", "", 0, 0, ovn_northd_status,
> &ctx);
> >
> > daemonize_complete();
> >
> > @@ -11075,23 +11080,21 @@ main(int argc, char *argv[])
> > /* Ensure that only a single ovn-northd is active in the deployment
> by
> > * acquiring a lock called "ovn_northd" on the southbound database
> > * and then only performing DB transactions if the lock is held. */
> > - ovsdb_idl_set_lock(ovnsb_idl_loop.idl, "ovn_northd");
> > + ovsdb_idl_set_lock(ovnsb_idl_loop.idl, OVN_NORTHD_SB_DB_LOCK_NAME);
> >
> > /* Main loop. */
> > exiting = false;
> > - paused = false;
> > + ctx.paused = false;
> > had_lock = false;
> > while (!exiting) {
> > - if (!paused) {
> > - struct northd_context ctx = {
> > - .ovnnb_idl = ovnnb_idl_loop.idl,
> > - .ovnnb_txn = ovsdb_idl_loop_run(&ovnnb_idl_loop),
> > - .ovnsb_idl = ovnsb_idl_loop.idl,
> > - .ovnsb_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop),
> > - .sbrec_ha_chassis_grp_by_name =
> sbrec_ha_chassis_grp_by_name,
> > - .sbrec_mcast_group_by_name_dp =
> sbrec_mcast_group_by_name_dp,
> > - .sbrec_ip_mcast_by_dp = sbrec_ip_mcast_by_dp,
> > - };
> > + if (!ctx.paused) {
> > + ctx.ovnnb_idl = ovnnb_idl_loop.idl;
> > + ctx.ovnnb_txn = ovsdb_idl_loop_run(&ovnnb_idl_loop);
> > + ctx.ovnsb_idl = ovnsb_idl_loop.idl;
> > + ctx.ovnsb_txn = ovsdb_idl_loop_run(&ovnsb_idl_loop);
> > + ctx.sbrec_ha_chassis_grp_by_name =
> sbrec_ha_chassis_grp_by_name;
> > + ctx.sbrec_mcast_group_by_name_dp =
> sbrec_mcast_group_by_name_dp;
> > + ctx.sbrec_ip_mcast_by_dp = sbrec_ip_mcast_by_dp;
> >
> > if (!had_lock && ovsdb_idl_has_lock(ovnsb_idl_loop.idl)) {
> > VLOG_INFO("ovn-northd lock acquired. "
> > @@ -11125,6 +11128,11 @@ main(int argc, char *argv[])
> > ovsdb_idl_run(ovnsb_idl_loop.idl);
> > ovsdb_idl_wait(ovnnb_idl_loop.idl);
> > ovsdb_idl_wait(ovnsb_idl_loop.idl);
> > + /*
> > + * the lock is dropped on pause, avoid incorrect message
> logged
> > + * about lock lost when resumed.
> > + */
> > + had_lock = false;
> > }
> >
> > unixctl_server_run(unixctl);
> > @@ -11159,30 +11167,41 @@ ovn_northd_exit(struct unixctl_conn *conn, int
> argc OVS_UNUSED,
> >
> > static void
> > ovn_northd_pause(struct unixctl_conn *conn, int argc OVS_UNUSED,
> > - const char *argv[] OVS_UNUSED, void *pause_)
> > + const char *argv[] OVS_UNUSED, void *ctx_)
> > {
> > - bool *pause = pause_;
> > - *pause = true;
> > + struct northd_context *ctx = ctx_;
> > +
> > + if (!ctx->paused && ctx->ovnsb_idl != NULL) {
> > + /* Drop our aspiration for the lock while paused */
> > + ovsdb_idl_set_lock(ctx->ovnsb_idl, NULL);
> > + ctx->paused = true;
> > + VLOG_INFO("This ovn-northd instance is now paused.");
> > + }
> >
> > unixctl_command_reply(conn, NULL);
> > }
> >
> > static void
> > ovn_northd_resume(struct unixctl_conn *conn, int argc OVS_UNUSED,
> > - const char *argv[] OVS_UNUSED, void *pause_)
> > + const char *argv[] OVS_UNUSED, void *ctx_)
> > {
> > - bool *pause = pause_;
> > - *pause = false;
> > + struct northd_context *ctx = ctx_;
> > +
> > + if (ctx->paused && ctx->ovnsb_idl != NULL) {
> > + /* Reinstate our aspiration for lock */
> > + ovsdb_idl_set_lock(ctx->ovnsb_idl, OVN_NORTHD_SB_DB_LOCK_NAME);
> > + ctx->paused = false;
> > + }
> >
> > unixctl_command_reply(conn, NULL);
> > }
> >
> > static void
> > ovn_northd_is_paused(struct unixctl_conn *conn, int argc OVS_UNUSED,
> > - const char *argv[] OVS_UNUSED, void *paused_)
> > + const char *argv[] OVS_UNUSED, void *ctx_)
> > {
> > - bool *paused = paused_;
> > - if (*paused) {
> > + struct northd_context *ctx = ctx_;
> > + if (ctx->paused) {
> > unixctl_command_reply(conn, "true");
> > } else {
> > unixctl_command_reply(conn, "false");
> > @@ -11191,15 +11210,25 @@ ovn_northd_is_paused(struct unixctl_conn
> *conn, int argc OVS_UNUSED,
> >
> > static void
> > ovn_northd_status(struct unixctl_conn *conn, int argc OVS_UNUSED,
> > - const char *argv[] OVS_UNUSED, void *had_lock_)
> > + const char *argv[] OVS_UNUSED, void *ctx_)
> > {
> > - bool *had_lock = had_lock_;
> > + struct northd_context *ctx = ctx_;
> > + char *status;
> > +
> > + if (ctx->paused) {
> > + status = "paused";
> > + } else if (ctx->ovnsb_idl != NULL) {
> > + status = ovsdb_idl_has_lock(ctx->ovnsb_idl) ? "active" :
> "standby";
> > + } else {
> > + status = "unknown";
> > + }
> > +
> > /*
> > * Use a labelled formatted output so we can add more to the status
> command
> > * later without breaking any consuming scripts
> > */
> > struct ds s = DS_EMPTY_INITIALIZER;
> > - ds_put_format(&s, "Status: %s\n", *had_lock ? "active" : "standby");
> > + ds_put_format(&s, "Status: %s\n", status);
> > unixctl_command_reply(conn, ds_cstr(&s));
> > ds_destroy(&s);
> > }
> > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> > index 1c94f2f65..d73a22f68 100644
> > --- a/tests/ovn-northd.at
> > +++ b/tests/ovn-northd.at
> > @@ -899,22 +899,18 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd])
> >
> > AT_CLEANUP
> >
> > -AT_SETUP([ovn -- ovn-northd status])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> > -ovn_start
> > -
> > -AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status:
> active
> > -])
> > -
> > -AT_CLEANUP
> > -
> > AT_SETUP([ovn -- ovn-northd pause and resume])
> > AT_SKIP_IF([test $HAVE_PYTHON = no])
> > ovn_start
> >
> > AT_CHECK([test xfalse = x`as northd ovn-appctl -t ovn-northd
> is-paused`])
> > +AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status:
> active
> > +])
> > AT_CHECK([test xfalse = x`as northd-backup ovn-appctl -t ovn-northd \
> > is-paused`])
> > +AT_CHECK([as northd-backup ovn-appctl -t ovn-northd status], [0],
> > +[Status: standby
> > +])
> >
> > ovn-nbctl ls-add sw0
> >
> > @@ -931,7 +927,12 @@ OVS_WAIT_UNTIL([
> > as northd ovs-appctl -t ovn-northd pause
> > as northd-backup ovs-appctl -t ovn-northd pause
> > AT_CHECK([test xtrue = x`as northd ovn-appctl -t ovn-northd is-paused`])
> > +AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status:
> paused
> > +])
> > AT_CHECK([test xtrue = x`as northd-backup ovn-appctl -t ovn-northd
> is-paused`])
> > +AT_CHECK([as northd-backup ovn-appctl -t ovn-northd status], [0],
> > +[Status: paused
> > +])
> >
> > ovn-nbctl ls-add sw0
> >
> > @@ -944,8 +945,13 @@ OVS_WAIT_UNTIL([
> > as northd ovs-appctl -t ovn-northd resume
> > as northd-backup ovs-appctl -t ovn-northd resume
> > AT_CHECK([test xfalse = x`as northd ovn-appctl -t ovn-northd
> is-paused`])
> > +AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status:
> active
> > +])
> > AT_CHECK([test xfalse = x`as northd-backup ovn-appctl -t ovn-northd \
> > is-paused`])
> > +AT_CHECK([as northd-backup ovn-appctl -t ovn-northd status], [0],
> > +[Status: standby
> > +])
> >
> > OVS_WAIT_UNTIL([
> > ovn-sbctl lflow-list sw0
> > --
> > 2.24.0
> >
> > .
> >
> > /
> > _______________________________________________
> > dev mailing list
> > [email protected]
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev