another attempt at forced recovery
This commit is contained in:
parent
57a8c6862e
commit
c69d6166e3
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue