This is an automated email from the ASF dual-hosted git repository. caiconghui pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 3070318f95 [Enhancement](IdGenerator) Use IdGeneratorBuffer to get better performance for creating tablet in fe when do alter table job (#11524) 3070318f95 is described below commit 3070318f95ad486466be3021019d9b7eeebcd1ad Author: caiconghui <55968745+caicong...@users.noreply.github.com> AuthorDate: Fri Aug 5 23:27:29 2022 +0800 [Enhancement](IdGenerator) Use IdGeneratorBuffer to get better performance for creating tablet in fe when do alter table job (#11524) Co-authored-by: caiconghui1 <caicongh...@jd.com> --- .../doris/alter/MaterializedViewHandler.java | 13 +++++-- .../apache/doris/alter/SchemaChangeHandler.java | 44 ++++++++++++---------- .../org/apache/doris/catalog/MetaIdGenerator.java | 7 +++- .../apache/doris/common/util/IdGeneratorUtil.java | 24 ++++++++++-- .../doris/datasource/InternalDataSource.java | 4 +- .../apache/doris/catalog/MetaIdGeneratorTest.java | 44 ++++++++++++++++++++++ 6 files changed, 105 insertions(+), 31 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java index 568b3623b5..504db3aa71 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java @@ -32,6 +32,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.MaterializedIndex; import org.apache.doris.catalog.MaterializedIndex.IndexState; +import org.apache.doris.catalog.MetaIdGenerator.IdGeneratorBuffer; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.OlapTable.OlapTableState; import org.apache.doris.catalog.Partition; @@ -47,6 +48,7 @@ import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; import org.apache.doris.common.MetaNotFoundException; +import org.apache.doris.common.util.IdGeneratorUtil; import org.apache.doris.common.util.ListComparator; import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.common.util.Util; @@ -63,6 +65,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -343,8 +346,10 @@ public class MaterializedViewHandler extends AlterHandler { long tableId = olapTable.getId(); int baseSchemaHash = olapTable.getSchemaHashByIndexId(baseIndexId); Env env = Env.getCurrentEnv(); - long jobId = env.getNextId(); - long mvIndexId = env.getNextId(); + long bufferSize = IdGeneratorUtil.getBufferSizeForAlterTable(olapTable, Sets.newHashSet(baseIndexId)); + IdGeneratorBuffer idGeneratorBuffer = env.getIdGeneratorBuffer(bufferSize); + long jobId = idGeneratorBuffer.getNextId(); + long mvIndexId = idGeneratorBuffer.getNextId(); RollupJobV2 mvJob = new RollupJobV2(jobId, dbId, tableId, olapTable.getName(), timeoutMs, baseIndexId, mvIndexId, baseIndexName, mvName, mvColumns, baseSchemaHash, mvSchemaHash, @@ -372,7 +377,7 @@ public class MaterializedViewHandler extends AlterHandler { short replicationNum = olapTable.getPartitionInfo().getReplicaAllocation(partitionId).getTotalReplicaNum(); for (Tablet baseTablet : baseIndex.getTablets()) { long baseTabletId = baseTablet.getId(); - long mvTabletId = env.getNextId(); + long mvTabletId = idGeneratorBuffer.getNextId(); Tablet newTablet = new Tablet(mvTabletId); mvIndex.addTablet(newTablet, mvTabletMeta); @@ -383,7 +388,7 @@ public class MaterializedViewHandler extends AlterHandler { int healthyReplicaNum = 0; for (Replica baseReplica : baseReplicas) { - long mvReplicaId = env.getNextId(); + long mvReplicaId = idGeneratorBuffer.getNextId(); long backendId = baseReplica.getBackendId(); if (baseReplica.getState() == ReplicaState.CLONE || baseReplica.getState() == ReplicaState.DECOMMISSION diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java index be4fc53cea..e2c3d0f8b3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java @@ -43,6 +43,7 @@ import org.apache.doris.catalog.MaterializedIndex; import org.apache.doris.catalog.MaterializedIndex.IndexExtState; import org.apache.doris.catalog.MaterializedIndex.IndexState; import org.apache.doris.catalog.MaterializedIndexMeta; +import org.apache.doris.catalog.MetaIdGenerator.IdGeneratorBuffer; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.OlapTable.OlapTableState; import org.apache.doris.catalog.Partition; @@ -66,6 +67,7 @@ import org.apache.doris.common.Pair; import org.apache.doris.common.ThreadPoolManager; import org.apache.doris.common.UserException; import org.apache.doris.common.util.DynamicPartitionUtil; +import org.apache.doris.common.util.IdGeneratorUtil; import org.apache.doris.common.util.ListComparator; import org.apache.doris.common.util.PropertyAnalyzer; import org.apache.doris.common.util.Util; @@ -1218,23 +1220,6 @@ public class SchemaChangeHandler extends AlterHandler { TStorageFormat storageFormat = PropertyAnalyzer.analyzeStorageFormat(propertyMap); - // create job - Env env = Env.getCurrentEnv(); - long jobId = env.getNextId(); - SchemaChangeJobV2 schemaChangeJob = new SchemaChangeJobV2(jobId, dbId, - olapTable.getId(), olapTable.getName(), timeoutSecond * 1000); - schemaChangeJob.setBloomFilterInfo(hasBfChange, bfColumns, bfFpp); - schemaChangeJob.setAlterIndexInfo(hasIndexChange, indexes); - - // If StorageFormat is set to TStorageFormat.V2 - // which will create tablet with preferred_rowset_type set to BETA - // for both base table and rollup index - if (hasIndexChange) { - // only V2 support index, so if there is index changed, storage format must be V2 - storageFormat = TStorageFormat.V2; - } - schemaChangeJob.setStorageFormat(storageFormat); - // begin checking each table // ATTN: DO NOT change any meta in this loop long tableId = olapTable.getId(); @@ -1413,6 +1398,24 @@ public class SchemaChangeHandler extends AlterHandler { throw new DdlException("Nothing is changed. please check your alter stmt."); } + // create job + long bufferSize = IdGeneratorUtil.getBufferSizeForAlterTable(olapTable, changedIndexIdToSchema.keySet()); + IdGeneratorBuffer idGeneratorBuffer = Env.getCurrentEnv().getIdGeneratorBuffer(bufferSize); + long jobId = idGeneratorBuffer.getNextId(); + SchemaChangeJobV2 schemaChangeJob = new SchemaChangeJobV2(jobId, dbId, + olapTable.getId(), olapTable.getName(), timeoutSecond * 1000); + schemaChangeJob.setBloomFilterInfo(hasBfChange, bfColumns, bfFpp); + schemaChangeJob.setAlterIndexInfo(hasIndexChange, indexes); + + // If StorageFormat is set to TStorageFormat.V2 + // which will create tablet with preferred_rowset_type set to BETA + // for both base table and rollup index + if (hasIndexChange) { + // only V2 support index, so if there is index changed, storage format must be V2 + storageFormat = TStorageFormat.V2; + } + schemaChangeJob.setStorageFormat(storageFormat); + // the following operations are done outside the 'for indices' loop // to avoid partial check success @@ -1437,7 +1440,7 @@ public class SchemaChangeHandler extends AlterHandler { } String newIndexName = SHADOW_NAME_PRFIX + olapTable.getIndexNameById(originIndexId); short newShortKeyColumnCount = indexIdToShortKeyColumnCount.get(originIndexId); - long shadowIndexId = env.getNextId(); + long shadowIndexId = idGeneratorBuffer.getNextId(); // create SHADOW index for each partition List<Tablet> addedTablets = Lists.newArrayList(); @@ -1453,7 +1456,7 @@ public class SchemaChangeHandler extends AlterHandler { Short totalReplicaNum = replicaAlloc.getTotalReplicaNum(); for (Tablet originTablet : originIndex.getTablets()) { long originTabletId = originTablet.getId(); - long shadowTabletId = env.getNextId(); + long shadowTabletId = idGeneratorBuffer.getNextId(); Tablet shadowTablet = new Tablet(shadowTabletId); shadowIndex.addTablet(shadowTablet, shadowTabletMeta); @@ -1464,11 +1467,12 @@ public class SchemaChangeHandler extends AlterHandler { int healthyReplicaNum = 0; for (Replica originReplica : originReplicas) { - long shadowReplicaId = env.getNextId(); + long shadowReplicaId = idGeneratorBuffer.getNextId(); long backendId = originReplica.getBackendId(); if (originReplica.getState() == Replica.ReplicaState.CLONE || originReplica.getState() == Replica.ReplicaState.DECOMMISSION + || originReplica.getState() == ReplicaState.COMPACTION_TOO_SLOW || originReplica.getLastFailedVersion() > 0) { LOG.info("origin replica {} of tablet {} state is {}," + " and last failed version is {}, skip creating shadow replica", diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetaIdGenerator.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetaIdGenerator.java index d2f16a6fc2..65e30320c2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetaIdGenerator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetaIdGenerator.java @@ -58,7 +58,8 @@ public class MetaIdGenerator { IdGeneratorBuffer idGeneratorBuffer = new IdGeneratorBuffer(nextId, nextId + bufferSize - 1); nextId = nextId + bufferSize; if (nextId > batchEndId) { - batchEndId = batchEndId + (bufferSize / BATCH_ID_INTERVAL + 1) * BATCH_ID_INTERVAL; + batchEndId = batchEndId + ((nextId - batchEndId) / BATCH_ID_INTERVAL + 1) * BATCH_ID_INTERVAL; + Preconditions.checkState(nextId <= batchEndId); if (editLog != null) { editLog.logSaveNextId(batchEndId); } @@ -91,5 +92,9 @@ public class MetaIdGenerator { Preconditions.checkState(nextId <= batchEndId); return nextId++; } + + public long getBatchEndId() { + return batchEndId; + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java index b9609d409a..1369c0b405 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/IdGeneratorUtil.java @@ -19,17 +19,20 @@ package org.apache.doris.common.util; import org.apache.doris.analysis.CreateTableStmt; import org.apache.doris.analysis.SinglePartitionDesc; +import org.apache.doris.catalog.MaterializedIndex; import org.apache.doris.catalog.OlapTable; +import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.ReplicaAllocation; -import org.apache.doris.common.AnalysisException; +import org.apache.doris.catalog.Tablet; import org.apache.doris.common.DdlException; import java.util.Collection; +import java.util.Set; public class IdGeneratorUtil { - public static long getBufferSize(CreateTableStmt stmt, ReplicaAllocation replicaAlloc) throws DdlException, - AnalysisException { + public static long getBufferSizeForCreateTable(CreateTableStmt stmt, ReplicaAllocation replicaAlloc) + throws DdlException { long bufferSize = 1; long partitionNum = stmt.getPartitionDesc() == null ? 1 : stmt.getPartitionDesc().getSinglePartitionDescs().size(); @@ -47,7 +50,7 @@ public class IdGeneratorUtil { return bufferSize; } - public static long getBufferSize(OlapTable table, Collection<Long> partitionIds) { + public static long getBufferSizeForTruncateTable(OlapTable table, Collection<Long> partitionIds) { long bufferSize = 0; for (Long partitionId : partitionIds) { bufferSize = bufferSize + 1; @@ -58,4 +61,17 @@ public class IdGeneratorUtil { } return bufferSize; } + + public static long getBufferSizeForAlterTable(OlapTable table, Set<Long> indexIdSet) { + long bufferSize = 1 + indexIdSet.size(); + for (Long indexId : indexIdSet) { + for (Partition partition : table.getPartitions()) { + MaterializedIndex originIndex = partition.getIndex(indexId); + for (Tablet baseTablet : originIndex.getTablets()) { + bufferSize = bufferSize + 1 + baseTablet.getReplicas().size(); + } + } + } + return bufferSize; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java index a490745d74..27ceedcc8f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java @@ -1670,7 +1670,7 @@ public class InternalDataSource implements DataSourceIf<Database> { replicaAlloc = ReplicaAllocation.DEFAULT_ALLOCATION; } - long bufferSize = IdGeneratorUtil.getBufferSize(stmt, replicaAlloc); + long bufferSize = IdGeneratorUtil.getBufferSizeForCreateTable(stmt, replicaAlloc); IdGeneratorBuffer idGeneratorBuffer = Env.getCurrentEnv().getIdGeneratorBuffer(bufferSize); // create partition info @@ -2376,7 +2376,7 @@ public class InternalDataSource implements DataSourceIf<Database> { List<Partition> newPartitions = Lists.newArrayList(); // tabletIdSet to save all newly created tablet ids. Set<Long> tabletIdSet = Sets.newHashSet(); - long bufferSize = IdGeneratorUtil.getBufferSize(copiedTbl, origPartitions.values()); + long bufferSize = IdGeneratorUtil.getBufferSizeForTruncateTable(copiedTbl, origPartitions.values()); IdGeneratorBuffer idGeneratorBuffer = Env.getCurrentEnv().getIdGeneratorBuffer(bufferSize); try { for (Map.Entry<String, Long> entry : origPartitions.entrySet()) { diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/MetaIdGeneratorTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/MetaIdGeneratorTest.java new file mode 100644 index 0000000000..7bd1b34158 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/MetaIdGeneratorTest.java @@ -0,0 +1,44 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.catalog; + +import org.apache.doris.catalog.MetaIdGenerator.IdGeneratorBuffer; + +import org.junit.Assert; +import org.junit.Test; + + +public class MetaIdGeneratorTest { + + @Test + public void normalTest() { + MetaIdGenerator idGenerator = new MetaIdGenerator(10); + Assert.assertEquals(10, idGenerator.getBatchEndId()); + Assert.assertEquals(11, idGenerator.getNextId()); + Assert.assertEquals(1010, idGenerator.getBatchEndId()); + + IdGeneratorBuffer idGeneratorBuffer = idGenerator.getIdGeneratorBuffer(3500); + Assert.assertEquals(12, idGeneratorBuffer.getNextId()); + Assert.assertEquals(4010, idGenerator.getBatchEndId()); + for (int i = 1; i < 3500; i++) { + Assert.assertEquals(i + 12, idGeneratorBuffer.getNextId()); + } + Assert.assertEquals(3511, idGeneratorBuffer.getBatchEndId()); + Assert.assertEquals(3512, idGenerator.getNextId()); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org