[fix](compaction) time series compaction policy -> compact consecutive empty rowsets (#27299)

Sometimes we need to merge a large number of empty versions to reduce meta-information.
This commit is contained in:
Sun Chenyang
2023-12-29 22:20:41 +08:00
committed by GitHub
parent fcb90dc808
commit 59fdd5e42b
23 changed files with 267 additions and 25 deletions

View File

@ -505,7 +505,9 @@ public class Alter {
|| properties
.containsKey(PropertyAnalyzer.PROPERTIES_DISABLE_AUTO_COMPACTION)
|| properties
.containsKey(PropertyAnalyzer.PROPERTIES_SKIP_WRITE_INDEX_ON_LOAD));
.containsKey(PropertyAnalyzer.PROPERTIES_SKIP_WRITE_INDEX_ON_LOAD)
|| properties
.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD));
((SchemaChangeHandler) schemaChangeHandler).updateTableProperties(db, tableName, properties);
} else {
throw new DdlException("Invalid alter operation: " + alterClause.getOpType());

View File

@ -274,6 +274,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
tbl.getTimeSeriesCompactionGoalSizeMbytes(),
tbl.getTimeSeriesCompactionFileCountThreshold(),
tbl.getTimeSeriesCompactionTimeThresholdSeconds(),
tbl.getTimeSeriesCompactionEmptyRowsetsThreshold(),
tbl.storeRowColumn(),
binlogConfig);
createReplicaTask.setBaseTablet(tabletIdMap.get(rollupTabletId), baseSchemaHash);

View File

@ -2201,6 +2201,13 @@ public class SchemaChangeHandler extends AlterHandler {
.get(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS)));
}
if (properties.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)) {
timeSeriesCompactionConfig
.put(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD,
Long.parseLong(properties
.get(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)));
}
if (isInMemory < 0 && storagePolicyId < 0 && compactionPolicy == null && timeSeriesCompactionConfig.isEmpty()
&& !properties.containsKey(PropertyAnalyzer.PROPERTIES_IS_BEING_SYNCED)
&& !properties.containsKey(PropertyAnalyzer.PROPERTIES_ENABLE_SINGLE_REPLICA_COMPACTION)

View File

@ -282,6 +282,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
tbl.getTimeSeriesCompactionGoalSizeMbytes(),
tbl.getTimeSeriesCompactionFileCountThreshold(),
tbl.getTimeSeriesCompactionTimeThresholdSeconds(),
tbl.getTimeSeriesCompactionEmptyRowsetsThreshold(),
tbl.storeRowColumn(),
binlogConfig);

View File

