diff --git a/fe/fe-core/src/main/java/com/starrocks/catalog/ListPartitionInfo.java b/fe/fe-core/src/main/java/com/starrocks/catalog/ListPartitionInfo.java index 7699aa3bd1f3d..1a309625632bd 100644 --- a/fe/fe-core/src/main/java/com/starrocks/catalog/ListPartitionInfo.java +++ b/fe/fe-core/src/main/java/com/starrocks/catalog/ListPartitionInfo.java @@ -653,6 +653,49 @@ public Object clone() { return info; } + @Override + public void setPartitionIdsForRestore(Map partitionOldIdToNewId) { + super.setPartitionIdsForRestore(partitionOldIdToNewId); + + Map>> oldIdToMultiValues = this.idToMultiValues; + Map>> oldIdToMultiLiteralExprValues = this.idToMultiLiteralExprValues; + Map> oldIdToValues = this.idToValues; + Map> oldIdToLiteralExprValues = this.idToLiteralExprValues; + Map oldIdToIsTempPartition = this.idToIsTempPartition; + + this.idToMultiValues = new HashMap<>(); + this.idToMultiLiteralExprValues = new HashMap<>(); + this.idToValues = new HashMap<>(); + this.idToLiteralExprValues = new HashMap<>(); + this.idToIsTempPartition = new HashMap<>(); + + for (Map.Entry entry : partitionOldIdToNewId.entrySet()) { + Long oldId = entry.getKey(); + Long newId = entry.getValue(); + + List> multiValues = oldIdToMultiValues.get(oldId); + if (multiValues != null) { + this.idToMultiValues.put(newId, multiValues); + } + List> multiLiteralExprValues = oldIdToMultiLiteralExprValues.get(oldId); + if (multiLiteralExprValues != null) { + this.idToMultiLiteralExprValues.put(newId, multiLiteralExprValues); + } + List values = oldIdToValues.get(oldId); + if (values != null) { + this.idToValues.put(newId, values); + } + List literalExprValues = oldIdToLiteralExprValues.get(oldId); + if (literalExprValues != null) { + this.idToLiteralExprValues.put(newId, literalExprValues); + } + Boolean isTempPartition = oldIdToIsTempPartition.get(oldId); + if (isTempPartition != null) { + this.idToIsTempPartition.put(newId, isTempPartition); + } + } + } + @Override public void gsonPostProcess() throws IOException { super.gsonPostProcess(); diff --git a/fe/fe-core/src/main/java/com/starrocks/catalog/OlapTable.java b/fe/fe-core/src/main/java/com/starrocks/catalog/OlapTable.java index 55369dddf3db8..49e777cc4af9f 100644 --- a/fe/fe-core/src/main/java/com/starrocks/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/com/starrocks/catalog/OlapTable.java @@ -828,141 +828,46 @@ public Status resetIdsForRestore(GlobalStateMgr globalStateMgr, Database db, int // base index baseIndexId = newIdxId; } - indexIdToMeta.put(newIdxId, origIndexIdToMeta.get(entry.getKey())); - indexIdToMeta.get(newIdxId).setIndexIdForRestore(newIdxId); - indexIdToMeta.get(newIdxId).setSchemaId(newIdxId); + MaterializedIndexMeta indexMeta = origIndexIdToMeta.get(entry.getKey()); + indexMeta.setIndexIdForRestore(newIdxId); + indexMeta.setSchemaId(newIdxId); + indexIdToMeta.put(newIdxId, indexMeta); indexNameToId.put(entry.getValue(), newIdxId); } - // generate a partition name to id map - Map origPartNameToId = Maps.newHashMap(); - for (Partition partition : idToPartition.values()) { - origPartNameToId.put(partition.getName(), partition.getId()); - LOG.info("partition id {} sub partition {}", partition.getId(), partition.getSubPartitions()); + // generate a partition old id to new id map + Map partitionOldIdToNewId = Maps.newHashMap(); + for (Long id : idToPartition.keySet()) { + partitionOldIdToNewId.put(id, globalStateMgr.getNextId()); } - // reset partition info and idToPartition map - if (partitionInfo.isRangePartition()) { - RangePartitionInfo rangePartitionInfo = (RangePartitionInfo) partitionInfo; - RangePartitionInfo origRangePartitionInfo = (RangePartitionInfo) rangePartitionInfo.clone(); - for (Long partitionId : origPartNameToId.values()) { - rangePartitionInfo.dropPartition(partitionId); - } - Map origIdToPartition = Maps.newHashMap(idToPartition); - idToPartition.clear(); - physicalPartitionIdToPartitionId.clear(); - physicalPartitionNameToPartitionId.clear(); - for (Map.Entry entry : origPartNameToId.entrySet()) { - long newPartId = globalStateMgr.getNextId(); - // preserve existing info - DataProperty dataProperty = origRangePartitionInfo.getDataProperty(entry.getValue()); - boolean inMemory = origRangePartitionInfo.getIsInMemory(entry.getValue()); - DataCacheInfo dataCacheInfo = origRangePartitionInfo.getDataCacheInfo(entry.getValue()); - Range range = origRangePartitionInfo.getIdToRange(false).get(entry.getValue()); - // replace with new info - rangePartitionInfo.addPartition(newPartId, false, range, dataProperty, (short) restoreReplicationNum, - inMemory, dataCacheInfo); - idToPartition.put(newPartId, origIdToPartition.get(entry.getValue())); - Partition partition = idToPartition.get(newPartId); - partition.setIdForRestore(newPartId); - List origPhysicalPartitions = Lists.newArrayList(partition.getSubPartitions()); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - partition.removeSubPartition(physicalPartition.getId()); - } - }); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - physicalPartition.setIdForRestore(globalStateMgr.getNextId()); - physicalPartition.setParentId(newPartId); - partition.addSubPartition(physicalPartition); - } - physicalPartitionIdToPartitionId.put(physicalPartition.getId(), newPartId); - physicalPartitionNameToPartitionId.put(physicalPartition.getName(), newPartId); - }); - } - } else if (partitionInfo.isListPartition()) { - ListPartitionInfo listPartitionInfo = (ListPartitionInfo) partitionInfo; - ListPartitionInfo origListPartitionInfo = (ListPartitionInfo) listPartitionInfo.clone(); - for (Long partitionId : origPartNameToId.values()) { - listPartitionInfo.dropPartition(partitionId); - } - Map origIdToPartition = Maps.newHashMap(idToPartition); - idToPartition.clear(); - physicalPartitionIdToPartitionId.clear(); - physicalPartitionNameToPartitionId.clear(); - for (Map.Entry entry : origPartNameToId.entrySet()) { - long newPartId = globalStateMgr.getNextId(); - // preserve existing info - DataProperty dataProperty = origListPartitionInfo.getDataProperty(entry.getValue()); - boolean inMemory = origListPartitionInfo.getIsInMemory(entry.getValue()); - DataCacheInfo dataCacheInfo = origListPartitionInfo.getDataCacheInfo(entry.getValue()); - List values = origListPartitionInfo.getIdToValues().get(entry.getValue()); - List> multiValues = origListPartitionInfo.getIdToMultiValues().get(entry.getValue()); - // replace with new info - try { - listPartitionInfo.addPartition(idToColumn, newPartId, dataProperty, (short) restoreReplicationNum, - inMemory, dataCacheInfo, values, multiValues); - } catch (AnalysisException e) { - return new Status(ErrCode.COMMON_ERROR, "Failed to add partition " + e.getMessage()); + // reset partiton info + partitionInfo.setPartitionIdsForRestore(partitionOldIdToNewId); + + // reset partitions + List partitions = Lists.newArrayList(idToPartition.values()); + idToPartition.clear(); + physicalPartitionIdToPartitionId.clear(); + physicalPartitionNameToPartitionId.clear(); + for (Partition partition : partitions) { + long newPartitionId = partitionOldIdToNewId.get(partition.getId()); + partition.setIdForRestore(newPartitionId); + idToPartition.put(newPartitionId, partition); + List origPhysicalPartitions = Lists.newArrayList(partition.getSubPartitions()); + origPhysicalPartitions.forEach(physicalPartition -> { + if (physicalPartition.getId() != newPartitionId) { + partition.removeSubPartition(physicalPartition.getId()); } - idToPartition.put(newPartId, origIdToPartition.get(entry.getValue())); - Partition partition = idToPartition.get(newPartId); - partition.setIdForRestore(newPartId); - List origPhysicalPartitions = Lists.newArrayList(partition.getSubPartitions()); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - partition.removeSubPartition(physicalPartition.getId()); - } - }); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - physicalPartition.setIdForRestore(globalStateMgr.getNextId()); - physicalPartition.setParentId(newPartId); - partition.addSubPartition(physicalPartition); - } - physicalPartitionIdToPartitionId.put(physicalPartition.getId(), newPartId); - physicalPartitionNameToPartitionId.put(physicalPartition.getName(), newPartId); - }); - } - } else if (partitionInfo.isUnPartitioned()) { - // Single partitioned - PartitionInfo origPartitionInfo = (PartitionInfo) partitionInfo.clone(); - for (Long partitionId : origPartNameToId.values()) { - partitionInfo.dropPartition(partitionId); - } - Map origIdToPartition = Maps.newHashMap(idToPartition); - idToPartition.clear(); - physicalPartitionIdToPartitionId.clear(); - physicalPartitionNameToPartitionId.clear(); - for (Map.Entry entry : origPartNameToId.entrySet()) { - long newPartId = globalStateMgr.getNextId(); - DataProperty dataProperty = origPartitionInfo.getDataProperty(entry.getValue()); - boolean inMemory = origPartitionInfo.getIsInMemory(entry.getValue()); - DataCacheInfo dataCacheInfo = origPartitionInfo.getDataCacheInfo(entry.getValue()); - partitionInfo.addPartition(newPartId, dataProperty, (short) restoreReplicationNum, inMemory, - dataCacheInfo); - idToPartition.put(newPartId, origIdToPartition.get(entry.getValue())); - Partition partition = idToPartition.get(newPartId); - partition.setIdForRestore(newPartId); - List origPhysicalPartitions = Lists.newArrayList(partition.getSubPartitions()); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - partition.removeSubPartition(physicalPartition.getId()); - } - }); - origPhysicalPartitions.forEach(physicalPartition -> { - if (physicalPartition.getId() != newPartId) { - physicalPartition.setIdForRestore(globalStateMgr.getNextId()); - physicalPartition.setParentId(newPartId); - partition.addSubPartition(physicalPartition); - } - physicalPartitionIdToPartitionId.put(physicalPartition.getId(), newPartId); - physicalPartitionNameToPartitionId.put(physicalPartition.getName(), newPartId); - }); - } - } else { - return new Status(ErrCode.UNSUPPORTED, "Unsupported partition type: " + partitionInfo.getType()); + }); + origPhysicalPartitions.forEach(physicalPartition -> { + if (physicalPartition.getId() != newPartitionId) { + physicalPartition.setIdForRestore(globalStateMgr.getNextId()); + physicalPartition.setParentId(newPartitionId); + partition.addSubPartition(physicalPartition); + } + physicalPartitionIdToPartitionId.put(physicalPartition.getId(), newPartitionId); + physicalPartitionNameToPartitionId.put(physicalPartition.getName(), newPartitionId); + }); } // reset replication number for olaptable diff --git a/fe/fe-core/src/main/java/com/starrocks/catalog/PartitionInfo.java b/fe/fe-core/src/main/java/com/starrocks/catalog/PartitionInfo.java index d0322134711f5..c7548dfe39c15 100644 --- a/fe/fe-core/src/main/java/com/starrocks/catalog/PartitionInfo.java +++ b/fe/fe-core/src/main/java/com/starrocks/catalog/PartitionInfo.java @@ -311,4 +311,44 @@ protected Object clone() { throw new RuntimeException(e); } } + + public void setPartitionIdsForRestore(Map partitionOldIdToNewId) { + Map oldIdToDataProperty = this.idToDataProperty; + Map oldIdToReplicationNum = this.idToReplicationNum; + Map oldIdToInMemory = this.idToInMemory; + Map oldIdToTabletType = this.idToTabletType; + Map oldIdToStorageCacheInfo = this.idToStorageCacheInfo; + + this.idToDataProperty = new HashMap<>(); + this.idToReplicationNum = new HashMap<>(); + this.idToInMemory = new HashMap<>(); + this.idToTabletType = new HashMap<>(); + this.idToStorageCacheInfo = new HashMap<>(); + + for (Map.Entry entry : partitionOldIdToNewId.entrySet()) { + Long oldId = entry.getKey(); + Long newId = entry.getValue(); + + DataProperty dataProperty = oldIdToDataProperty.get(oldId); + if (dataProperty != null) { + this.idToDataProperty.put(newId, dataProperty); + } + Short replicationNum = oldIdToReplicationNum.get(oldId); + if (replicationNum != null) { + this.idToReplicationNum.put(newId, replicationNum); + } + Boolean inMemory = oldIdToInMemory.get(oldId); + if (inMemory != null) { + this.idToInMemory.put(newId, inMemory); + } + TTabletType tabletType = oldIdToTabletType.get(oldId); + if (tabletType != null) { + this.idToTabletType.put(newId, tabletType); + } + DataCacheInfo dataCacheInfo = oldIdToStorageCacheInfo.get(oldId); + if (dataCacheInfo != null) { + this.idToStorageCacheInfo.put(newId, dataCacheInfo); + } + } + } } diff --git a/fe/fe-core/src/main/java/com/starrocks/catalog/RangePartitionInfo.java b/fe/fe-core/src/main/java/com/starrocks/catalog/RangePartitionInfo.java index 83f486e186177..ca59eba8647bb 100644 --- a/fe/fe-core/src/main/java/com/starrocks/catalog/RangePartitionInfo.java +++ b/fe/fe-core/src/main/java/com/starrocks/catalog/RangePartitionInfo.java @@ -569,4 +569,29 @@ protected Object clone() { info.isMultiColumnPartition = partitionColumnIds.size() > 1; return info; } + + @Override + public void setPartitionIdsForRestore(Map partitionOldIdToNewId) { + super.setPartitionIdsForRestore(partitionOldIdToNewId); + + Map> oldIdToRange = this.idToRange; + Map> oldIdToTempRange = this.idToTempRange; + + this.idToRange = new ConcurrentHashMap<>(); + this.idToTempRange = new ConcurrentHashMap<>(); + + for (Map.Entry entry : partitionOldIdToNewId.entrySet()) { + Long oldId = entry.getKey(); + Long newId = entry.getValue(); + + Range range = oldIdToRange.get(oldId); + if (range != null) { + this.idToRange.put(newId, range); + } + Range tempRange = oldIdToTempRange.get(oldId); + if (tempRange != null) { + this.idToTempRange.put(newId, tempRange); + } + } + } }