Always use last properly persisted metadata as previous state (#47779)

On data-only nodes we were not using the last persisted cluster state as base point to compute
what needed storage, but the last applied cluster state (but not necessarily properly persisted)
instead.
This commit is contained in:
Yannick Welsch 2019-10-24 13:29:59 +02:00
parent ba1c13c47d
commit acf6d34d69
3 changed files with 9 additions and 10 deletions

View File

@ -283,7 +283,7 @@ public class GatewayMetaState {
incrementalClusterStateWriter.setCurrentTerm(event.state().term());
}
incrementalClusterStateWriter.updateClusterState(event.state(), event.previousState());
incrementalClusterStateWriter.updateClusterState(event.state());
incrementalClusterStateWriter.setIncrementalWrite(true);
} catch (WriteStateException e) {
logger.warn("Exception occurred when storing new meta data", e);
@ -325,9 +325,9 @@ public class GatewayMetaState {
@Override
public void setLastAcceptedState(ClusterState clusterState) {
try {
final ClusterState previousClusterState = incrementalClusterStateWriter.getPreviousClusterState();
incrementalClusterStateWriter.setIncrementalWrite(previousClusterState.term() == clusterState.term());
incrementalClusterStateWriter.updateClusterState(clusterState, previousClusterState);
incrementalClusterStateWriter.setIncrementalWrite(
incrementalClusterStateWriter.getPreviousClusterState().term() == clusterState.term());
incrementalClusterStateWriter.updateClusterState(clusterState);
} catch (WriteStateException e) {
logger.error(new ParameterizedMessage("Failed to set last accepted state with version {}", clusterState.version()), e);
e.rethrowAsErrorOrUncheckedException();

View File

@ -101,18 +101,17 @@ public class IncrementalClusterStateWriter {
* Updates manifest and meta data on disk.
*
* @param newState new {@link ClusterState}
* @param previousState previous {@link ClusterState}
*
* @throws WriteStateException if exception occurs. See also {@link WriteStateException#isDirty()}.
*/
void updateClusterState(ClusterState newState, ClusterState previousState) throws WriteStateException {
void updateClusterState(ClusterState newState) throws WriteStateException {
MetaData newMetaData = newState.metaData();
final long startTimeMillis = relativeTimeMillisSupplier.getAsLong();
final AtomicClusterStateWriter writer = new AtomicClusterStateWriter(metaStateService, previousManifest);
long globalStateGeneration = writeGlobalState(writer, newMetaData);
Map<Index, Long> indexGenerations = writeIndicesMetadata(writer, newState, previousState);
Map<Index, Long> indexGenerations = writeIndicesMetadata(writer, newState);
Manifest manifest = new Manifest(previousManifest.getCurrentTerm(), newState.version(), globalStateGeneration, indexGenerations);
writeManifest(writer, manifest);
previousManifest = manifest;
@ -136,14 +135,14 @@ public class IncrementalClusterStateWriter {
}
}
private Map<Index, Long> writeIndicesMetadata(AtomicClusterStateWriter writer, ClusterState newState, ClusterState previousState)
private Map<Index, Long> writeIndicesMetadata(AtomicClusterStateWriter writer, ClusterState newState)
throws WriteStateException {
Map<Index, Long> previouslyWrittenIndices = previousManifest.getIndexGenerations();
Set<Index> relevantIndices = getRelevantIndices(newState);
Map<Index, Long> newIndices = new HashMap<>();
MetaData previousMetaData = incrementalWrite ? previousState.metaData() : null;
MetaData previousMetaData = incrementalWrite ? previousClusterState.metaData() : null;
Iterable<IndexMetaDataAction> actions = resolveIndexMetaDataActions(previouslyWrittenIndices, relevantIndices, previousMetaData,
newState.metaData());

View File

@ -510,7 +510,7 @@ public class IncrementalClusterStateWriterTests extends ESAllocationTestCase {
Loggers.addAppender(classLogger, mockAppender);
try {
incrementalClusterStateWriter.updateClusterState(clusterState, clusterState);
incrementalClusterStateWriter.updateClusterState(clusterState);
} finally {
Loggers.removeAppender(classLogger, mockAppender);
mockAppender.stop();