@ -206,6 +206,22 @@ public class ModifyTablePropertiesClause extends AlterTableClause {
}
this.needTableStable = false;
this.opType = AlterOpType.MODIFY_TABLE_PROPERTY_SYNC;
} else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)) {
long emptyRowsetsThreshold;
String emptyRowsetsThresholdStr = properties
.get(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD);
try {
emptyRowsetsThreshold = Long.parseLong(emptyRowsetsThresholdStr);
if (emptyRowsetsThreshold < 2) {
throw new AnalysisException("time_series_compaction_empty_rowsets_threshold can not be less than 2:"
+ emptyRowsetsThresholdStr);
}
} catch (NumberFormatException e) {
throw new AnalysisException("Invalid time_series_compaction_empty_rowsets_threshold format: "
+ emptyRowsetsThresholdStr);
}
this.needTableStable = false;
this.opType = AlterOpType.MODIFY_TABLE_PROPERTY_SYNC;
} else if (properties.containsKey(PropertyAnalyzer.PROPERTIES_SKIP_WRITE_INDEX_ON_LOAD)) {
if (!properties.get(PropertyAnalyzer.PROPERTIES_SKIP_WRITE_INDEX_ON_LOAD).equalsIgnoreCase("true")
&& !properties.get(PropertyAnalyzer

View File

@ -1069,6 +1069,7 @@ public class RestoreJob extends AbstractJob {
localTbl.getTimeSeriesCompactionGoalSizeMbytes(),
localTbl.getTimeSeriesCompactionFileCountThreshold(),
localTbl.getTimeSeriesCompactionTimeThresholdSeconds(),
localTbl.getTimeSeriesCompactionEmptyRowsetsThreshold(),
localTbl.storeRowColumn(),
binlogConfig);

View File

@ -3357,6 +3357,14 @@ public class Env {
sb.append(olapTable.getTimeSeriesCompactionTimeThresholdSeconds()).append("\"");
}
// time series compaction empty rowsets threshold
if (olapTable.getCompactionPolicy() != null && olapTable.getCompactionPolicy()
.equals(PropertyAnalyzer.TIME_SERIES_COMPACTION_POLICY)) {
sb.append(",\n\"").append(PropertyAnalyzer
.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD).append("\" = \"");
sb.append(olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold()).append("\"");
}
// disable auto compaction
sb.append(",\n\"").append(PropertyAnalyzer.PROPERTIES_DISABLE_AUTO_COMPACTION).append("\" = \"");
sb.append(olapTable.disableAutoCompaction()).append("\"");
@ -4771,7 +4779,8 @@ public class Env {
.buildTimeSeriesCompactionTimeThresholdSeconds()
.buildSkipWriteIndexOnLoad()
.buildDisableAutoCompaction()
.buildEnableSingleReplicaCompaction();
.buildEnableSingleReplicaCompaction()
.buildTimeSeriesCompactionEmptyRowsetsThreshold();
// need to update partition info meta
for (Partition partition : table.getPartitions()) {

View File

@ -2077,6 +2077,20 @@ public class OlapTable extends Table {
return null;
}
public void setTimeSeriesCompactionEmptyRowsetsThreshold(long timeSeriesCompactionEmptyRowsetsThreshold) {
TableProperty tableProperty = getOrCreatTableProperty();
tableProperty.modifyTableProperties(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD,
Long.valueOf(timeSeriesCompactionEmptyRowsetsThreshold).toString());
tableProperty.buildTimeSeriesCompactionEmptyRowsetsThreshold();
}
public Long getTimeSeriesCompactionEmptyRowsetsThreshold() {
if (tableProperty != null) {
return tableProperty.timeSeriesCompactionEmptyRowsetsThreshold();
}
return null;
}
public int getBaseSchemaVersion() {
MaterializedIndexMeta baseIndexMeta = indexIdToMeta.get(baseIndexId);
return baseIndexMeta.getSchemaVersion();

View File

@ -97,6 +97,9 @@ public class TableProperty implements Writable {
private long timeSeriesCompactionTimeThresholdSeconds
= PropertyAnalyzer.TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS_DEFAULT_VALUE;
private long timeSeriesCompactionEmptyRowsetsThreshold
= PropertyAnalyzer.TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD_DEFAULT_VALUE;
private DataSortInfo dataSortInfo = new DataSortInfo();
public TableProperty(Map<String, String> properties) {
@ -132,6 +135,7 @@ public class TableProperty implements Writable {
buildSkipWriteIndexOnLoad();
buildEnableSingleReplicaCompaction();
buildDisableAutoCompaction();
buildTimeSeriesCompactionEmptyRowsetsThreshold();
break;
default:
break;
@ -278,6 +282,17 @@ public class TableProperty implements Writable {
return timeSeriesCompactionTimeThresholdSeconds;
}
public TableProperty buildTimeSeriesCompactionEmptyRowsetsThreshold() {
timeSeriesCompactionEmptyRowsetsThreshold = Long.parseLong(properties
.getOrDefault(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD,
String.valueOf(PropertyAnalyzer.TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD_DEFAULT_VALUE)));
return this;
}
public long timeSeriesCompactionEmptyRowsetsThreshold() {
return timeSeriesCompactionEmptyRowsetsThreshold;
}
public TableProperty buildMinLoadReplicaNum() {
minLoadReplicaNum = Short.parseShort(
properties.getOrDefault(PropertyAnalyzer.PROPERTIES_MIN_LOAD_REPLICA_NUM, "-1"));
@ -528,7 +543,8 @@ public class TableProperty implements Writable {
.buildTimeSeriesCompactionFileCountThreshold()
.buildTimeSeriesCompactionTimeThresholdSeconds()
.buildDisableAutoCompaction()
.buildEnableSingleReplicaCompaction();
.buildEnableSingleReplicaCompaction()
.buildTimeSeriesCompactionEmptyRowsetsThreshold();
if (Env.getCurrentEnvJournalVersion() < FeMetaVersion.VERSION_105) {
// get replica num from property map and create replica allocation
String repNum = tableProperty.properties.remove(PropertyAnalyzer.PROPERTIES_REPLICATION_NUM);

View File

@ -144,6 +144,10 @@ public class PropertyAnalyzer {
public static final String PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS =
"time_series_compaction_time_threshold_seconds";
public static final String PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD =
"time_series_compaction_empty_rowsets_threshold";
public static final String PROPERTIES_MUTABLE = "mutable";
public static final String PROPERTIES_IS_BEING_SYNCED = "is_being_synced";
@ -182,6 +186,7 @@ public class PropertyAnalyzer {
public static final long TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES_DEFAULT_VALUE = 1024;
public static final long TIME_SERIES_COMPACTION_FILE_COUNT_THRESHOLD_DEFAULT_VALUE = 2000;
public static final long TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS_DEFAULT_VALUE = 3600;
public static final long TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD_DEFAULT_VALUE = 5;
/**
@ -711,27 +716,28 @@ public class PropertyAnalyzer {
return compactionPolicy;
}
public static long analyzeTimeSeriesCompactionGoalSizeMbytes(Map<String, String> properties)
public static long analyzeTimeSeriesCompactionEmptyRowsetsThreshold(Map<String, String> properties)
throws AnalysisException {
long goalSizeMbytes = TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES_DEFAULT_VALUE;
long emptyRowsetsThreshold = TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD_DEFAULT_VALUE;
if (properties == null || properties.isEmpty()) {
return goalSizeMbytes;
return emptyRowsetsThreshold;
}
if (properties.containsKey(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES)) {
String goalSizeMbytesStr = properties.get(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES);
properties.remove(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES);
if (properties.containsKey(PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)) {
String emptyRowsetsThresholdStr = properties
.get(PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD);
properties.remove(PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD);
try {
goalSizeMbytes = Long.parseLong(goalSizeMbytesStr);
if (goalSizeMbytes < 10) {
throw new AnalysisException("time_series_compaction_goal_size_mbytes can not be"
+ " less than 10: " + goalSizeMbytesStr);
emptyRowsetsThreshold = Long.parseLong(emptyRowsetsThresholdStr);
if (emptyRowsetsThreshold < 2) {
throw new AnalysisException("time_series_compaction_empty_rowsets_threshold can not"
+ " be less than 2: " + emptyRowsetsThresholdStr);
}
} catch (NumberFormatException e) {
throw new AnalysisException("Invalid time_series_compaction_goal_size_mbytes format: "
+ goalSizeMbytesStr);
throw new AnalysisException("Invalid time_series_compaction_empty_rowsets_threshold: "
+ emptyRowsetsThresholdStr);
}
}
return goalSizeMbytes;
return emptyRowsetsThreshold;
}
public static long analyzeTimeSeriesCompactionFileCountThreshold(Map<String, String> properties)
@ -781,6 +787,29 @@ public class PropertyAnalyzer {
return timeThresholdSeconds;
}
public static long analyzeTimeSeriesCompactionGoalSizeMbytes(Map<String, String> properties)
throws AnalysisException {
long goalSizeMbytes = TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES_DEFAULT_VALUE;
if (properties == null || properties.isEmpty()) {
return goalSizeMbytes;
}
if (properties.containsKey(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES)) {
String goalSizeMbytesStr = properties.get(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES);
properties.remove(PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES);
try {
goalSizeMbytes = Long.parseLong(goalSizeMbytesStr);
if (goalSizeMbytes < 10) {
throw new AnalysisException("time_series_compaction_goal_size_mbytes can not be"
+ " less than 10: " + goalSizeMbytesStr);
}
} catch (NumberFormatException e) {
throw new AnalysisException("Invalid time_series_compaction_goal_size_mbytes format: "
+ goalSizeMbytesStr);
}
}
return goalSizeMbytes;
}
// analyzeCompressionType will parse the compression type from properties
public static TCompressionType analyzeCompressionType(Map<String, String> properties) throws AnalysisException {
String compressionType = "";

View File

@ -1446,6 +1446,10 @@ public class InternalCatalog implements CatalogIf<Database> {
properties.put(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS,
olapTable.getTimeSeriesCompactionTimeThresholdSeconds().toString());
}
if (!properties.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)) {
properties.put(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD,
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold().toString());
}
if (!properties.containsKey(PropertyAnalyzer.PROPERTIES_STORAGE_POLICY)) {
properties.put(PropertyAnalyzer.PROPERTIES_STORAGE_POLICY, olapTable.getStoragePolicy());
}
@ -1542,6 +1546,7 @@ public class InternalCatalog implements CatalogIf<Database> {
olapTable.getTimeSeriesCompactionGoalSizeMbytes(),
olapTable.getTimeSeriesCompactionFileCountThreshold(),
olapTable.getTimeSeriesCompactionTimeThresholdSeconds(),
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold(),
olapTable.storeRowColumn(),
binlogConfig, dataProperty.isStorageMediumSpecified(), null);
// TODO cluster key ids
@ -1798,6 +1803,7 @@ public class InternalCatalog implements CatalogIf<Database> {
boolean enableSingleReplicaCompaction, boolean skipWriteIndexOnLoad,
String compactionPolicy, Long timeSeriesCompactionGoalSizeMbytes,
Long timeSeriesCompactionFileCountThreshold, Long timeSeriesCompactionTimeThresholdSeconds,
Long timeSeriesCompactionEmptyRowsetsThreshold,
boolean storeRowColumn, BinlogConfig binlogConfig,
boolean isStorageMediumSpecified, List<Integer> clusterKeyIndexes) throws DdlException {
// create base index first.
@ -1864,6 +1870,7 @@ public class InternalCatalog implements CatalogIf<Database> {
disableAutoCompaction, enableSingleReplicaCompaction, skipWriteIndexOnLoad,
compactionPolicy, timeSeriesCompactionGoalSizeMbytes,
timeSeriesCompactionFileCountThreshold, timeSeriesCompactionTimeThresholdSeconds,
timeSeriesCompactionEmptyRowsetsThreshold,
storeRowColumn, binlogConfig);
task.setStorageFormat(storageFormat);
@ -2079,7 +2086,9 @@ public class InternalCatalog implements CatalogIf<Database> {
&& (properties.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_GOAL_SIZE_MBYTES)
|| properties.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_FILE_COUNT_THRESHOLD)
|| properties
.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS))) {
.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS)
|| properties
.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD))) {
throw new DdlException("only time series compaction policy support for time series config");
}
@ -2116,6 +2125,17 @@ public class InternalCatalog implements CatalogIf<Database> {
}
olapTable.setTimeSeriesCompactionTimeThresholdSeconds(timeSeriesCompactionTimeThresholdSeconds);
// set time series compaction empty rowsets threshold
long timeSeriesCompactionEmptyRowsetsThreshold
= PropertyAnalyzer.TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD_DEFAULT_VALUE;
try {
timeSeriesCompactionEmptyRowsetsThreshold = PropertyAnalyzer
.analyzeTimeSeriesCompactionEmptyRowsetsThreshold(properties);
} catch (AnalysisException e) {
throw new DdlException(e.getMessage());
}
olapTable.setTimeSeriesCompactionEmptyRowsetsThreshold(timeSeriesCompactionEmptyRowsetsThreshold);
// get storage format
TStorageFormat storageFormat = TStorageFormat.V2; // default is segment v2
try {
@ -2466,6 +2486,7 @@ public class InternalCatalog implements CatalogIf<Database> {
olapTable.getCompactionPolicy(), olapTable.getTimeSeriesCompactionGoalSizeMbytes(),
olapTable.getTimeSeriesCompactionFileCountThreshold(),
olapTable.getTimeSeriesCompactionTimeThresholdSeconds(),
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold(),
storeRowColumn, binlogConfigForTask,
partitionInfo.getDataProperty(partitionId).isStorageMediumSpecified(),
keysDesc.getClusterKeysColumnIds());
@ -2542,6 +2563,7 @@ public class InternalCatalog implements CatalogIf<Database> {
olapTable.getCompactionPolicy(), olapTable.getTimeSeriesCompactionGoalSizeMbytes(),
olapTable.getTimeSeriesCompactionFileCountThreshold(),
olapTable.getTimeSeriesCompactionTimeThresholdSeconds(),
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold(),
storeRowColumn, binlogConfigForTask,
dataProperty.isStorageMediumSpecified(), keysDesc.getClusterKeysColumnIds());
olapTable.addPartition(partition);
@ -2990,6 +3012,7 @@ public class InternalCatalog implements CatalogIf<Database> {
olapTable.getCompactionPolicy(), olapTable.getTimeSeriesCompactionGoalSizeMbytes(),
olapTable.getTimeSeriesCompactionFileCountThreshold(),
olapTable.getTimeSeriesCompactionTimeThresholdSeconds(),
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold(),
olapTable.storeRowColumn(), binlogConfig,
copiedTbl.getPartitionInfo().getDataProperty(oldPartitionId).isStorageMediumSpecified(),
clusterKeyIdxes);

View File

@ -835,6 +835,7 @@ public class ReportHandler extends Daemon {
olapTable.getTimeSeriesCompactionGoalSizeMbytes(),
olapTable.getTimeSeriesCompactionFileCountThreshold(),
olapTable.getTimeSeriesCompactionTimeThresholdSeconds(),
olapTable.getTimeSeriesCompactionEmptyRowsetsThreshold(),
olapTable.storeRowColumn(),
binlogConfig);

View File

@ -111,6 +111,8 @@ public class CreateReplicaTask extends AgentTask {
private long timeSeriesCompactionTimeThresholdSeconds;
private long timeSeriesCompactionEmptyRowsetsThreshold;
private boolean storeRowColumn;
private BinlogConfig binlogConfig;
@ -134,6 +136,7 @@ public class CreateReplicaTask extends AgentTask {
long timeSeriesCompactionGoalSizeMbytes,
long timeSeriesCompactionFileCountThreshold,
long timeSeriesCompactionTimeThresholdSeconds,
long timeSeriesCompactionEmptyRowsetsThreshold,
boolean storeRowColumn,
BinlogConfig binlogConfig) {
super(null, backendId, TTaskType.CREATE, dbId, tableId, partitionId, indexId, tabletId);
@ -175,6 +178,7 @@ public class CreateReplicaTask extends AgentTask {
this.timeSeriesCompactionGoalSizeMbytes = timeSeriesCompactionGoalSizeMbytes;
this.timeSeriesCompactionFileCountThreshold = timeSeriesCompactionFileCountThreshold;
this.timeSeriesCompactionTimeThresholdSeconds = timeSeriesCompactionTimeThresholdSeconds;
this.timeSeriesCompactionEmptyRowsetsThreshold = timeSeriesCompactionEmptyRowsetsThreshold;
this.storeRowColumn = storeRowColumn;
this.binlogConfig = binlogConfig;
}
@ -322,6 +326,7 @@ public class CreateReplicaTask extends AgentTask {
createTabletReq.setTimeSeriesCompactionGoalSizeMbytes(timeSeriesCompactionGoalSizeMbytes);
createTabletReq.setTimeSeriesCompactionFileCountThreshold(timeSeriesCompactionFileCountThreshold);
createTabletReq.setTimeSeriesCompactionTimeThresholdSeconds(timeSeriesCompactionTimeThresholdSeconds);
createTabletReq.setTimeSeriesCompactionEmptyRowsetsThreshold(timeSeriesCompactionEmptyRowsetsThreshold);
if (binlogConfig != null) {
createTabletReq.setBinlogConfig(binlogConfig.toThrift());

View File

@ -155,6 +155,11 @@ public class UpdateTabletMetaInfoTask extends AgentTask {
metaInfo.setTimeSeriesCompactionTimeThresholdSeconds(timeSeriesCompactionConfig
.get(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_TIME_THRESHOLD_SECONDS));
}
if (timeSeriesCompactionConfig
.containsKey(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD)) {
metaInfo.setTimeSeriesCompactionEmptyRowsetsThreshold(timeSeriesCompactionConfig
.get(PropertyAnalyzer.PROPERTIES_TIME_SERIES_COMPACTION_EMPTY_ROWSETS_THRESHOLD));
}
}
if (enableSingleReplicaCompaction >= 0) {
metaInfo.setEnableSingleReplicaCompaction(enableSingleReplicaCompaction > 0);