do not kill the master unless we have a dbInfo from the current cluster controller

This commit is contained in:
Evan Tschannen 2020-07-17 14:59:38 -07:00
parent e4613bcdb2
commit 6a38f81269
4 changed files with 6 additions and 6 deletions

View File

@ -192,7 +192,7 @@ struct LifetimeToken {
LifetimeToken() : count(0) {}
bool isStillValid( LifetimeToken const& latestToken, bool isLatestID ) const {
return (ccID == latestToken.ccID || !latestToken.ccID.isValid()) && (count >= latestToken.count || isLatestID);
return ccID == latestToken.ccID && (count >= latestToken.count || isLatestID);
}
std::string toString() const {
return ccID.shortString() + format("#%lld", count);

View File

@ -717,7 +717,7 @@ ACTOR Future<Void> storageServer(IKeyValueStore* persistentData, StorageServerIn
Reference<AsyncVar<ServerDBInfo>> db, std::string folder,
Promise<Void> recovered,
Reference<ClusterConnectionFile> connFile ); // changes pssi->id() to be the recovered ID); // changes pssi->id() to be the recovered ID
ACTOR Future<Void> masterServer(MasterInterface mi, Reference<AsyncVar<ServerDBInfo>> db,
ACTOR Future<Void> masterServer(MasterInterface mi, Reference<AsyncVar<ServerDBInfo>> db, Reference<AsyncVar<Optional<ClusterControllerFullInterface>>> ccInterface,
ServerCoordinators serverCoordinators, LifetimeToken lifetime, bool forceRecovery);
ACTOR Future<Void> masterProxyServer(MasterProxyInterface proxy, InitializeMasterProxyRequest req,
Reference<AsyncVar<ServerDBInfo>> db, std::string whitelistBinPaths);

View File

@ -1619,7 +1619,7 @@ ACTOR Future<Void> masterCore( Reference<MasterData> self ) {
throw internal_error();
}
ACTOR Future<Void> masterServer( MasterInterface mi, Reference<AsyncVar<ServerDBInfo>> db, ServerCoordinators coordinators, LifetimeToken lifetime, bool forceRecovery )
ACTOR Future<Void> masterServer( MasterInterface mi, Reference<AsyncVar<ServerDBInfo>> db, Reference<AsyncVar<Optional<ClusterControllerFullInterface>>> ccInterface, ServerCoordinators coordinators, LifetimeToken lifetime, bool forceRecovery )
{
state Future<Void> onDBChange = Void();
state PromiseStream<Future<Void>> addActor;
@ -1635,8 +1635,8 @@ ACTOR Future<Void> masterServer( MasterInterface mi, Reference<AsyncVar<ServerDB
loop choose {
when (wait( core )) { break; }
when (wait( onDBChange )) {
onDBChange = db->onChange();
if (!lifetime.isStillValid( db->get().masterLifetime, mi.id()==db->get().master.id() )) {
onDBChange = db->onChange() || ccInterface->onChange();
if (ccInterface->get().present() && db->get().clusterInterface == ccInterface->get().get() && !lifetime.isStillValid( db->get().masterLifetime, mi.id()==db->get().master.id() )) {
TraceEvent("MasterTerminated", mi.id()).detail("Reason", "LifetimeToken").detail("MyToken", lifetime.toString()).detail("CurrentToken", db->get().masterLifetime.toString());
TEST(true); // Master replaced, dying
if (BUGGIFY) wait( delay(5) );

View File

@ -1182,7 +1182,7 @@ ACTOR Future<Void> workerServer(
DUMPTOKEN( recruited.getCommitVersion );
//printf("Recruited as masterServer\n");
Future<Void> masterProcess = masterServer( recruited, dbInfo, ServerCoordinators( connFile ), req.lifetime, req.forceRecovery );
Future<Void> masterProcess = masterServer( recruited, dbInfo, ccInterface, ServerCoordinators( connFile ), req.lifetime, req.forceRecovery );
errorForwarders.add( zombie(recruited, forwardError( errors, Role::MASTER, recruited.id(), masterProcess )) );
req.reply.send(recruited);
}