Make RecoveryState an enum class.
This means that all the == 7 or != 0 checks go away, and explicit names must be used.
This commit is contained in:
parent
e12b7a79aa
commit
fcfa00928b
|
@ -1455,7 +1455,7 @@ void clusterRegisterMaster( ClusterControllerData* self, RegisterMasterRequest c
|
|||
req.reply.send( Void() );
|
||||
|
||||
TraceEvent("MasterRegistrationReceived", self->id).detail("DbName", printable(req.dbName)).detail("MasterId", req.id).detail("Master", req.mi.toString()).detail("Tlogs", describe(req.logSystemConfig.tLogs)).detail("Resolvers", req.resolvers.size())
|
||||
.detail("RecoveryState", req.recoveryState).detail("RegistrationCount", req.registrationCount).detail("Proxies", req.proxies.size()).detail("RecoveryCount", req.recoveryCount);
|
||||
.detail("RecoveryState", (int)req.recoveryState).detail("RegistrationCount", req.registrationCount).detail("Proxies", req.proxies.size()).detail("RecoveryCount", req.recoveryCount);
|
||||
|
||||
//make sure the request comes from an active database
|
||||
auto db = &self->db;
|
||||
|
@ -2036,4 +2036,4 @@ ACTOR Future<Void> clusterController( Reference<ClusterConnectionFile> connFile,
|
|||
|
||||
hasConnected = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "fdbclient/MasterProxyInterface.h"
|
||||
#include "fdbclient/DatabaseConfiguration.h"
|
||||
#include "MasterInterface.h"
|
||||
#include "RecoveryState.h"
|
||||
#include "TLogInterface.h"
|
||||
#include "WorkerInterface.h"
|
||||
#include "Knobs.h"
|
||||
|
@ -200,8 +201,8 @@ struct RegisterMasterRequest {
|
|||
int64_t registrationCount;
|
||||
Optional<DatabaseConfiguration> configuration;
|
||||
vector<UID> priorCommittedLogServers;
|
||||
int recoveryState;
|
||||
|
||||
RecoveryState recoveryState;
|
||||
|
||||
ReplyPromise<Void> reply;
|
||||
|
||||
RegisterMasterRequest() {}
|
||||
|
|
|
@ -366,7 +366,7 @@ ACTOR Future<Void> logRouterCore(
|
|||
loop choose {
|
||||
when( Void _ = wait( dbInfoChange ) ) {
|
||||
dbInfoChange = db->onChange();
|
||||
logRouterData.allowPops = db->get().recoveryState == 7;
|
||||
logRouterData.allowPops = db->get().recoveryState == RecoveryState::REMOTE_RECOVERED;
|
||||
logRouterData.logSystem->set(ILogSystem::fromServerDBInfo( logRouterData.dbgid, db->get(), true ));
|
||||
}
|
||||
when( TLogPeekRequest req = waitNext( interf.peekMessages.getFuture() ) ) {
|
||||
|
@ -381,7 +381,7 @@ ACTOR Future<Void> logRouterCore(
|
|||
|
||||
ACTOR Future<Void> checkRemoved(Reference<AsyncVar<ServerDBInfo>> db, uint64_t recoveryCount, TLogInterface myInterface) {
|
||||
loop{
|
||||
bool isDisplaced = ( (db->get().recoveryCount > recoveryCount && db->get().recoveryState != 0) || (db->get().recoveryCount == recoveryCount && db->get().recoveryState == 7) );
|
||||
bool isDisplaced = ( (db->get().recoveryCount > recoveryCount && db->get().recoveryState != RecoveryState::UNINITIALIZED) || (db->get().recoveryCount == recoveryCount && db->get().recoveryState == RecoveryState::REMOTE_RECOVERED) );
|
||||
if(isDisplaced) {
|
||||
for(auto& log : db->get().logSystemConfig.tLogs) {
|
||||
if( std::count( log.logRouters.begin(), log.logRouters.end(), myInterface.id() ) ) {
|
||||
|
|
|
@ -1052,7 +1052,7 @@ namespace oldTLog {
|
|||
loop {
|
||||
auto const& inf = self->dbInfo->get();
|
||||
bool isDisplaced = !std::count( inf.priorCommittedLogServers.begin(), inf.priorCommittedLogServers.end(), tli.id() );
|
||||
isDisplaced = isDisplaced && inf.recoveryCount >= recoveryCount && inf.recoveryState != 0;
|
||||
isDisplaced = isDisplaced && inf.recoveryCount >= recoveryCount && inf.recoveryState != RecoveryState::UNINITIALIZED;
|
||||
|
||||
if(isDisplaced) {
|
||||
for(auto& log : inf.logSystemConfig.tLogs) {
|
||||
|
@ -1074,7 +1074,7 @@ namespace oldTLog {
|
|||
}
|
||||
if ( isDisplaced )
|
||||
{
|
||||
TraceEvent("TLogDisplaced", tli.id()).detail("Reason", "DBInfoDoesNotContain").detail("RecoveryCount", recoveryCount).detail("InfRecoveryCount", inf.recoveryCount).detail("RecoveryState", inf.recoveryState)
|
||||
TraceEvent("TLogDisplaced", tli.id()).detail("Reason", "DBInfoDoesNotContain").detail("RecoveryCount", recoveryCount).detail("InfRecoveryCount", inf.recoveryCount).detail("RecoveryState", (int)inf.recoveryState)
|
||||
.detail("LogSysConf", describe(inf.logSystemConfig.tLogs)).detail("PriorLogs", describe(inf.priorCommittedLogServers)).detail("OldLogGens", inf.logSystemConfig.oldTLogs.size());
|
||||
if (BUGGIFY) Void _ = wait( delay( SERVER_KNOBS->BUGGIFY_WORKER_REMOVED_MAX_LAG * g_random->random01() ) );
|
||||
throw worker_removed();
|
||||
|
|
|
@ -22,16 +22,17 @@
|
|||
#define FDBSERVER_RECOVERYSTATE_H
|
||||
#pragma once
|
||||
|
||||
#include "flow/serialize.h"
|
||||
|
||||
// RecoveryState and RecoveryStatus should probably be merged. The former is passed through ServerDBInfo and used for "real" decisions in the system; the latter
|
||||
// is slightly more detailed and is used by the status infrastructure. But I'm scared to make changes to the former so close to 1.0 release, so I'm making the latter.
|
||||
|
||||
namespace RecoveryState {
|
||||
enum RecoveryState { READING_CSTATE = 1, LOCKING_CSTATE = 2, RECRUITING = 3, RECOVERY_TRANSACTION = 4, WRITING_CSTATE = 5, FULLY_RECOVERED = 6, REMOTE_RECOVERED = 7 };
|
||||
};
|
||||
enum class RecoveryState { UNINITIALIZED = 0, READING_CSTATE = 1, LOCKING_CSTATE = 2, RECRUITING = 3, RECOVERY_TRANSACTION = 4, WRITING_CSTATE = 5, FULLY_RECOVERED = 6, REMOTE_RECOVERED = 7 };
|
||||
BINARY_SERIALIZABLE( RecoveryState );
|
||||
|
||||
namespace RecoveryStatus {
|
||||
enum RecoveryStatus {
|
||||
reading_coordinated_state,
|
||||
enum RecoveryStatus {
|
||||
reading_coordinated_state,
|
||||
locking_coordinated_state,
|
||||
locking_old_transaction_servers,
|
||||
reading_transaction_system_state,
|
||||
|
@ -52,4 +53,4 @@ namespace RecoveryStatus {
|
|||
extern const char* descriptions[];
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "ClusterRecruitmentInterface.h"
|
||||
#include "MasterInterface.h"
|
||||
#include "LogSystemConfig.h"
|
||||
#include "RecoveryState.h"
|
||||
|
||||
struct ServerDBInfo {
|
||||
// This structure contains transient information which is broadcast to all workers for a database,
|
||||
|
@ -38,14 +39,14 @@ struct ServerDBInfo {
|
|||
vector<ResolverInterface> resolvers;
|
||||
Standalone<StringRef> dbName;
|
||||
DBRecoveryCount recoveryCount; // A recovery count from DBCoreState. A successful master recovery increments it twice; unsuccessful recoveries may increment it once. Depending on where the current master is in its recovery process, this might not have been written by the current master.
|
||||
int recoveryState;
|
||||
RecoveryState recoveryState;
|
||||
LifetimeToken masterLifetime; // Used by masterserver to detect not being the currently chosen master
|
||||
LocalityData myLocality; // (Not serialized) Locality information, if available, for the *local* process
|
||||
LogSystemConfig logSystemConfig;
|
||||
std::vector<UID> priorCommittedLogServers; // If !fullyRecovered and logSystemConfig refers to a new log system which may not have been committed to the coordinated state yet, then priorCommittedLogServers are the previous, fully committed generation which need to stay alive in case this recovery fails
|
||||
|
||||
ServerDBInfo() : recoveryCount(0), recoveryState(0) {}
|
||||
explicit ServerDBInfo(StringRef const& dbName) : dbName(dbName), recoveryCount(0), recoveryState(0) {}
|
||||
ServerDBInfo() : recoveryCount(0), recoveryState(RecoveryState::UNINITIALIZED) {}
|
||||
explicit ServerDBInfo(StringRef const& dbName) : dbName(dbName), recoveryCount(0), recoveryState(RecoveryState::UNINITIALIZED) {}
|
||||
|
||||
bool operator == (ServerDBInfo const& r) const { return id == r.id; }
|
||||
bool operator != (ServerDBInfo const& r) const { return id != r.id; }
|
||||
|
|
|
@ -1248,9 +1248,9 @@ ACTOR Future<Void> rejoinMasters( TLogData* self, TLogInterface tli, DBRecoveryC
|
|||
auto const& inf = self->dbInfo->get();
|
||||
bool isDisplaced = !std::count( inf.priorCommittedLogServers.begin(), inf.priorCommittedLogServers.end(), tli.id() );
|
||||
if(isPrimary) {
|
||||
isDisplaced = isDisplaced && inf.recoveryCount >= recoveryCount && inf.recoveryState != 0;
|
||||
isDisplaced = isDisplaced && inf.recoveryCount >= recoveryCount && inf.recoveryState != RecoveryState::UNINITIALIZED;
|
||||
} else {
|
||||
isDisplaced = isDisplaced && ( ( inf.recoveryCount > recoveryCount && inf.recoveryState != 0 ) || ( inf.recoveryCount == recoveryCount && inf.recoveryState == 7 ) );
|
||||
isDisplaced = isDisplaced && ( ( inf.recoveryCount > recoveryCount && inf.recoveryState != RecoveryState::UNINITIALIZED ) || ( inf.recoveryCount == recoveryCount && inf.recoveryState == RecoveryState::REMOTE_RECOVERED ) );
|
||||
}
|
||||
if(isDisplaced) {
|
||||
for(auto& log : inf.logSystemConfig.tLogs) {
|
||||
|
@ -1272,7 +1272,7 @@ ACTOR Future<Void> rejoinMasters( TLogData* self, TLogInterface tli, DBRecoveryC
|
|||
}
|
||||
if ( isDisplaced )
|
||||
{
|
||||
TraceEvent("TLogDisplaced", tli.id()).detail("Reason", "DBInfoDoesNotContain").detail("RecoveryCount", recoveryCount).detail("InfRecoveryCount", inf.recoveryCount).detail("RecoveryState", inf.recoveryState)
|
||||
TraceEvent("TLogDisplaced", tli.id()).detail("Reason", "DBInfoDoesNotContain").detail("RecoveryCount", recoveryCount).detail("InfRecoveryCount", inf.recoveryCount).detail("RecoveryState", (int)inf.recoveryState)
|
||||
.detail("LogSysConf", describe(inf.logSystemConfig.tLogs)).detail("PriorLogs", describe(inf.priorCommittedLogServers)).detail("OldLogGens", inf.logSystemConfig.oldTLogs.size());
|
||||
if (BUGGIFY) Void _ = wait( delay( SERVER_KNOBS->BUGGIFY_WORKER_REMOVED_MAX_LAG * g_random->random01() ) );
|
||||
throw worker_removed();
|
||||
|
@ -1840,7 +1840,7 @@ ACTOR Future<Void> updateLogSystem(TLogData* self, Reference<LogData> logData, L
|
|||
} else {
|
||||
logData->logSystem->get()->pop(logData->logRouterPoppedVersion, logData->remoteTag, logData->durableKnownCommittedVersion, logData->locality);
|
||||
}
|
||||
TraceEvent("TLogUpdate", self->dbgid).detail("LogId", logData->logId).detail("RecruitmentID", logData->recruitmentID).detail("DbRecruitmentID", self->dbInfo->get().logSystemConfig.recruitmentID).detail("RecoverFrom", recoverFrom.toString()).detail("DbInfo", self->dbInfo->get().logSystemConfig.toString()).detail("Found", found).detail("LogSystem", (bool) logSystem->get() ).detail("RecoveryState", self->dbInfo->get().recoveryState);
|
||||
TraceEvent("TLogUpdate", self->dbgid).detail("LogId", logData->logId).detail("RecruitmentID", logData->recruitmentID).detail("DbRecruitmentID", self->dbInfo->get().logSystemConfig.recruitmentID).detail("RecoverFrom", recoverFrom.toString()).detail("DbInfo", self->dbInfo->get().logSystemConfig.toString()).detail("Found", found).detail("LogSystem", (bool) logSystem->get() ).detail("RecoveryState", (int)self->dbInfo->get().recoveryState);
|
||||
for(auto it : self->dbInfo->get().logSystemConfig.oldTLogs) {
|
||||
TraceEvent("TLogUpdateOld", self->dbgid).detail("LogId", logData->logId).detail("DbInfo", it.toString());
|
||||
}
|
||||
|
|
|
@ -212,7 +212,7 @@ struct MasterData : NonCopyable, ReferenceCounted<MasterData> {
|
|||
Reference<AsyncVar<ServerDBInfo>> dbInfo;
|
||||
int64_t registrationCount; // Number of different MasterRegistrationRequests sent to clusterController
|
||||
|
||||
RecoveryState::RecoveryState recoveryState;
|
||||
RecoveryState recoveryState;
|
||||
|
||||
AsyncVar<Standalone<VectorRef<ResolverMoveRef>>> resolverChanges;
|
||||
Version resolverChangesVersion;
|
||||
|
|
Loading…
Reference in New Issue