|
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.standard.StandardAnalyzer;
|
|
|
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
|
|
|
import org.elasticsearch.common.xcontent.XContentHelper;
|
|
|
import org.elasticsearch.index.IndexSettings;
|
|
|
+import org.elasticsearch.index.VersionType;
|
|
|
import org.elasticsearch.index.analysis.AnalysisRegistry;
|
|
|
import org.elasticsearch.index.analysis.AnalyzerScope;
|
|
|
import org.elasticsearch.index.analysis.IndexAnalyzers;
|
|
@@ -117,20 +118,23 @@ public class TranslogHandler implements Engine.TranslogRecoveryRunner {
|
|
|
return opsRecovered;
|
|
|
}
|
|
|
|
|
|
- private Engine.Operation convertToEngineOp(Translog.Operation operation, Engine.Operation.Origin origin) {
|
|
|
+ public Engine.Operation convertToEngineOp(Translog.Operation operation, Engine.Operation.Origin origin) {
|
|
|
+ // If a translog op is replayed on the primary (eg. ccr), we need to use external instead of null for its version type.
|
|
|
+ final VersionType versionType = (origin == Engine.Operation.Origin.PRIMARY) ? VersionType.EXTERNAL : null;
|
|
|
switch (operation.opType()) {
|
|
|
case INDEX:
|
|
|
final Translog.Index index = (Translog.Index) operation;
|
|
|
final String indexName = mapperService.index().getName();
|
|
|
final Engine.Index engineIndex = IndexShard.prepareIndex(docMapper(index.type()),
|
|
|
new SourceToParse(indexName, index.type(), index.id(), index.source(), XContentHelper.xContentType(index.source()),
|
|
|
- index.routing()), index.seqNo(), index.primaryTerm(),
|
|
|
- index.version(), null, origin, index.getAutoGeneratedIdTimestamp(), true, SequenceNumbers.UNASSIGNED_SEQ_NO, 0);
|
|
|
+ index.routing()), index.seqNo(), index.primaryTerm(), index.version(), versionType, origin,
|
|
|
+ index.getAutoGeneratedIdTimestamp(), true, SequenceNumbers.UNASSIGNED_SEQ_NO, SequenceNumbers.UNASSIGNED_PRIMARY_TERM);
|
|
|
return engineIndex;
|
|
|
case DELETE:
|
|
|
final Translog.Delete delete = (Translog.Delete) operation;
|
|
|
final Engine.Delete engineDelete = new Engine.Delete(delete.type(), delete.id(), delete.uid(), delete.seqNo(),
|
|
|
- delete.primaryTerm(), delete.version(), null, origin, System.nanoTime(), SequenceNumbers.UNASSIGNED_SEQ_NO, 0);
|
|
|
+ delete.primaryTerm(), delete.version(), versionType, origin, System.nanoTime(),
|
|
|
+ SequenceNumbers.UNASSIGNED_SEQ_NO, SequenceNumbers.UNASSIGNED_PRIMARY_TERM);
|
|
|
return engineDelete;
|
|
|
case NO_OP:
|
|
|
final Translog.NoOp noOp = (Translog.NoOp) operation;
|