fixed even more bugs
This commit is contained in:
parent
5ac4de8775
commit
5852a6301b
|
@ -341,7 +341,9 @@ ACTOR Future<Void> logRouterPop( LogRouterData* self, TLogPopRequest req ) {
|
||||||
Void _ = wait(yield(TaskUpdateStorage));
|
Void _ = wait(yield(TaskUpdateStorage));
|
||||||
}
|
}
|
||||||
|
|
||||||
self->logSystem->get()->pop(minPopped, self->routerTag);
|
if(self->logSystem->get()) {
|
||||||
|
self->logSystem->get()->pop(minPopped, self->routerTag);
|
||||||
|
}
|
||||||
req.reply.send(Void());
|
req.reply.send(Void());
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
|
@ -362,7 +364,7 @@ ACTOR Future<Void> logRouterCore(
|
||||||
loop choose {
|
loop choose {
|
||||||
when( Void _ = wait( dbInfoChange ) ) {
|
when( Void _ = wait( dbInfoChange ) ) {
|
||||||
dbInfoChange = db->onChange();
|
dbInfoChange = db->onChange();
|
||||||
if( db->get().recoveryState >= RecoveryState::FULLY_RECOVERED && logSet < db->get().logSystemConfig.tLogs.size() &&
|
if( db->get().recoveryState >= RecoveryState::FULLY_RECOVERED && logSet < db->get().logSystemConfig.tLogs.size() &&
|
||||||
std::count( db->get().logSystemConfig.tLogs[logSet].logRouters.begin(), db->get().logSystemConfig.tLogs[logSet].logRouters.end(), interf.id() ) ) {
|
std::count( db->get().logSystemConfig.tLogs[logSet].logRouters.begin(), db->get().logSystemConfig.tLogs[logSet].logRouters.end(), interf.id() ) ) {
|
||||||
logRouterData.logSystem->set(ILogSystem::fromServerDBInfo( logRouterData.dbgid, db->get() ));
|
logRouterData.logSystem->set(ILogSystem::fromServerDBInfo( logRouterData.dbgid, db->get() ));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -189,6 +189,9 @@ struct ILogSystem {
|
||||||
// (3) the cursor cannot return any more results
|
// (3) the cursor cannot return any more results
|
||||||
virtual bool isActive() = 0;
|
virtual bool isActive() = 0;
|
||||||
|
|
||||||
|
//returns true if the cursor cannot return any more results
|
||||||
|
virtual bool isExhausted() = 0;
|
||||||
|
|
||||||
// Returns the smallest possible message version which the current message (if any) or a subsequent message might have
|
// Returns the smallest possible message version which the current message (if any) or a subsequent message might have
|
||||||
// (If hasMessage(), this is therefore the message version of the current message)
|
// (If hasMessage(), this is therefore the message version of the current message)
|
||||||
virtual LogMessageVersion version() = 0;
|
virtual LogMessageVersion version() = 0;
|
||||||
|
@ -252,6 +255,8 @@ struct ILogSystem {
|
||||||
|
|
||||||
virtual bool isActive();
|
virtual bool isActive();
|
||||||
|
|
||||||
|
virtual bool isExhausted();
|
||||||
|
|
||||||
virtual LogMessageVersion version();
|
virtual LogMessageVersion version();
|
||||||
|
|
||||||
virtual Version popped();
|
virtual Version popped();
|
||||||
|
@ -313,6 +318,8 @@ struct ILogSystem {
|
||||||
|
|
||||||
virtual bool isActive();
|
virtual bool isActive();
|
||||||
|
|
||||||
|
virtual bool isExhausted();
|
||||||
|
|
||||||
virtual LogMessageVersion version();
|
virtual LogMessageVersion version();
|
||||||
|
|
||||||
virtual Version popped();
|
virtual Version popped();
|
||||||
|
@ -369,6 +376,8 @@ struct ILogSystem {
|
||||||
|
|
||||||
virtual bool isActive();
|
virtual bool isActive();
|
||||||
|
|
||||||
|
virtual bool isExhausted();
|
||||||
|
|
||||||
virtual LogMessageVersion version();
|
virtual LogMessageVersion version();
|
||||||
|
|
||||||
virtual Version popped();
|
virtual Version popped();
|
||||||
|
@ -413,6 +422,8 @@ struct ILogSystem {
|
||||||
|
|
||||||
virtual bool isActive();
|
virtual bool isActive();
|
||||||
|
|
||||||
|
virtual bool isExhausted();
|
||||||
|
|
||||||
virtual LogMessageVersion version();
|
virtual LogMessageVersion version();
|
||||||
|
|
||||||
virtual Version popped();
|
virtual Version popped();
|
||||||
|
|
|
@ -233,6 +233,10 @@ bool ILogSystem::ServerPeekCursor::isActive() {
|
||||||
return IFailureMonitor::failureMonitor().getState( interf->get().interf().peekMessages.getEndpoint() ).isAvailable();
|
return IFailureMonitor::failureMonitor().getState( interf->get().interf().peekMessages.getEndpoint() ).isAvailable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ILogSystem::ServerPeekCursor::isExhausted() {
|
||||||
|
return messageVersion >= end;
|
||||||
|
}
|
||||||
|
|
||||||
LogMessageVersion ILogSystem::ServerPeekCursor::version() { return messageVersion; } // Call only after nextMessage(). The sequence of the current message, or results.end if nextMessage() has returned false.
|
LogMessageVersion ILogSystem::ServerPeekCursor::version() { return messageVersion; } // Call only after nextMessage(). The sequence of the current message, or results.end if nextMessage() has returned false.
|
||||||
|
|
||||||
Version ILogSystem::ServerPeekCursor::popped() { return poppedVersion; }
|
Version ILogSystem::ServerPeekCursor::popped() { return poppedVersion; }
|
||||||
|
@ -356,6 +360,10 @@ void ILogSystem::MergedPeekCursor::advanceTo(LogMessageVersion n) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ACTOR Future<Void> mergedPeekGetMore(ILogSystem::MergedPeekCursor* self, LogMessageVersion startVersion) {
|
ACTOR Future<Void> mergedPeekGetMore(ILogSystem::MergedPeekCursor* self, LogMessageVersion startVersion) {
|
||||||
|
if(self->bestServer >= 0 && self->serverCursors[self->bestServer]->isExhausted()) {
|
||||||
|
return Never();
|
||||||
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
//TraceEvent("MPC_getMoreA", self->randomID).detail("start", startVersion.toString());
|
//TraceEvent("MPC_getMoreA", self->randomID).detail("start", startVersion.toString());
|
||||||
if(self->bestServer >= 0 && self->serverCursors[self->bestServer]->isActive()) {
|
if(self->bestServer >= 0 && self->serverCursors[self->bestServer]->isActive()) {
|
||||||
|
@ -402,6 +410,11 @@ bool ILogSystem::MergedPeekCursor::isActive() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ILogSystem::MergedPeekCursor::isExhausted() {
|
||||||
|
ASSERT(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
LogMessageVersion ILogSystem::MergedPeekCursor::version() { return messageVersion; }
|
LogMessageVersion ILogSystem::MergedPeekCursor::version() { return messageVersion; }
|
||||||
|
|
||||||
Version ILogSystem::MergedPeekCursor::popped() {
|
Version ILogSystem::MergedPeekCursor::popped() {
|
||||||
|
@ -469,8 +482,8 @@ void ILogSystem::SetPeekCursor::calcHasMessage() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hasNextMessage = false;
|
||||||
if(useBestSet) {
|
if(useBestSet) {
|
||||||
hasNextMessage = false;
|
|
||||||
updateMessage(bestSet, false); // Use Quorum logic
|
updateMessage(bestSet, false); // Use Quorum logic
|
||||||
|
|
||||||
if(!hasNextMessage) {
|
if(!hasNextMessage) {
|
||||||
|
@ -575,12 +588,17 @@ void ILogSystem::SetPeekCursor::advanceTo(LogMessageVersion n) {
|
||||||
|
|
||||||
ACTOR Future<Void> setPeekGetMore(ILogSystem::SetPeekCursor* self, LogMessageVersion startVersion) {
|
ACTOR Future<Void> setPeekGetMore(ILogSystem::SetPeekCursor* self, LogMessageVersion startVersion) {
|
||||||
loop {
|
loop {
|
||||||
//TraceEvent("LPC_getMoreA", self->randomID).detail("start", startVersion.toString());
|
if(self->bestServer >= 0 && self->bestSet >= 0 && self->serverCursors[self->bestSet][self->bestServer]->isExhausted()) {
|
||||||
|
return Never();
|
||||||
|
}
|
||||||
|
|
||||||
|
//TraceEvent("LPC_getMore1", self->randomID).detail("start", startVersion.toString()).detail("t", self->tag);
|
||||||
if(self->bestServer >= 0 && self->bestSet >= 0 && self->serverCursors[self->bestSet][self->bestServer]->isActive()) {
|
if(self->bestServer >= 0 && self->bestSet >= 0 && self->serverCursors[self->bestSet][self->bestServer]->isActive()) {
|
||||||
ASSERT(!self->serverCursors[self->bestSet][self->bestServer]->hasMessage());
|
ASSERT(!self->serverCursors[self->bestSet][self->bestServer]->hasMessage());
|
||||||
Void _ = wait( self->serverCursors[self->bestSet][self->bestServer]->getMore() || self->serverCursors[self->bestSet][self->bestServer]->onFailed() );
|
Void _ = wait( self->serverCursors[self->bestSet][self->bestServer]->getMore() || self->serverCursors[self->bestSet][self->bestServer]->onFailed() );
|
||||||
self->useBestSet = true;
|
self->useBestSet = true;
|
||||||
} else {
|
} else {
|
||||||
|
//FIXME: if best set is exhausted, do not peek remote servers
|
||||||
bool bestSetValid = self->bestSet >= 0;
|
bool bestSetValid = self->bestSet >= 0;
|
||||||
if(bestSetValid) {
|
if(bestSetValid) {
|
||||||
self->localityGroup.clear();
|
self->localityGroup.clear();
|
||||||
|
@ -645,6 +663,11 @@ bool ILogSystem::SetPeekCursor::isActive() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ILogSystem::SetPeekCursor::isExhausted() {
|
||||||
|
ASSERT(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
LogMessageVersion ILogSystem::SetPeekCursor::version() { return messageVersion; }
|
LogMessageVersion ILogSystem::SetPeekCursor::version() { return messageVersion; }
|
||||||
|
|
||||||
Version ILogSystem::SetPeekCursor::popped() {
|
Version ILogSystem::SetPeekCursor::popped() {
|
||||||
|
@ -717,6 +740,10 @@ bool ILogSystem::MultiCursor::isActive() {
|
||||||
return cursors.back()->isActive();
|
return cursors.back()->isActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ILogSystem::MultiCursor::isExhausted() {
|
||||||
|
return cursors.back()->isActive();
|
||||||
|
}
|
||||||
|
|
||||||
LogMessageVersion ILogSystem::MultiCursor::version() {
|
LogMessageVersion ILogSystem::MultiCursor::version() {
|
||||||
return cursors.back()->version();
|
return cursors.back()->version();
|
||||||
}
|
}
|
||||||
|
|
|
@ -729,7 +729,9 @@ ACTOR Future<Void> commitBatch(
|
||||||
// txnState (transaction subsystem state) tag: message extracted from log adapter
|
// txnState (transaction subsystem state) tag: message extracted from log adapter
|
||||||
bool firstMessage = true;
|
bool firstMessage = true;
|
||||||
for(auto m : msg.messages) {
|
for(auto m : msg.messages) {
|
||||||
toCommit.addTag(txsTag);
|
if(firstMessage) {
|
||||||
|
toCommit.addTag(txsTag);
|
||||||
|
}
|
||||||
toCommit.addMessage(StringRef(m.begin(), m.size()), !firstMessage);
|
toCommit.addMessage(StringRef(m.begin(), m.size()), !firstMessage);
|
||||||
firstMessage = false;
|
firstMessage = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -853,7 +853,7 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ACTOR static Future<Void> newRemoteEpoch( TagPartitionedLogSystem* self, vector<WorkerInterface> remoteTLogWorkers, vector<WorkerInterface> logRouterWorkers, DatabaseConfiguration configuration, LogEpoch recoveryCount, Version recoveryVersion, Tag minTag, int logNum )
|
ACTOR static Future<Void> newRemoteEpoch( TagPartitionedLogSystem* self, Reference<TagPartitionedLogSystem> oldLogSystem, vector<WorkerInterface> remoteTLogWorkers, vector<WorkerInterface> logRouterWorkers, DatabaseConfiguration configuration, LogEpoch recoveryCount, Tag minTag, int logNum )
|
||||||
{
|
{
|
||||||
//recruit temporary log routers and update registration with them
|
//recruit temporary log routers and update registration with them
|
||||||
state int tempLogRouters = std::max<int>(logRouterWorkers.size(), SERVER_KNOBS->MIN_TAG - minTag + 1);
|
state int tempLogRouters = std::max<int>(logRouterWorkers.size(), SERVER_KNOBS->MIN_TAG - minTag + 1);
|
||||||
|
@ -883,8 +883,9 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
|
||||||
InitializeTLogRequest &req = remoteTLogReqs[i];
|
InitializeTLogRequest &req = remoteTLogReqs[i];
|
||||||
req.recruitmentID = remoteRecruitmentID;
|
req.recruitmentID = remoteRecruitmentID;
|
||||||
req.storeType = configuration.tLogDataStoreType;
|
req.storeType = configuration.tLogDataStoreType;
|
||||||
req.recoverFrom = self->getLogSystemConfig();
|
req.recoverFrom = oldLogSystem->getLogSystemConfig();
|
||||||
req.recoverAt = recoveryVersion;
|
req.recoverAt = oldLogSystem->epochEndVersion.get();
|
||||||
|
req.knownCommittedVersion = oldLogSystem->knownCommittedVersion;
|
||||||
req.epoch = recoveryCount;
|
req.epoch = recoveryCount;
|
||||||
req.remoteTag = SERVER_KNOBS->MAX_TAG + i;
|
req.remoteTag = SERVER_KNOBS->MAX_TAG + i;
|
||||||
}
|
}
|
||||||
|
@ -894,7 +895,7 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
|
||||||
self->tLogs[logNum]->updateLocalitySet(remoteTLogWorkers);
|
self->tLogs[logNum]->updateLocalitySet(remoteTLogWorkers);
|
||||||
|
|
||||||
vector<int> locations;
|
vector<int> locations;
|
||||||
for( Tag tag : self->epochEndTags ) {
|
for( Tag tag : oldLogSystem->epochEndTags ) {
|
||||||
locations.clear();
|
locations.clear();
|
||||||
self->tLogs[logNum]->getPushLocations( vector<Tag>(1, tag), locations, 0 );
|
self->tLogs[logNum]->getPushLocations( vector<Tag>(1, tag), locations, 0 );
|
||||||
for(int loc : locations)
|
for(int loc : locations)
|
||||||
|
@ -997,7 +998,7 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
|
||||||
for( int i = 0; i < logSystem->tLogs[0]->logServers.size(); i++)
|
for( int i = 0; i < logSystem->tLogs[0]->logServers.size(); i++)
|
||||||
recoveryComplete.push_back( transformErrors( throwErrorOr( logSystem->tLogs[0]->logServers[i]->get().interf().recoveryFinished.getReplyUnlessFailedFor( TLogRecoveryFinishedRequest(), SERVER_KNOBS->TLOG_TIMEOUT, SERVER_KNOBS->MASTER_FAILURE_SLOPE_DURING_RECOVERY ) ), master_recovery_failed() ) );
|
recoveryComplete.push_back( transformErrors( throwErrorOr( logSystem->tLogs[0]->logServers[i]->get().interf().recoveryFinished.getReplyUnlessFailedFor( TLogRecoveryFinishedRequest(), SERVER_KNOBS->TLOG_TIMEOUT, SERVER_KNOBS->MASTER_FAILURE_SLOPE_DURING_RECOVERY ) ), master_recovery_failed() ) );
|
||||||
logSystem->recoveryComplete = waitForAll(recoveryComplete);
|
logSystem->recoveryComplete = waitForAll(recoveryComplete);
|
||||||
logSystem->remoteRecovery = TagPartitionedLogSystem::newRemoteEpoch(logSystem.getPtr(), remoteTLogWorkers, logRouterWorkers, configuration, recoveryCount, oldLogSystem->epochEndVersion.get(), minTag, 1);
|
logSystem->remoteRecovery = TagPartitionedLogSystem::newRemoteEpoch(logSystem.getPtr(), oldLogSystem, remoteTLogWorkers, logRouterWorkers, configuration, recoveryCount, minTag, 1);
|
||||||
Void _ = wait(logSystem->remoteRecovery);
|
Void _ = wait(logSystem->remoteRecovery);
|
||||||
|
|
||||||
return logSystem;
|
return logSystem;
|
||||||
|
|
Loading…
Reference in New Issue