|
@@ -36,6 +36,8 @@ import java.util.Collections;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
import java.util.Locale;
|
|
|
|
|
|
|
|
|
|
+import static org.elasticsearch.indices.recovery.RecoverySettings.INDICES_RECOVERY_SOURCE_ENABLED_SETTING;
|
|
|
|
|
+
|
|
|
public class SourceFieldMapper extends MetadataFieldMapper {
|
|
public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
public static final NodeFeature SYNTHETIC_SOURCE_FALLBACK = new NodeFeature("mapper.source.synthetic_source_fallback");
|
|
public static final NodeFeature SYNTHETIC_SOURCE_FALLBACK = new NodeFeature("mapper.source.synthetic_source_fallback");
|
|
|
public static final NodeFeature SYNTHETIC_SOURCE_STORED_FIELDS_ADVANCE_FIX = new NodeFeature(
|
|
public static final NodeFeature SYNTHETIC_SOURCE_STORED_FIELDS_ADVANCE_FIX = new NodeFeature(
|
|
@@ -61,7 +63,17 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
Explicit.IMPLICIT_TRUE,
|
|
Explicit.IMPLICIT_TRUE,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
- null
|
|
|
|
|
|
|
+ null,
|
|
|
|
|
+ true
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ private static final SourceFieldMapper DEFAULT_NO_RECOVERY_SOURCE = new SourceFieldMapper(
|
|
|
|
|
+ null,
|
|
|
|
|
+ Explicit.IMPLICIT_TRUE,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ null,
|
|
|
|
|
+ false
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
private static final SourceFieldMapper TSDB_DEFAULT = new SourceFieldMapper(
|
|
private static final SourceFieldMapper TSDB_DEFAULT = new SourceFieldMapper(
|
|
@@ -69,7 +81,17 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
Explicit.IMPLICIT_TRUE,
|
|
Explicit.IMPLICIT_TRUE,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
- IndexMode.TIME_SERIES
|
|
|
|
|
|
|
+ IndexMode.TIME_SERIES,
|
|
|
|
|
+ true
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ private static final SourceFieldMapper TSDB_DEFAULT_NO_RECOVERY_SOURCE = new SourceFieldMapper(
|
|
|
|
|
+ Mode.SYNTHETIC,
|
|
|
|
|
+ Explicit.IMPLICIT_TRUE,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ IndexMode.TIME_SERIES,
|
|
|
|
|
+ false
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
private static final SourceFieldMapper LOGSDB_DEFAULT = new SourceFieldMapper(
|
|
private static final SourceFieldMapper LOGSDB_DEFAULT = new SourceFieldMapper(
|
|
@@ -77,7 +99,17 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
Explicit.IMPLICIT_TRUE,
|
|
Explicit.IMPLICIT_TRUE,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
- IndexMode.LOGSDB
|
|
|
|
|
|
|
+ IndexMode.LOGSDB,
|
|
|
|
|
+ true
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ private static final SourceFieldMapper LOGSDB_DEFAULT_NO_RECOVERY_SOURCE = new SourceFieldMapper(
|
|
|
|
|
+ Mode.SYNTHETIC,
|
|
|
|
|
+ Explicit.IMPLICIT_TRUE,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ IndexMode.LOGSDB,
|
|
|
|
|
+ false
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -89,7 +121,17 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
Explicit.IMPLICIT_TRUE,
|
|
Explicit.IMPLICIT_TRUE,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
Strings.EMPTY_ARRAY,
|
|
Strings.EMPTY_ARRAY,
|
|
|
- IndexMode.TIME_SERIES
|
|
|
|
|
|
|
+ IndexMode.TIME_SERIES,
|
|
|
|
|
+ true
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ private static final SourceFieldMapper TSDB_LEGACY_DEFAULT_NO_RECOVERY_SOURCE = new SourceFieldMapper(
|
|
|
|
|
+ null,
|
|
|
|
|
+ Explicit.IMPLICIT_TRUE,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ Strings.EMPTY_ARRAY,
|
|
|
|
|
+ IndexMode.TIME_SERIES,
|
|
|
|
|
+ false
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
public static class Defaults {
|
|
public static class Defaults {
|
|
@@ -148,11 +190,19 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
|
|
|
|
|
private final boolean supportsNonDefaultParameterValues;
|
|
private final boolean supportsNonDefaultParameterValues;
|
|
|
|
|
|
|
|
- public Builder(IndexMode indexMode, final Settings settings, boolean supportsCheckForNonDefaultParams) {
|
|
|
|
|
|
|
+ private final boolean enableRecoverySource;
|
|
|
|
|
+
|
|
|
|
|
+ public Builder(
|
|
|
|
|
+ IndexMode indexMode,
|
|
|
|
|
+ final Settings settings,
|
|
|
|
|
+ boolean supportsCheckForNonDefaultParams,
|
|
|
|
|
+ boolean enableRecoverySource
|
|
|
|
|
+ ) {
|
|
|
super(Defaults.NAME);
|
|
super(Defaults.NAME);
|
|
|
this.indexMode = indexMode;
|
|
this.indexMode = indexMode;
|
|
|
this.supportsNonDefaultParameterValues = supportsCheckForNonDefaultParams == false
|
|
this.supportsNonDefaultParameterValues = supportsCheckForNonDefaultParams == false
|
|
|
|| settings.getAsBoolean(LOSSY_PARAMETERS_ALLOWED_SETTING_NAME, true);
|
|
|| settings.getAsBoolean(LOSSY_PARAMETERS_ALLOWED_SETTING_NAME, true);
|
|
|
|
|
+ this.enableRecoverySource = enableRecoverySource;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public Builder setSynthetic() {
|
|
public Builder setSynthetic() {
|
|
@@ -218,7 +268,8 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
enabled.get(),
|
|
enabled.get(),
|
|
|
includes.getValue().toArray(Strings.EMPTY_ARRAY),
|
|
includes.getValue().toArray(Strings.EMPTY_ARRAY),
|
|
|
excludes.getValue().toArray(Strings.EMPTY_ARRAY),
|
|
excludes.getValue().toArray(Strings.EMPTY_ARRAY),
|
|
|
- indexMode
|
|
|
|
|
|
|
+ indexMode,
|
|
|
|
|
+ enableRecoverySource
|
|
|
);
|
|
);
|
|
|
if (indexMode != null) {
|
|
if (indexMode != null) {
|
|
|
indexMode.validateSourceFieldMapper(sourceFieldMapper);
|
|
indexMode.validateSourceFieldMapper(sourceFieldMapper);
|
|
@@ -230,23 +281,25 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
|
|
|
|
|
public static final TypeParser PARSER = new ConfigurableTypeParser(c -> {
|
|
public static final TypeParser PARSER = new ConfigurableTypeParser(c -> {
|
|
|
var indexMode = c.getIndexSettings().getMode();
|
|
var indexMode = c.getIndexSettings().getMode();
|
|
|
|
|
+ boolean enableRecoverySource = INDICES_RECOVERY_SOURCE_ENABLED_SETTING.get(c.getSettings());
|
|
|
if (indexMode.isSyntheticSourceEnabled()) {
|
|
if (indexMode.isSyntheticSourceEnabled()) {
|
|
|
if (indexMode == IndexMode.TIME_SERIES) {
|
|
if (indexMode == IndexMode.TIME_SERIES) {
|
|
|
if (c.getIndexSettings().getIndexVersionCreated().onOrAfter(IndexVersions.V_8_7_0)) {
|
|
if (c.getIndexSettings().getIndexVersionCreated().onOrAfter(IndexVersions.V_8_7_0)) {
|
|
|
- return TSDB_DEFAULT;
|
|
|
|
|
|
|
+ return enableRecoverySource ? TSDB_DEFAULT : TSDB_DEFAULT_NO_RECOVERY_SOURCE;
|
|
|
} else {
|
|
} else {
|
|
|
- return TSDB_LEGACY_DEFAULT;
|
|
|
|
|
|
|
+ return enableRecoverySource ? TSDB_LEGACY_DEFAULT : TSDB_LEGACY_DEFAULT_NO_RECOVERY_SOURCE;
|
|
|
}
|
|
}
|
|
|
} else if (indexMode == IndexMode.LOGSDB) {
|
|
} else if (indexMode == IndexMode.LOGSDB) {
|
|
|
- return LOGSDB_DEFAULT;
|
|
|
|
|
|
|
+ return enableRecoverySource ? LOGSDB_DEFAULT : LOGSDB_DEFAULT_NO_RECOVERY_SOURCE;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- return DEFAULT;
|
|
|
|
|
|
|
+ return enableRecoverySource ? DEFAULT : DEFAULT_NO_RECOVERY_SOURCE;
|
|
|
},
|
|
},
|
|
|
c -> new Builder(
|
|
c -> new Builder(
|
|
|
c.getIndexSettings().getMode(),
|
|
c.getIndexSettings().getMode(),
|
|
|
c.getSettings(),
|
|
c.getSettings(),
|
|
|
- c.indexVersionCreated().onOrAfter(IndexVersions.SOURCE_MAPPER_LOSSY_PARAMS_CHECK)
|
|
|
|
|
|
|
+ c.indexVersionCreated().onOrAfter(IndexVersions.SOURCE_MAPPER_LOSSY_PARAMS_CHECK),
|
|
|
|
|
+ INDICES_RECOVERY_SOURCE_ENABLED_SETTING.get(c.getSettings())
|
|
|
)
|
|
)
|
|
|
);
|
|
);
|
|
|
|
|
|
|
@@ -299,8 +352,16 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
private final SourceFilter sourceFilter;
|
|
private final SourceFilter sourceFilter;
|
|
|
|
|
|
|
|
private final IndexMode indexMode;
|
|
private final IndexMode indexMode;
|
|
|
-
|
|
|
|
|
- private SourceFieldMapper(Mode mode, Explicit<Boolean> enabled, String[] includes, String[] excludes, IndexMode indexMode) {
|
|
|
|
|
|
|
+ private final boolean enableRecoverySource;
|
|
|
|
|
+
|
|
|
|
|
+ private SourceFieldMapper(
|
|
|
|
|
+ Mode mode,
|
|
|
|
|
+ Explicit<Boolean> enabled,
|
|
|
|
|
+ String[] includes,
|
|
|
|
|
+ String[] excludes,
|
|
|
|
|
+ IndexMode indexMode,
|
|
|
|
|
+ boolean enableRecoverySource
|
|
|
|
|
+ ) {
|
|
|
super(new SourceFieldType((enabled.explicit() && enabled.value()) || (enabled.explicit() == false && mode != Mode.DISABLED)));
|
|
super(new SourceFieldType((enabled.explicit() && enabled.value()) || (enabled.explicit() == false && mode != Mode.DISABLED)));
|
|
|
assert enabled.explicit() == false || mode == null;
|
|
assert enabled.explicit() == false || mode == null;
|
|
|
this.mode = mode;
|
|
this.mode = mode;
|
|
@@ -313,6 +374,7 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
}
|
|
}
|
|
|
this.complete = stored() && sourceFilter == null;
|
|
this.complete = stored() && sourceFilter == null;
|
|
|
this.indexMode = indexMode;
|
|
this.indexMode = indexMode;
|
|
|
|
|
+ this.enableRecoverySource = enableRecoverySource;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static SourceFilter buildSourceFilter(String[] includes, String[] excludes) {
|
|
private static SourceFilter buildSourceFilter(String[] includes, String[] excludes) {
|
|
@@ -357,7 +419,7 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
context.doc().add(new StoredField(fieldType().name(), ref.bytes, ref.offset, ref.length));
|
|
context.doc().add(new StoredField(fieldType().name(), ref.bytes, ref.offset, ref.length));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (originalSource != null && adaptedSource != originalSource) {
|
|
|
|
|
|
|
+ if (enableRecoverySource && originalSource != null && adaptedSource != originalSource) {
|
|
|
// if we omitted source or modified it we add the _recovery_source to ensure we have it for ops based recovery
|
|
// if we omitted source or modified it we add the _recovery_source to ensure we have it for ops based recovery
|
|
|
BytesRef ref = originalSource.toBytesRef();
|
|
BytesRef ref = originalSource.toBytesRef();
|
|
|
context.doc().add(new StoredField(RECOVERY_SOURCE_NAME, ref.bytes, ref.offset, ref.length));
|
|
context.doc().add(new StoredField(RECOVERY_SOURCE_NAME, ref.bytes, ref.offset, ref.length));
|
|
@@ -385,7 +447,7 @@ public class SourceFieldMapper extends MetadataFieldMapper {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public FieldMapper.Builder getMergeBuilder() {
|
|
public FieldMapper.Builder getMergeBuilder() {
|
|
|
- return new Builder(indexMode, Settings.EMPTY, false).init(this);
|
|
|
|
|
|
|
+ return new Builder(indexMode, Settings.EMPTY, false, enableRecoverySource).init(this);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|