mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-14 01:42:37 +08:00
Fix multiple PeekStream requests to log routers
There is a bug in how a log router handles streaming read: * Log router has a `logRouterPeekStream` actor A running. * Remote tlog detects some problem and starts another streaming connection (maybe just reuse the connection?) * Log router now has a new `logRouterPeekStream` actor B running. * B runs and found that popped version > reqBegin, so `LogRouterPeekPopped` . This is because A is still running and changed the popped version. * A ends with `TLogPeekStreamEnd operation_obsolete` * B become stuck at `wait(req.reply.onReady() && store(reply.rep, future)`, because the future was sent `Never()`. As a result, the remote tlog can no longer retrieve data from this log router. Fix by killing the `logRouterPeekStream` B.
This commit is contained in:
parent
eb436ec14b
commit
0a03b190da
@ -18,21 +18,24 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "flow/ActorCollection.h"
|
||||
#include "fdbclient/NativeAPI.actor.h"
|
||||
#include "fdbrpc/Stats.h"
|
||||
#include "fdbserver/WorkerInterface.actor.h"
|
||||
#include "fdbserver/WaitFailure.h"
|
||||
#include "fdbserver/Knobs.h"
|
||||
#include "fdbserver/ServerDBInfo.h"
|
||||
#include "fdbserver/LogSystem.h"
|
||||
#include "fdbclient/SystemData.h"
|
||||
#include "fdbserver/ApplyMetadataMutation.h"
|
||||
#include "fdbserver/RecoveryState.h"
|
||||
#include "fdbclient/Atomic.h"
|
||||
#include "fdbclient/NativeAPI.actor.h"
|
||||
#include "fdbclient/SystemData.h"
|
||||
#include "fdbrpc/Stats.h"
|
||||
#include "fdbserver/ApplyMetadataMutation.h"
|
||||
#include "fdbserver/Knobs.h"
|
||||
#include "fdbserver/LogSystem.h"
|
||||
#include "fdbserver/WaitFailure.h"
|
||||
#include "fdbserver/WorkerInterface.actor.h"
|
||||
#include "fdbserver/RecoveryState.h"
|
||||
#include "fdbserver/ServerDBInfo.h"
|
||||
#include "fdbserver/TLogInterface.h"
|
||||
#include "flow/ActorCollection.h"
|
||||
#include "flow/Arena.h"
|
||||
#include "flow/Histogram.h"
|
||||
#include "flow/TDMetric.actor.h"
|
||||
#include "flow/network.h"
|
||||
|
||||
#include "flow/actorcompiler.h" // This must be the last #include.
|
||||
|
||||
struct LogRouterData {
|
||||
@ -526,6 +529,10 @@ Future<Void> logRouterPeekMessages(PromiseType replyPromise,
|
||||
.detail("Begin", reqBegin)
|
||||
.detail("Popped", poppedVer)
|
||||
.detail("Start", self->startVersion);
|
||||
if (std::is_same<PromiseType, Promise<TLogPeekReply>>::value) {
|
||||
// kills logRouterPeekStream actor, otherwise that actor becomes stuck
|
||||
throw operation_obsolete();
|
||||
}
|
||||
replyPromise.send(Never());
|
||||
if (reqSequence.present()) {
|
||||
auto& trackerData = self->peekTracker[peekId];
|
||||
|
Loading…
x
Reference in New Issue
Block a user