On Wed, Feb 23, 2022 at 12:35 AM Dumitru Ceara <dce...@redhat.com> wrote:
>
> On 2/23/22 09:24, Dumitru Ceara wrote:
> > On 2/23/22 07:27, Han Zhou wrote:
> >> On Fri, Feb 11, 2022 at 12:52 AM Dumitru Ceara <dce...@redhat.com>
wrote:
> >>>
> >>> On 2/11/22 00:54, Numan Siddique wrote:
> >>>> On Thu, Jan 27, 2022 at 10:00 AM Dumitru Ceara <dce...@redhat.com>
> >> wrote:
> >>>>>
> >>>>> We still need to try to ovsdb_idl_loop_commit_and_wait() on
instances
> >>>>> that are in standby mode.  That's because they need to try to take
the
> >>>>> lock.  But if they're in standby they won't actually build a
> >> transaction
> >>>>> json and will return early because they don't own the SB lock.
> >>>>>
> >>>>> That's reported as an error by ovsdb_idl_loop_commit_and_wait() but
we
> >>>>> shouldn't act on it.
> >>>>>
> >>>>> Also, to ensure that no DB changes are missed,
ovsdb_idl_track_clear()
> >>>>> should be called only on active instances.  The standby or paused
ones
> >>>>> will get the incremental updates when they become active.
Otherwise we
> >>>>> would be forced to perform a full recompute when the instance
becomes
> >>>>> active.
> >>>>
> >>>> Hi Dumitru,
> >>>>
> >>>
> >>> Hi Numan,
> >>>
> >>> Thanks for the review!
> >>>
> >>>> I've a question on the track clear being moved out of the standby
> >> instances.
> >>>> To ensure correctness,  I suppose it's better to trigger a full
> >> recompute when a
> >>>> standby instance becomes active. What do you think?
> >>>>
> >>>
> >>> I might be wrong but I don't think that's necessary.  It may also be
> >>> quite costly as full recomputes can take quite long.
> >>>
> >>>> Also lets say CMS does the below operations
> >>>>      - Add a logical switch S1
> >>>>      - Add a  logical port p1 in S1
> >>>>      - Add a logical port p2 in S1
> >>>>      - Delete logical port p2
> >>>>      - Delete a logical switch.
> >>>>
> >>>> With this patch since we are not clearing the tracking information,
> >>>> how does ovn-northd
> >>>> process the tracked changes when it becomes active ?
> >>>
> >>> When ovn-northd becomes active, from a Northbound database
perspective,
> >>> there were no changes; that is, S1 didn't exist when it was last
active
> >>> and it doesn't exist now either.
> >>>
> >>> So, there should be no NB change to process.  Accumulating tracked
> >>> changes without calling clear() on the standby has exactly this
effect.
> >>
> >> Hi Dumitru,
> >>
> >
> > Hi Han,
> >
> >> I wonder how accumulating tracked changes without calling clear() would
> >> work.
> >>
> >> Firstly, I was under the impression that ovsdb_idl_track_clear() must
be
> >> called before the next ovsdb_idl_run(), and the current change tracking
> >> implementation cannot safely carry tracking information across the
> >> iterations. This was why in ovn-controller whenever (!engine_has_run()
&&
> >> engine_need_run()) we force recompute in the next iteration. If changes
> >> could be carried over we would have incrementally processed the
accumulated
> >> changes without forcing recompute. I can't recall the details, and I
> >> checked the IDL again briefly but I didn't find the exact reason why
it is
> >> not safe. But I believe it was never used this way before. I should
have
> >> added a TODO for this (but somehow forgot to, sorry).
> >>
> >
> > I've been looking at that code too and I don't see any reason why
> > accumulating changes wouldn't work.  The IDL code is written such that
> > it processes multiple jsonrpc updates in a single run anyway:
> >
> > ovsdb_idl_run() -> ovsdb_cs_run() -> which can receive up to 50
> > (hardcoded) jsonrpc messages.
> >
Maybe you are right, but I am not sure. It's true that IDL run can process
multiple messages, but there are functions called once for every IDL run,
after processing all the messages:
ovsdb_idl_reparse_refs_to_inserted, ovsdb_idl_reparse_deleted,
ovsdb_idl_row_destroy_postprocess, etc.

Is it possible any of these could cause problems with change tracking left
with the previous run? I haven't looked deeper yet.

> > It's possible that I missed something though, the IDL functionality is
> > complex, so maybe it's worth documenting that we recommend calling
> > ovsdb_idl_track_clear() every time ovsdb_idl_run() is called, and why.
> > What do you think?
> >

There is a comment above the ovsdb_idl_track_clear() which suggests calling
it before ovsdb_idl_run(), but it doesn't mention if it is mandatory. I
might have just followed the comment.

