another attempt at forced recovery

This commit is contained in:
Evan Tschannen 2018-07-03 13:42:58 -04:00
parent 57a8c6862e
commit c69d6166e3
1 changed files with 67 additions and 14 deletions

View File

@ -1176,28 +1176,81 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
if(forceRecovery) {
DBCoreState modifiedState = prevState;
bool foundRemote = false;
int8_t primaryLocality = -1;
for(auto& coreSet : modifiedState.tLogs) {
if(!coreSet.isLocal) {
foundRemote = true;
if(coreSet.isLocal && coreSet.locality >= 0) {
primaryLocality = coreSet.locality;
break;
}
}
while( !foundRemote && modifiedState.oldTLogData.size() ) {
for(auto& coreSet : modifiedState.oldTLogData[0].tLogs) {
if(!coreSet.isLocal) {
if(primaryLocality >= 0) {
bool foundRemote = false;
int8_t remoteLocality = -1;
bool remoteIsLocal = false;
auto copiedLogs = modifiedState.tLogs;
for(auto& coreSet : copiedLogs) {
if(coreSet.locality != primaryLocality && coreSet.locality >= 0) {
foundRemote = true;
remoteLocality = coreSet.locality;
remoteIsLocal = coreSet.isLocal;
modifiedState.tLogs.clear();
modifiedState.tLogs.push_back(coreSet);
modifiedState.tLogs[0].isLocal = true;
modifiedState.logRouterTags = 0;
break;
}
}
if(foundRemote) {
modifiedState.tLogs = modifiedState.oldTLogData[0].tLogs;
modifiedState.logRouterTags = modifiedState.oldTLogData[0].logRouterTags;
ASSERT( !remoteIsLocal );
while( !foundRemote && modifiedState.oldTLogData.size() ) {
for(auto& coreSet : modifiedState.oldTLogData[0].tLogs) {
if(coreSet.locality != primaryLocality && coreSet.locality >= tagLocalitySpecial) {
foundRemote = true;
remoteLocality = coreSet.locality;
remoteIsLocal = coreSet.isLocal;
if(coreSet.isLocal) {
modifiedState.tLogs = modifiedState.oldTLogData[0].tLogs;
modifiedState.logRouterTags = modifiedState.oldTLogData[0].logRouterTags;
} else {
modifiedState.tLogs.clear();
modifiedState.tLogs.push_back(coreSet);
modifiedState.tLogs[0].isLocal = true;
modifiedState.logRouterTags = 0;
}
break;
}
}
modifiedState.oldTLogData.erase(modifiedState.oldTLogData.begin());
}
if(foundRemote) {
for(int i = 0; i < modifiedState.oldTLogData.size() && !remoteIsLocal; i++) {
bool found = false;
auto copiedLogs = modifiedState.oldTLogData[i].tLogs;
for(auto& coreSet : copiedLogs) {
if(coreSet.locality == remoteLocality || coreSet.locality == tagLocalitySpecial) {
found = true;
remoteIsLocal = coreSet.isLocal;
if(!coreSet.isLocal) {
modifiedState.oldTLogData[i].tLogs.clear();
modifiedState.oldTLogData[i].tLogs.push_back(coreSet);
modifiedState.oldTLogData[i].tLogs[0].isLocal = true;
modifiedState.oldTLogData[i].logRouterTags = 0;
modifiedState.oldTLogData[i].epochEnd = ( i == 0 ? modifiedState.tLogs[0].startVersion : modifiedState.oldTLogData[i-1].tLogs[0].startVersion );
}
break;
}
}
if(!found) {
modifiedState.oldTLogData.erase(modifiedState.oldTLogData.begin()+i);
i--;
}
}
prevState = modifiedState;
}
modifiedState.oldTLogData.erase(modifiedState.oldTLogData.begin());
}
if(foundRemote) {
prevState = modifiedState;
}
}
@ -1228,7 +1281,7 @@ struct TagPartitionedLogSystem : ILogSystem, ReferenceCounted<TagPartitionedLogS
logSet->tLogWriteAntiQuorum = coreSet.tLogWriteAntiQuorum;
logSet->tLogPolicy = coreSet.tLogPolicy;
logSet->tLogLocalities = coreSet.tLogLocalities;
logSet->isLocal = coreSet.isLocal || forceRecovery;
logSet->isLocal = coreSet.isLocal;
logSet->locality = coreSet.locality;
logSet->startVersion = coreSet.startVersion;
logSet->satelliteTagLocations = coreSet.satelliteTagLocations;