Suppose there are two databases, $D_1$ and $D_2$. Let's further assume $D_1$ is always up and $D_2$ can be down sometimes. When it goes up again, it has to restart.
$D_1$ is filled by say a dozen other systems with event messages. Those messages have IDs and might be updated or deleted. $D_2$ needs to be in sync with $D_1$, which is realized by:
- on restart, pull all data from $D_1$. During this pull $D_1$ is locked, thus all senders to $D_1$ need to wait.
- otherwise $D_1$ always informs $D_2$ of updates by sending all updates. (During fetching, the data is locked of course.)
Now the question: what kind of blocking behaviour can we expect from $D_1$ and $D_2$?
In particular I find the following corner case interesting and instructive:
$D_1$ currently has a long list of events and the sender systems send a lot of new events/updates. $D_2$ just went down, goes up now and needs to fetch events from $D_1$, thus blocking the whole chain.