> >> Secondly, even if it is safe to accumulate changes, it is going to be a
> >> memory problem. Active-standby failover happens very rarely in a
healthy
> >> production environment. So even if the DB size is small, the change
> >> tracking can grow without any limit. I tried with this patch by doing
> >> simply a loop of adding and deleting a single logical switch 10k times
on
> >> top of an empty NB DB, and the standby northd's memory grew to 1.1GB.
> >>
> >
> > This is surprising, sounds like an issue in the IDL, I would've expected
> > the delete to just remove the record from the track list.  I'll look
> > into it.
> >
I wasn't surprised because I thought tracked changes were append-only, and
only got cleared by ovsdb_idl_track_clear() or ovsdb_idl_clear(). I just
recalled that the ovsdb_idl_row_untrack_change() was added some time ago
and it may change the behavior.

>
> I had a quick look, it's because deleting a row clears its datum, sets
> tracked_old_datum and adds it to the deleted track list.  The subsequent
> "add" will not find this row, and will insert a new one.
>

I don't expect the subsequent add would find the deleted item and remove it
from the tracking. In general, every add would create a new object with a
new UUID. IDL doesn't and shouldn't understand if it is the "same" to an
earlier deleted object. Think about a more general case when we keep adding
and deleting items with different names every time.

However, for the problem here, it is more about delete-after-add. I think
it is possible to avoid maintaining the items that are deleted before being
processed by the client. Be it a bug-fix or a new feature, we can improve
this, and then the tracked change size shouldn't grow much when the total
DB size is stable.

> We probably need to fix this anyway because even in the current
> implementation the IDL can process up to 50 consecutive
> "add/delete/add/delete/.." updates.  This can potentially cause issues
> due to "spurious" delete events when the client finally processes the
> tracked changes.
>

I *think* it shouldn't cause problems for the current implementation,
except that there can be wasted cycles to process an object addition and
its deletion in the same iteration, which should be fine because the case
should be rare anyway. Each add creates a new object with a new UUID, so to
the client (ovn-controller) it just processes different objects. Please let
me know if you find anything possibly going wrong here, then it's a bug.

> >> Thirdly, processing all the tracked changes when standby becomes
active is
> >> likely taking higher cost than recompute, if the tracked change size is
> >> bigger than the DB size.
> >>
> >
> > If changes are accumulated correctly, the total number of the tracked
> > record changes should never be larger than the size of the DB the last
> > time changes were processed + the size of the DB now, resulting in a
> > cost to process of O(size-of-DB), the same as for full recompute.  Or am
> > I missing something?
> >

My conclusion was based on the fact that the delete-after-add operations
are accumulated. If we can avoid that, and if the incremental processing is
implemented efficiently, i.e. the extra overhead of handling each change is
small enough, then yes I agree with you it is in the worst case similar to
full recompute.
However it would really depend on the implementation. A bad example in
ovn-controller is the change handling for anything referenced by a logical
flow. It used to reprocess the same lflow again and again when there are
multiple reference changes (now this is avoided).
Recompute has an advantage that it guarantees the upper bound time for the
worst case, but of course not efficient if the tracked changes are not big
enough - in the failover scenario since it happens rarely, it is more
likely that the accumulated change size is big, so in that case probably
recompute is not a bad idea.

Recompute may also avoid the complexity of corner cases during failover.

But again it depends on how we implement I-P in northd. We can change it to
I-P whenever we find it more feasible.

> >> So for now I would suggest keeping the logic of clearing tracking on
every
> >> iteration and force recompute when failover.
> >>
> >
> > At least until we figure out why the memory increase in the IDL, I agree
> > to keep forcing a recompute on failover.  That's also because we
> > currently don't really incrementally process much in ovn-northd.
> >
> > I'll send a v2.

Thanks! Looking at it.

Han

> >
> >> Thanks,
> >> Han
> >>
> >
> > Thanks,
> > Dumitru
> >
> >>>
> >>> From a Southbound database perspective there are two cases:
> >>>
> >>> a. The former active northd processed some (but not all) of the NB
> >>> changes and executed their corresponding SB transactions.  In this
case,
> >>> the standby northd also receives update messages for the SB records
that
> >>> were changed.  The standby northd tracks these changes.
> >>>
> >>> When the standby northd becomes active it will:
> >>> - determine that NB state didn't change
> >>> - SB state changed and needs to be reconciled (today we do this with
the
> >>> help of a NULL change handler for SB_* tables which will trigger a
full
> >>> recompute).
> >>>
> >>> b. The former active northd processed all of the NB changes and
executed
> >>> their corresponding SB transactions.  In this case, the final state of
> >>> the NB and SB databases should be equivalent to their initial states.
> >>> NB/SB changes will be accumulated by the change tracking mechanism on
> >>> the standby resulting in empty tracked changes lists.  This is fine
> >>> because the new active northd doesn't need to do anything, the DB
> >>> contents are already consistent.
> >>>
> >>> c. The former active northd processed none of the NB changes yet.
This
> >>> is very similar to case "b" above, the new active northd doesn't need
to
> >>> change anything in the NB/SB and it won't do that either.
> >>>
> >>>>
> >>>> Thanks
> >>>> Numan
> >>>>
> >>>
> >>> Thanks,
> >>> Dumitru
> >>>
> >>> _______________________________________________
> >>> dev mailing list
> >>> d...@openvswitch.org
> >>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >>
> >
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to