[
https://issues.apache.org/jira/browse/SLING-13395?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Christian Schneider reassigned SLING-13395:
-------------------------------------------
Assignee: Christian Schneider
> DistributionSubscriber imports the same package twice when it is restarted
> during a topology change
> ---------------------------------------------------------------------------------------------------
>
> Key: SLING-13395
> URL: https://issues.apache.org/jira/browse/SLING-13395
> Project: Sling
> Issue Type: Bug
> Components: Content Distribution
> Reporter: Christian Schneider
> Assignee: Christian Schneider
> Priority: Major
> Fix For: Content Distribution Journal Core 0.6.0
>
>
> On a clustered instance, every topology change restarts all journal
> subscribers on the leader, even when the leader does not change. If a package
> import is still running at that moment, the restarted subscriber imports the
> same package again in parallel.
> How it happens:
> * OnlyOnLeader unregisters its service on every TOPOLOGY_CHANGING event and
> registers it again on TOPOLOGY_CHANGED. DistributionSubscriber has a static
> reference to OnlyOnLeader (SLING-12639), so it is deactivated and activated
> again on every topology change.
> * DistributionSubscriber.deactivate() does not interrupt the poller thread
> (SLING-9340) and does not wait for it, so an import that is already running
> continues.
> * The new subscriber instance starts at the last committed offset + 1, which
> is the offset still being imported by the old thread. The same package is
> then imported twice in parallel.
> * Both imports write the BookKeeper state for the same subscriber, so one of
> them can fail with an OakState0001 conflict on the subscriber store.
> The effect is significant when imports are slow (for example, an import that
> takes several minutes because of an expensive package builder) and the
> topology changes frequently (for example, instances joining and leaving the
> cluster). Several overlapping imports of the same offset were observed, each
> running for minutes.
> Proposed fix:
> * OnlyOnLeader: don't unregister on TOPOLOGY_CHANGING; only update the
> registration on TOPOLOGY_INIT/TOPOLOGY_CHANGED, and unregister only when the
> local instance is no longer the leader.
> * DistributionSubscriber.deactivate(): wake up a pending retry back-off and
> wait, bounded (30 s), for an import that is still running before returning.
> No locking between subscriber instances, to avoid hanging processing; a
> duplicate import remains possible when an import takes longer than the wait
> or when leadership really changes.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)