This is an automated email from the ASF dual-hosted git repository.
hellostephen pushed a commit to branch editlog-test
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/editlog-test by this push:
new 7e61f691efd temp branch just for qa test (#54108)
7e61f691efd is described below
commit 7e61f691efd4fe23c6e71cececd3b635002ce4ef
Author: deardeng <[email protected]>
AuthorDate: Wed Jul 30 19:47:58 2025 +0800
temp branch just for qa test (#54108)
### What problem does this PR solve?
Issue Number: close #xxx
Related PR: #xxx
Problem Summary:
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [ ] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
---
.../doris/alter/MaterializedViewHandler.java | 9 +-
.../org/apache/doris/analysis/PartitionDesc.java | 2 +-
.../java/org/apache/doris/backup/RestoreJob.java | 7 +-
.../apache/doris/catalog/ColocateTableIndex.java | 6 +-
.../main/java/org/apache/doris/catalog/Env.java | 5 -
.../apache/doris/catalog/ListPartitionInfo.java | 2 +-
.../apache/doris/catalog/ListPartitionItem.java | 4 +-
.../java/org/apache/doris/catalog/OlapTable.java | 994 +++++++++++++--------
.../org/apache/doris/catalog/PartitionInfo.java | 326 ++++---
.../org/apache/doris/catalog/PartitionKey.java | 15 +
.../apache/doris/catalog/RangePartitionInfo.java | 4 +-
.../apache/doris/catalog/RangePartitionItem.java | 4 +-
.../org/apache/doris/catalog/TableIndexes.java | 5 -
.../apache/doris/datasource/InternalCatalog.java | 6 +
14 files changed, 874 insertions(+), 515 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 624361b4390..966a7d3e81e 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
@@ -912,8 +912,13 @@ public class MaterializedViewHandler extends AlterHandler {
}
// 2. check if rollup index already exists
- if (olapTable.hasMaterializedIndex(rollupIndexName)) {
- throw new DdlException("Rollup index[" + rollupIndexName + "]
already exists");
+ olapTable.readLock();
+ try {
+ if (olapTable.hasMaterializedIndex(rollupIndexName)) {
+ throw new DdlException("Rollup index[" + rollupIndexName + "]
already exists");
+ }
+ } finally {
+ olapTable.readUnlock();
}
// 3. check if rollup columns are valid
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionDesc.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionDesc.java
index ae1763fbfb1..4b9a64d176e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionDesc.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/PartitionDesc.java
@@ -282,7 +282,7 @@ public class PartitionDesc {
}
public PartitionInfo toPartitionInfo(List<Column> schema, Map<String,
Long> partitionNameToId, boolean isTemp)
- throws DdlException, AnalysisException {
+ throws DdlException {
throw new NotImplementedException("toPartitionInfo not implemented");
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
index 6809bdcb770..3de29c31951 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
@@ -844,6 +844,7 @@ public class RestoreJob extends AbstractJob implements
GsonPostProcessable {
// Table does not exist or atomic restore
if (localTbl == null || isAtomicRestore) {
OlapTable remoteOlapTbl = (OlapTable) remoteTbl;
+ remoteOlapTbl.writeLock();
// Retain only expected restore partitions in this table;
Set<String> allPartNames =
remoteOlapTbl.getPartitionNames();
for (String partName : allPartNames) {
@@ -883,6 +884,7 @@ public class RestoreJob extends AbstractJob implements
GsonPostProcessable {
LOG.debug("put remote table {} to restoredTbls",
remoteOlapTbl.getName());
}
stagingRestoreTables.add(remoteOlapTbl);
+ remoteOlapTbl.writeUnlock();
}
} // end of all restore olap tables
@@ -992,7 +994,9 @@ public class RestoreJob extends AbstractJob implements
GsonPostProcessable {
.getType() == TableType.VIEW) && isAtomicRestore) {
tableName = tableAliasWithAtomicRestore(tableName);
}
+ restoreTbl.writeLock();
restoreTbl.setName(tableName);
+ restoreTbl.writeUnlock();
restoredTbls.add(restoreTbl);
}
@@ -1661,7 +1665,8 @@ public class RestoreJob extends AbstractJob implements
GsonPostProcessable {
if (reserveReplica) {
restoreReplicaAlloc =
remotePartitionInfo.getReplicaAllocation(remotePartId);
}
- localPartitionInfo.addPartition(restorePart.getId(), false,
remotePartitionInfo.getItem(remotePartId),
+ localPartitionInfo.addPartition(restorePart.getId(), false,
+ remotePartitionInfo.getItem(remotePartId),
remoteDataProperty, restoreReplicaAlloc,
remotePartitionInfo.getIsInMemory(remotePartId),
remotePartitionInfo.getIsMutable(remotePartId));
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
index 8b5ddd243c6..459d6d45d40 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
@@ -977,11 +977,7 @@ public class ColocateTableIndex implements Writable {
tableProperty.modifyTableProperties(analyzedDynamicPartition);
tableProperty.buildDynamicProperty();
}
- for (ReplicaAllocation alloc :
table.getPartitionInfo().getPartitionReplicaAllocations().values()) {
- Map<Tag, Short> allocMap = alloc.getAllocMap();
- allocMap.clear();
- allocMap.putAll(replicaAlloc.getAllocMap());
- }
+ table.getPartitionInfo().modifyReplicaAlloc(replicaAlloc);
} finally {
table.writeUnlock();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index 1b8894a69f8..0e1eac566b6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -4812,11 +4812,6 @@ public class Env {
catalogIf.dropTable(dbName, tableName, true, false, ifExists, false);
}
- public boolean unprotectDropTable(Database db, Table table, boolean
isForceDrop, boolean isReplay,
- Long recycleTime) {
- return getInternalCatalog().unprotectDropTable(db, table, isForceDrop,
isReplay, recycleTime);
- }
-
public void replayDropTable(Database db, long tableId, boolean isForceDrop,
Long recycleTime) throws MetaNotFoundException
{
getInternalCatalog().replayDropTable(db, tableId, isForceDrop,
recycleTime);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionInfo.java
index f82af4497c5..f4305bb435e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionInfo.java
@@ -217,7 +217,7 @@ public class ListPartitionInfo extends PartitionInfo {
String partitionName = partition.getName();
List<PartitionKey> partitionKeys = entry.getValue().getItems();
- List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionInfo::toPartitionValue)
+ List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionKey::toPartitionValue)
.collect(Collectors.toList());
PartitionKeyDesc partitionKeyDesc =
PartitionKeyDesc.createIn(inValues);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionItem.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionItem.java
index cccd1bcbc50..d5bf4cad518 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionItem.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ListPartitionItem.java
@@ -82,14 +82,14 @@ public class ListPartitionItem extends PartitionItem {
@Override
public PartitionKeyDesc toPartitionKeyDesc() {
- List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionInfo::toPartitionValue)
+ List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionKey::toPartitionValue)
.collect(Collectors.toList());
return PartitionKeyDesc.createIn(inValues);
}
@Override
public PartitionKeyDesc toPartitionKeyDesc(int pos) throws
AnalysisException {
- List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionInfo::toPartitionValue)
+ List<List<PartitionValue>> inValues =
partitionKeys.stream().map(PartitionKey::toPartitionValue)
.collect(Collectors.toList());
Set<List<PartitionValue>> res = Sets.newHashSet();
for (List<PartitionValue> values : inValues) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
index ea3c8004aed..9afcac7def5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
@@ -17,13 +17,11 @@
package org.apache.doris.catalog;
-import org.apache.doris.alter.MaterializedViewHandler;
import org.apache.doris.analysis.AggregateInfo;
import org.apache.doris.analysis.ColumnDef;
import org.apache.doris.analysis.CreateMaterializedViewStmt;
import org.apache.doris.analysis.DataSortInfo;
import org.apache.doris.analysis.Expr;
-import org.apache.doris.analysis.IndexDef;
import org.apache.doris.analysis.SlotDescriptor;
import org.apache.doris.analysis.SlotRef;
import org.apache.doris.backup.Status;
@@ -52,14 +50,11 @@ import org.apache.doris.common.io.DeepCopy;
import org.apache.doris.common.io.Text;
import org.apache.doris.common.util.PropertyAnalyzer;
import org.apache.doris.common.util.Util;
-import org.apache.doris.datasource.InternalCatalog;
import org.apache.doris.datasource.mvcc.MvccSnapshot;
import org.apache.doris.mtmv.MTMVRefreshContext;
import org.apache.doris.mtmv.MTMVRelatedTableIf;
import org.apache.doris.mtmv.MTMVSnapshotIf;
import org.apache.doris.mtmv.MTMVVersionSnapshot;
-import org.apache.doris.nereids.hint.Hint;
-import org.apache.doris.nereids.hint.UseMvHint;
import org.apache.doris.nereids.trees.plans.algebra.CatalogRelation;
import org.apache.doris.persist.ColocatePersistInfo;
import org.apache.doris.persist.gson.GsonPostProcessable;
@@ -136,17 +131,32 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
@Override
public Map<Long, PartitionItem> getOriginPartitions(CatalogRelation scan) {
- return getPartitionInfo().getIdToItem(false);
+ readLock();
+ try {
+ return getPartitionInfo().getIdToItem(false);
+ } finally {
+ readUnlock();
+ }
}
@Override
public Object getPartitionMetaVersion(CatalogRelation scan) throws
RpcException {
- return getVisibleVersion();
+ readLock();
+ try {
+ return getVisibleVersion();
+ } finally {
+ readUnlock();
+ }
}
@Override
public long getPartitionMetaLoadTimeMillis(CatalogRelation scan) {
- return getVisibleVersionTime();
+ readLock();
+ try {
+ return getVisibleVersionTime();
+ } finally {
+ readUnlock();
+ }
}
public enum OlapTableState {
@@ -279,121 +289,177 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public BinlogConfig getBinlogConfig() {
- return getOrCreatTableProperty().getBinlogConfig();
+ readLock();
+ try {
+ return getOrCreatTableProperty().getBinlogConfig();
+ } finally {
+ readUnlock();
+ }
}
public void setBinlogConfig(BinlogConfig binlogConfig) {
+ writeLock();
getOrCreatTableProperty().setBinlogConfig(binlogConfig);
+ writeUnlock();
}
public void setIsBeingSynced(boolean isBeingSynced) {
+ writeLock();
getOrCreatTableProperty().modifyTableProperties(PropertyAnalyzer.PROPERTIES_IS_BEING_SYNCED,
String.valueOf(isBeingSynced));
+ writeUnlock();
}
public String getStorageVaultName() {
- if (Strings.isNullOrEmpty(getStorageVaultId())) {
- return "";
+ readLock();
+ try {
+ if (Strings.isNullOrEmpty(getStorageVaultId())) {
+ return "";
+ }
+ return
Env.getCurrentEnv().getStorageVaultMgr().getVaultNameById(getStorageVaultId());
+ } finally {
+ readUnlock();
}
- return
Env.getCurrentEnv().getStorageVaultMgr().getVaultNameById(getStorageVaultId());
}
public void setStorageVaultId(String storageVaultId) throws DdlException {
if (Strings.isNullOrEmpty(storageVaultId)) {
throw new DdlException("Invalid storage vault id, please set an
available storage vault");
}
+ writeLock();
getOrCreatTableProperty().setStorageVaultId(storageVaultId);
+ writeUnlock();
}
public String getStorageVaultId() {
- return getOrCreatTableProperty().getStorageVaultId();
+ readLock();
+ try {
+ return getOrCreatTableProperty().getStorageVaultId();
+ } finally {
+ readUnlock();
+ }
}
public boolean isBeingSynced() {
- return getOrCreatTableProperty().isBeingSynced();
+ readLock();
+ try {
+ return getOrCreatTableProperty().isBeingSynced();
+ } finally {
+ readUnlock();
+ }
}
public boolean isTemporaryPartition(long partitionId) {
- return tempPartitions.hasPartition(partitionId);
+ readLock();
+ try {
+ return tempPartitions.hasPartition(partitionId);
+ } finally {
+ readUnlock();
+ }
}
public void setTableProperty(TableProperty tableProperty) {
+ writeLock();
this.tableProperty = tableProperty;
+ writeUnlock();
}
public TableProperty getTableProperty() {
- return this.tableProperty;
+ readLock();
+ try {
+ return this.tableProperty;
+ } finally {
+ readUnlock();
+ }
}
public boolean dynamicPartitionExists() {
- return tableProperty != null
+ readLock();
+ try {
+ return tableProperty != null
&& tableProperty.getDynamicPartitionProperty() != null
&& tableProperty.getDynamicPartitionProperty().isExist();
+ } finally {
+ readUnlock();
+ }
}
public boolean isZOrderSort() {
- return tableProperty != null
+ readLock();
+ try {
+ return tableProperty != null
&& tableProperty.getDataSortInfo() != null
&& tableProperty.getDataSortInfo().getSortType() ==
TSortType.ZORDER;
+ } finally {
+ readUnlock();
+ }
}
public void setBaseIndexId(long baseIndexId) {
+ writeLock();
this.baseIndexId = baseIndexId;
+ writeUnlock();
}
public long getBaseIndexId() {
- return baseIndexId;
+ readLock();
+ try {
+ return baseIndexId;
+ } finally {
+ readUnlock();
+ }
}
public void setState(OlapTableState state) {
+ writeLock();
this.state = state;
+ writeUnlock();
}
public OlapTableState getState() {
- return state;
+ readLock();
+ try {
+ return state;
+ } finally {
+ readUnlock();
+ }
}
public List<Index> getIndexes() {
- if (indexes == null) {
- return Lists.newArrayList();
+ readLock();
+ try {
+ if (indexes == null) {
+ return Lists.newArrayList();
+ }
+ return indexes.getIndexes();
+ } finally {
+ readUnlock();
}
- return indexes.getIndexes();
}
public List<Long> getIndexIds() {
- if (indexes == null) {
- return Lists.newArrayList();
- }
- return indexes.getIndexIds();
- }
-
- /**
- * Checks if the table contains at least one index of the specified type.
- * @param indexType The index type to check for
- * @return true if the table has at least one index of the specified type,
false otherwise
- */
- public boolean hasIndexOfType(IndexDef.IndexType indexType) {
- if (indexes == null) {
- return false;
+ readLock();
+ try {
+ if (indexes == null) {
+ return Lists.newArrayList();
+ }
+ return indexes.getIndexIds();
+ } finally {
+ readUnlock();
}
- return indexes.getIndexes().stream()
- .anyMatch(index -> index.getIndexType() == indexType);
}
@Override
public TableIndexes getTableIndexes() {
- return indexes;
- }
-
- public Map<String, Index> getIndexesMap() {
- Map<String, Index> indexMap = new HashMap<>();
- if (indexes != null) {
-
Optional.ofNullable(indexes.getIndexes()).orElse(Collections.emptyList()).forEach(
- i -> indexMap.put(i.getIndexName(), i));
+ readLock();
+ try {
+ return indexes;
+ } finally {
+ readUnlock();
}
- return indexMap;
}
+ // outer locked
public void checkAndSetName(String newName, boolean onlyCheck) throws
DdlException {
// check if rollup has same name
for (String idxName : getIndexNameToId().keySet()) {
@@ -406,6 +472,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
}
+ // outer locked
public void setName(String newName) {
// change name in indexNameToId
long baseIndexId = indexNameToId.remove(this.name);
@@ -428,9 +495,15 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public boolean hasMaterializedIndex(String indexName) {
- return indexNameToId.containsKey(indexName);
+ readLock();
+ try {
+ return indexNameToId.containsKey(indexName);
+ } finally {
+ readUnlock();
+ }
}
+ // outer locked
public void setIndexMeta(long indexId, String indexName, List<Column>
schema, int schemaVersion, int schemaHash,
short shortKeyColumnCount, TStorageType storageType, KeysType
keysType) {
setIndexMeta(indexId, indexName, schema, schemaVersion, schemaHash,
shortKeyColumnCount, storageType,
@@ -438,6 +511,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
null, null); // indexes is null by default
}
+ // outer locked
public void setIndexMeta(long indexId, String indexName, List<Column>
schema, int schemaVersion, int schemaHash,
short shortKeyColumnCount, TStorageType storageType, KeysType
keysType, List<Index> indexes) {
setIndexMeta(indexId, indexName, schema, schemaVersion, schemaHash,
shortKeyColumnCount, storageType,
@@ -445,13 +519,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
null, indexes);
}
- public void setIndexMeta(long indexId, String indexName, List<Column>
schema, int schemaVersion,
- int schemaHash,
- short shortKeyColumnCount, TStorageType storageType, KeysType
keysType, OriginStatement origStmt) {
- setIndexMeta(indexId, indexName, schema, schemaVersion, schemaHash,
shortKeyColumnCount, storageType,
- keysType, origStmt, null); // indexes is null by default
- }
-
+ // outer locked
public void setIndexMeta(long indexId, String indexName, List<Column>
schema, int schemaVersion,
int schemaHash,
short shortKeyColumnCount, TStorageType storageType, KeysType
keysType, OriginStatement origStmt,
@@ -492,6 +560,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// rebuild the full schema of table
// the order of columns in fullSchema is meaningless
public void rebuildFullSchema() {
+ writeLock();
fullSchema.clear();
nameToColumn.clear();
for (Column baseColumn : indexIdToMeta.get(baseIndexId).getSchema()) {
@@ -508,11 +577,13 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// Column maybe renamed, rebuild the column name map
indexMeta.initColumnNameMap();
}
+ writeUnlock();
if (LOG.isDebugEnabled()) {
LOG.debug("after rebuild full schema. table {}, schema size: {}",
id, fullSchema.size());
}
}
+ // outer locked
public void rebuildDistributionInfo() {
if (!Objects.equals(defaultDistributionInfo.getType(),
DistributionInfoType.HASH)) {
return;
@@ -531,6 +602,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
.forEach(info -> ((HashDistributionInfo)
info).setDistributionColumns(newDistributionColumns));
}
+ // outer locked
public boolean deleteIndexInfo(String indexName) {
if (!indexNameToId.containsKey(indexName)) {
return false;
@@ -550,25 +622,35 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public Map<String, Long> getIndexNameToId() {
- return indexNameToId;
+ readLock();
+ try {
+ return indexNameToId;
+ } finally {
+ readUnlock();
+ }
}
public Long getIndexIdByName(String indexName) {
- return indexNameToId.get(indexName);
- }
-
- public Long getSegmentV2FormatIndexId() {
- String v2RollupIndexName =
MaterializedViewHandler.NEW_STORAGE_FORMAT_INDEX_NAME_PREFIX + getName();
- return indexNameToId.get(v2RollupIndexName);
+ readLock();
+ try {
+ return indexNameToId.get(indexName);
+ } finally {
+ readUnlock();
+ }
}
public String getIndexNameById(long indexId) {
- for (Map.Entry<String, Long> entry : indexNameToId.entrySet()) {
- if (entry.getValue() == indexId) {
- return entry.getKey();
+ readLock();
+ try {
+ for (Map.Entry<String, Long> entry : indexNameToId.entrySet()) {
+ if (entry.getValue() == indexId) {
+ return entry.getKey();
+ }
}
+ return null;
+ } finally {
+ readUnlock();
}
- return null;
}
public List<Long> getAllTabletIds() {
@@ -591,107 +673,59 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public Map<Long, MaterializedIndexMeta> getVisibleIndexIdToMeta() {
- Map<Long, MaterializedIndexMeta> visibleMVs = Maps.newHashMap();
- List<MaterializedIndex> mvs = getVisibleIndex();
- for (MaterializedIndex mv : mvs) {
- visibleMVs.put(mv.getId(), indexIdToMeta.get(mv.getId()));
- }
- return visibleMVs;
- }
-
- public Long getBestMvIdWithHint(List<Long> orderedMvs) {
- Optional<UseMvHint> useMvHint =
ConnectContext.get().getStatementContext().getUseMvHint("USE_MV");
- Optional<UseMvHint> noUseMvHint =
ConnectContext.get().getStatementContext().getUseMvHint("NO_USE_MV");
- List<String> names = new ArrayList<>();
- InternalCatalog catalog = Env.getCurrentEnv().getInternalCatalog();
- names.add(catalog.getName());
- names.add(getDBName());
- names.add(this.name);
- if (useMvHint.isPresent() && noUseMvHint.isPresent()) {
- return getMvIdWithUseMvHint(useMvHint.get(), names, orderedMvs);
- } else if (useMvHint.isPresent()) {
- return getMvIdWithUseMvHint(useMvHint.get(), names, orderedMvs);
- } else if (noUseMvHint.isPresent()) {
- return getMvIdWithNoUseMvHint(noUseMvHint.get(), names,
orderedMvs);
- }
- return orderedMvs.get(0);
- }
-
- private Long getMvIdWithUseMvHint(UseMvHint useMvHint, List<String> names,
List<Long> orderedMvs) {
- if (useMvHint.isAllMv()) {
- useMvHint.setStatus(Hint.HintStatus.SYNTAX_ERROR);
- useMvHint.setErrorMessage("use_mv hint should only have one mv in
one table: "
- + this.name);
- return orderedMvs.get(0);
- } else {
- for (Map.Entry<String, Long> entry : indexNameToId.entrySet()) {
- String mvName = entry.getKey();
- names.add(mvName);
- if (useMvHint.getUseMvTableColumnMap().containsKey(names)) {
- useMvHint.getUseMvTableColumnMap().put(names, true);
- Long choosedIndexId = indexNameToId.get(mvName);
- if (orderedMvs.contains(choosedIndexId)) {
- useMvHint.setStatus(Hint.HintStatus.SUCCESS);
- return choosedIndexId;
- } else {
- useMvHint.setStatus(Hint.HintStatus.SYNTAX_ERROR);
- useMvHint.setErrorMessage("do not have mv: " + mvName
+ " in table: " + this.name);
- }
- }
- }
- }
- return orderedMvs.get(0);
- }
-
- private Long getMvIdWithNoUseMvHint(UseMvHint noUseMvHint, List<String>
names, List<Long> orderedMvs) {
- if (noUseMvHint.isAllMv()) {
- noUseMvHint.setStatus(Hint.HintStatus.SUCCESS);
- return getBaseIndex().getId();
- } else {
- Set<Long> forbiddenIndexIds = Sets.newHashSet();
- for (Map.Entry<String, Long> entry : indexNameToId.entrySet()) {
- String mvName = entry.getKey();
- names.add(mvName);
- if (noUseMvHint.getNoUseMvTableColumnMap().containsKey(names))
{
- noUseMvHint.getNoUseMvTableColumnMap().put(names, true);
- Long forbiddenIndexId = indexNameToId.get(mvName);
- forbiddenIndexIds.add(forbiddenIndexId);
- }
- }
- for (int i = 0; i < orderedMvs.size(); i++) {
- if (!forbiddenIndexIds.contains(orderedMvs.get(i))) {
- return orderedMvs.get(i);
- }
+ readLock();
+ try {
+ Map<Long, MaterializedIndexMeta> visibleMVs = Maps.newHashMap();
+ List<MaterializedIndex> mvs = getVisibleIndex();
+ for (MaterializedIndex mv : mvs) {
+ visibleMVs.put(mv.getId(), indexIdToMeta.get(mv.getId()));
}
+ return visibleMVs;
+ } finally {
+ readUnlock();
}
- return orderedMvs.get(0);
}
public List<MaterializedIndex> getVisibleIndex() {
- Optional<Partition> partition =
idToPartition.values().stream().findFirst();
- if (!partition.isPresent()) {
- partition = tempPartitions.getAllPartitions().stream().findFirst();
- }
- return partition.isPresent() ?
partition.get().getMaterializedIndices(IndexExtState.VISIBLE)
+ readLock();
+ try {
+ Optional<Partition> partition =
idToPartition.values().stream().findFirst();
+ if (!partition.isPresent()) {
+ partition =
tempPartitions.getAllPartitions().stream().findFirst();
+ }
+ return partition.isPresent() ?
partition.get().getMaterializedIndices(IndexExtState.VISIBLE)
: Collections.emptyList();
+ } finally {
+ readUnlock();
+ }
}
public MaterializedIndex getBaseIndex() {
- Optional<Partition> partition =
idToPartition.values().stream().findFirst();
- if (!partition.isPresent()) {
- partition = tempPartitions.getAllPartitions().stream().findFirst();
+ readLock();
+ try {
+ Optional<Partition> partition =
idToPartition.values().stream().findFirst();
+ if (!partition.isPresent()) {
+ partition =
tempPartitions.getAllPartitions().stream().findFirst();
+ }
+ return partition.isPresent() ? partition.get().getBaseIndex() :
null;
+ } finally {
+ readUnlock();
}
- return partition.isPresent() ? partition.get().getBaseIndex() : null;
}
public Column getVisibleColumn(String columnName) {
- for (MaterializedIndexMeta meta : getVisibleIndexIdToMeta().values()) {
- Column target = meta.getColumnByDefineName(columnName);
- if (target != null) {
- return target;
+ readLock();
+ try {
+ for (MaterializedIndexMeta meta :
getVisibleIndexIdToMeta().values()) {
+ Column target = meta.getColumnByDefineName(columnName);
+ if (target != null) {
+ return target;
+ }
}
+ return null;
+ } finally {
+ readUnlock();
}
- return null;
}
/**
@@ -713,21 +747,28 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
@Override
public long getUpdateTime() {
- long updateTime = tempPartitions.getUpdateTime();
- for (Partition p : idToPartition.values()) {
- if (p.getVisibleVersionTime() > updateTime) {
- updateTime = p.getVisibleVersionTime();
+ readLock();
+ try {
+ long updateTime = tempPartitions.getUpdateTime();
+ for (Partition p : idToPartition.values()) {
+ if (p.getVisibleVersionTime() > updateTime) {
+ updateTime = p.getVisibleVersionTime();
+ }
}
+ return updateTime;
+ } finally {
+ readUnlock();
}
- return updateTime;
}
// this is only for schema change.
+ // outer locked
public void renameIndexForSchemaChange(String name, String newName) {
long idxId = indexNameToId.remove(name);
indexNameToId.put(newName, idxId);
}
+ // outer locked
public void renameColumnNamePrefix(long idxId) {
List<Column> columns = indexIdToMeta.get(idxId).getSchema();
for (Column column : columns) {
@@ -769,6 +810,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
}
+ // outer locked
public Status resetIdsForRestore(Env env, Database db, ReplicaAllocation
restoreReplicaAlloc,
boolean reserveReplica, boolean reserveColocate,
List<ColocatePersistInfo> colocatePersistInfos,
String srcDbName) {
@@ -995,41 +1037,76 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public int getIndexNumber() {
- return indexIdToMeta.size();
+ readLock();
+ try {
+ return indexIdToMeta.size();
+ } finally {
+ readUnlock();
+ }
}
public Map<Long, MaterializedIndexMeta> getIndexIdToMeta() {
- return indexIdToMeta;
+ readLock();
+ try {
+ return new HashMap<>(indexIdToMeta);
+ } finally {
+ readUnlock();
+ }
}
public Map<Long, MaterializedIndexMeta> getCopyOfIndexIdToMeta() {
- return new HashMap<>(indexIdToMeta);
+ readLock();
+ try {
+ return new HashMap<>(indexIdToMeta);
+ } finally {
+ readUnlock();
+ }
}
public Map<Long, MaterializedIndexMeta> getCopiedIndexIdToMeta() {
- return new HashMap<>(indexIdToMeta);
+ readLock();
+ try {
+ return new HashMap<>(indexIdToMeta);
+ } finally {
+ readUnlock();
+ }
}
public MaterializedIndexMeta getIndexMetaByIndexId(long indexId) {
- return indexIdToMeta.get(indexId);
+ readLock();
+ try {
+ return indexIdToMeta.get(indexId);
+ } finally {
+ readUnlock();
+ }
}
public List<Long> getIndexIdListExceptBaseIndex() {
- List<Long> result = Lists.newArrayList();
- for (Long indexId : indexIdToMeta.keySet()) {
- if (indexId != baseIndexId) {
- result.add(indexId);
+ readLock();
+ try {
+ List<Long> result = Lists.newArrayList();
+ for (Long indexId : indexIdToMeta.keySet()) {
+ if (indexId != baseIndexId) {
+ result.add(indexId);
+ }
}
+ return result;
+ } finally {
+ readUnlock();
}
- return result;
}
public List<Long> getIndexIdList() {
- List<Long> result = Lists.newArrayList();
- for (Long indexId : indexIdToMeta.keySet()) {
- result.add(indexId);
+ readLock();
+ try {
+ List<Long> result = Lists.newArrayList();
+ for (Long indexId : indexIdToMeta.keySet()) {
+ result.add(indexId);
+ }
+ return result;
+ } finally {
+ readUnlock();
}
- return result;
}
// schema
@@ -1039,20 +1116,30 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// schema
public Map<Long, List<Column>> getIndexIdToSchema(boolean full) {
- Map<Long, List<Column>> result = Maps.newHashMap();
- for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
- result.put(entry.getKey(), entry.getValue().getSchema(full));
+ readLock();
+ try {
+ Map<Long, List<Column>> result = Maps.newHashMap();
+ for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
+ result.put(entry.getKey(), entry.getValue().getSchema(full));
+ }
+ return result;
+ } finally {
+ readUnlock();
}
- return result;
}
// get schemas with a copied column list
public Map<Long, List<Column>> getCopiedIndexIdToSchema(boolean full) {
- Map<Long, List<Column>> result = Maps.newHashMap();
- for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
- result.put(entry.getKey(), new
ArrayList<>(entry.getValue().getSchema(full)));
+ readLock();
+ try {
+ Map<Long, List<Column>> result = Maps.newHashMap();
+ for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
+ result.put(entry.getKey(), new
ArrayList<>(entry.getValue().getSchema(full)));
+ }
+ return result;
+ } finally {
+ readUnlock();
}
- return result;
}
public List<Column> getSchemaByIndexId(Long indexId) {
@@ -1060,11 +1147,16 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public List<Column> getSchemaByIndexId(Long indexId, boolean full) {
- if (full) {
- return indexIdToMeta.get(indexId).getSchema();
- } else {
- return
indexIdToMeta.get(indexId).getSchema().stream().filter(Column::isVisible)
+ readLock();
+ try {
+ if (full) {
+ return indexIdToMeta.get(indexId).getSchema();
+ } else {
+ return
indexIdToMeta.get(indexId).getSchema().stream().filter(Column::isVisible)
.collect(Collectors.toList());
+ }
+ } finally {
+ readUnlock();
}
}
@@ -1108,27 +1200,42 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// schemaHash
public Map<Long, Integer> getIndexIdToSchemaHash() {
- Map<Long, Integer> result = Maps.newHashMap();
- for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
- result.put(entry.getKey(), entry.getValue().getSchemaHash());
+ readLock();
+ try {
+ Map<Long, Integer> result = Maps.newHashMap();
+ for (Map.Entry<Long, MaterializedIndexMeta> entry :
indexIdToMeta.entrySet()) {
+ result.put(entry.getKey(), entry.getValue().getSchemaHash());
+ }
+ return result;
+ } finally {
+ readUnlock();
}
- return result;
}
public int getSchemaHashByIndexId(Long indexId) {
- MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
- if (indexMeta == null) {
- return -1;
+ readLock();
+ try {
+ MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
+ if (indexMeta == null) {
+ return -1;
+ }
+ return indexMeta.getSchemaHash();
+ } finally {
+ readUnlock();
}
- return indexMeta.getSchemaHash();
}
public TStorageType getStorageTypeByIndexId(Long indexId) {
- MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
- if (indexMeta == null) {
- return TStorageType.COLUMN;
+ readLock();
+ try {
+ MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
+ if (indexMeta == null) {
+ return TStorageType.COLUMN;
+ }
+ return indexMeta.getStorageType();
+ } finally {
+ readUnlock();
}
- return indexMeta.getStorageType();
}
public KeysType getKeysType() {
@@ -1136,9 +1243,14 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public KeysType getKeysTypeByIndexId(long indexId) {
- MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
- Preconditions.checkNotNull(indexMeta, "index id:" + indexId + " meta
is null");
- return indexMeta.getKeysType();
+ readLock();
+ try {
+ MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
+ Preconditions.checkNotNull(indexMeta, "index id:" + indexId + "
meta is null");
+ return indexMeta.getKeysType();
+ } finally {
+ readUnlock();
+ }
}
public PartitionInfo getPartitionInfo() {
@@ -1193,6 +1305,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return defaultDistributionInfo instanceof RandomDistributionInfo;
}
+ // outer locked
public void renamePartition(String partitionName, String newPartitionName)
{
if (partitionInfo.getType() == PartitionType.UNPARTITIONED) {
// bug fix
@@ -1211,12 +1324,15 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public void addPartition(Partition partition) {
+ writeLock();
idToPartition.put(partition.getId(), partition);
nameToPartition.put(partition.getName(), partition);
+ writeUnlock();
}
// This is a private method.
// Call public "dropPartitionAndReserveTablet" and "dropPartition"
+ // outer locked
private Partition dropPartition(long dbId, String partitionName, boolean
isForceDrop, boolean reserveTablets) {
// 1. If "isForceDrop" is false, the partition will be added to the
Catalog Recyle bin, and all tablets of this
// partition will not be deleted.
@@ -1235,14 +1351,17 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return partition;
}
+ // outer locked
public Partition dropPartitionAndReserveTablet(String partitionName) {
return dropPartition(-1, partitionName, true, true);
}
+ // outer locked
public Partition dropPartition(long dbId, String partitionName, boolean
isForceDrop) {
return dropPartition(dbId, partitionName, isForceDrop, !isForceDrop);
}
+ // outer locked
private void dropPartitionCommon(long dbId, boolean isForceDrop,
RecyclePartitionParam
recyclePartitionParam,
Partition partition,
@@ -1305,6 +1424,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
partitionInfo.dropPartition(partition.getId());
}
+ // outer locked
public Partition dropPartitionForTruncate(long dbId, boolean isForceDrop,
RecyclePartitionParam
recyclePartitionParam) {
// 1. If "isForceDrop" is false, the partition will be added to the
Catalog Recyle bin, and all tablets of this
@@ -1391,42 +1511,62 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// get partition by name
public Partition getPartition(String partitionName, boolean
isTempPartition) {
- if (isTempPartition) {
- return tempPartitions.getPartition(partitionName);
- } else {
- return nameToPartition.get(partitionName);
+ readLock();
+ try {
+ if (isTempPartition) {
+ return tempPartitions.getPartition(partitionName);
+ } else {
+ return nameToPartition.get(partitionName);
+ }
+ } finally {
+ readUnlock();
}
}
// Priority is given to querying from the partition. If not found, query
from the tempPartition
public Partition getPartition(long partitionId) {
- Partition partition = idToPartition.get(partitionId);
- if (partition == null) {
- partition = tempPartitions.getPartition(partitionId);
+ readLock();
+ try {
+ Partition partition = idToPartition.get(partitionId);
+ if (partition == null) {
+ partition = tempPartitions.getPartition(partitionId);
+ }
+ return partition;
+ } finally {
+ readUnlock();
}
- return partition;
}
public PartitionItem getPartitionItemOrAnalysisException(String
partitionName) throws AnalysisException {
- Partition partition = nameToPartition.get(partitionName);
- if (partition == null) {
- partition = tempPartitions.getPartition(partitionName);
- }
- if (partition == null) {
- throw new AnalysisException("partition not found: " +
partitionName);
+ readLock();
+ try {
+ Partition partition = nameToPartition.get(partitionName);
+ if (partition == null) {
+ partition = tempPartitions.getPartition(partitionName);
+ }
+ if (partition == null) {
+ throw new AnalysisException("partition not found: " +
partitionName);
+ }
+ return partitionInfo.getItem(partition.getId());
+ } finally {
+ readUnlock();
}
- return partitionInfo.getItem(partition.getId());
}
public Partition getPartitionOrAnalysisException(long partitionId) throws
AnalysisException {
- Partition partition = idToPartition.get(partitionId);
- if (partition == null) {
- partition = tempPartitions.getPartition(partitionId);
- }
- if (partition == null) {
- throw new AnalysisException("partition not found: " + partitionId);
+ readLock();
+ try {
+ Partition partition = idToPartition.get(partitionId);
+ if (partition == null) {
+ partition = tempPartitions.getPartition(partitionId);
+ }
+ if (partition == null) {
+ throw new AnalysisException("partition not found: " +
partitionId);
+ }
+ return partition;
+ } finally {
+ readUnlock();
}
- return partition;
}
public void getVersionInBatchForCloudMode(Collection<Long> partitionIds)
throws RpcException {
@@ -1467,29 +1607,51 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public int getPartitionNum() {
- return idToPartition.size();
+ readLock();
+ try {
+ return idToPartition.size();
+ } finally {
+ readUnlock();
+ }
}
// get all partitions except temp partitions
public Collection<Partition> getPartitions() {
- return idToPartition.values();
+ readLock();
+ try {
+ return idToPartition.values();
+ } finally {
+ readUnlock();
+ }
}
// get only temp partitions
public List<Partition> getAllTempPartitions() {
- return tempPartitions.getAllPartitions();
+ readLock();
+ try {
+ return tempPartitions.getAllPartitions();
+ } finally {
+ readUnlock();
+ }
}
// get all partitions including temp partitions
public List<Partition> getAllPartitions() {
+ readLock();
List<Partition> partitions =
Lists.newArrayList(idToPartition.values());
partitions.addAll(tempPartitions.getAllPartitions());
+ readUnlock();
return partitions;
}
// get all partitions' name except the temp partitions
public Set<String> getPartitionNames() {
- return Sets.newHashSet(nameToPartition.keySet());
+ readLock();
+ try {
+ return Sets.newHashSet(nameToPartition.keySet());
+ } finally {
+ readUnlock();
+ }
}
// for those elements equal in partiton ids, get their names. if tables
partition changed(drop or something) make
@@ -1636,10 +1798,6 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return getSequenceCol() != null;
}
- public boolean hasHiddenColumn() {
- return getBaseSchema().stream().anyMatch(column ->
!column.isVisible());
- }
-
public Type getSequenceType() {
if (getSequenceCol() == null) {
return null;
@@ -1710,6 +1868,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
Set<Pair<String, String>> ret = Sets.newHashSet();
// Check the schema of all indexes for each given column name,
// If the column name exists in the index, add the <IndexName,
ColumnName> pair to return list.
+ readLock();
for (String column : columns) {
for (MaterializedIndexMeta meta : indexIdToMeta.values()) {
Column col = meta.getColumnByName(column);
@@ -1719,6 +1878,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
ret.add(Pair.of(getIndexNameById(meta.getIndexId()), column));
}
}
+ readUnlock();
return ret;
}
@@ -1811,69 +1971,74 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// bloom filter, partition type and columns, distribution type and
columns, buckets number,
// indexes and columns.
public String getSignature(int signatureVersion, List<String> partNames) {
- StringBuilder sb = new StringBuilder(signatureVersion);
- sb.append(name);
- sb.append(type);
- Set<String> indexNames = Sets.newTreeSet(indexNameToId.keySet());
- for (String indexName : indexNames) {
- long indexId = indexNameToId.get(indexName);
- MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
- sb.append(indexName);
- sb.append(Util.getSchemaSignatureString(indexMeta.getSchema()));
- sb.append(indexMeta.getShortKeyColumnCount());
- sb.append(indexMeta.getStorageType());
- }
-
- // bloom filter
- if (bfColumns != null && !bfColumns.isEmpty()) {
- for (String bfCol : bfColumns) {
- sb.append(bfCol);
+ readLock();
+ try {
+ StringBuilder sb = new StringBuilder(signatureVersion);
+ sb.append(name);
+ sb.append(type);
+ Set<String> indexNames = Sets.newTreeSet(indexNameToId.keySet());
+ for (String indexName : indexNames) {
+ long indexId = indexNameToId.get(indexName);
+ MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
+ sb.append(indexName);
+
sb.append(Util.getSchemaSignatureString(indexMeta.getSchema()));
+ sb.append(indexMeta.getShortKeyColumnCount());
+ sb.append(indexMeta.getStorageType());
+ }
+
+ // bloom filter
+ if (bfColumns != null && !bfColumns.isEmpty()) {
+ for (String bfCol : bfColumns) {
+ sb.append(bfCol);
+ }
+ sb.append(bfFpp);
}
- sb.append(bfFpp);
- }
-
- // partition type
- sb.append(partitionInfo.getType());
- if (partitionInfo.getType() == PartitionType.RANGE) {
- RangePartitionInfo rangePartitionInfo = (RangePartitionInfo)
partitionInfo;
- List<Column> partitionColumns =
rangePartitionInfo.getPartitionColumns();
- sb.append(Util.getSchemaSignatureString(partitionColumns));
- }
- // partition and distribution
- Collections.sort(partNames, String.CASE_INSENSITIVE_ORDER);
- for (String partName : partNames) {
- Partition partition = getPartition(partName);
- Preconditions.checkNotNull(partition, partName);
- DistributionInfo distributionInfo =
partition.getDistributionInfo();
- sb.append(partName);
- sb.append(distributionInfo.getType());
- if (distributionInfo.getType() == DistributionInfoType.HASH) {
- HashDistributionInfo hashDistributionInfo =
(HashDistributionInfo) distributionInfo;
-
sb.append(Util.getSchemaSignatureString(hashDistributionInfo.getDistributionColumns()));
- sb.append(hashDistributionInfo.getBucketNum());
+ // partition type
+ sb.append(partitionInfo.getType());
+ if (partitionInfo.getType() == PartitionType.RANGE) {
+ RangePartitionInfo rangePartitionInfo = (RangePartitionInfo)
partitionInfo;
+ List<Column> partitionColumns =
rangePartitionInfo.getPartitionColumns();
+ sb.append(Util.getSchemaSignatureString(partitionColumns));
+ }
+
+ // partition and distribution
+ Collections.sort(partNames, String.CASE_INSENSITIVE_ORDER);
+ for (String partName : partNames) {
+ Partition partition = getPartition(partName);
+ Preconditions.checkNotNull(partition, partName);
+ DistributionInfo distributionInfo =
partition.getDistributionInfo();
+ sb.append(partName);
+ sb.append(distributionInfo.getType());
+ if (distributionInfo.getType() == DistributionInfoType.HASH) {
+ HashDistributionInfo hashDistributionInfo =
(HashDistributionInfo) distributionInfo;
+
sb.append(Util.getSchemaSignatureString(hashDistributionInfo.getDistributionColumns()));
+ sb.append(hashDistributionInfo.getBucketNum());
+ }
}
- }
- // indexes
- if (this.indexes != null) {
- Map<String, Index> indexes = Maps.newTreeMap();
- for (Index idx : this.indexes.getIndexes()) {
- indexes.put(idx.getIndexName(), idx);
- }
- for (Map.Entry<String, Index> entry : indexes.entrySet()) {
- Index idx = entry.getValue();
- sb.append(entry.getKey());
- sb.append(idx.getIndexType());
- sb.append(Joiner.on(",").join(idx.getColumns()));
+ // indexes
+ if (this.indexes != null) {
+ Map<String, Index> indexes = Maps.newTreeMap();
+ for (Index idx : this.indexes.getIndexes()) {
+ indexes.put(idx.getIndexName(), idx);
+ }
+ for (Map.Entry<String, Index> entry : indexes.entrySet()) {
+ Index idx = entry.getValue();
+ sb.append(entry.getKey());
+ sb.append(idx.getIndexType());
+ sb.append(Joiner.on(",").join(idx.getColumns()));
+ }
}
- }
- String signature = sb.toString();
- if (LOG.isDebugEnabled()) {
- LOG.debug("get signature of table {}. signature string: {}", name,
sb.toString());
+ String signature = sb.toString();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("get signature of table {}. signature string: {}",
name, sb.toString());
+ }
+ return signature;
+ } finally {
+ readUnlock();
}
- return signature;
}
// get intersect partition names with the given table "anotherTbl". not
including temp partitions
@@ -1972,6 +2137,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
rebuildFullSchema();
}
+ // outer locked
public OlapTable selectiveCopy(Collection<String> reservedPartitions,
IndexExtState extState, boolean isForBackup) {
OlapTable copied = DeepCopy.copy(this, OlapTable.class,
FeConstants.meta_version);
if (copied == null) {
@@ -2064,6 +2230,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
*
* return the old partition.
*/
+ // outer locked
public Partition replacePartition(Partition newPartition,
RecyclePartitionParam
recyclePartitionParam) {
Partition oldPartition =
nameToPartition.remove(newPartition.getName());
@@ -2097,6 +2264,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return oldPartition;
}
+ // outer locked
public void checkNormalStateForAlter() throws DdlException {
if (state != OlapTableState.NORMAL) {
throw new DdlException("Table[" + name + "]'s state(" +
state.toString()
@@ -2108,6 +2276,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
}
+ // outer lock
public boolean isStable(SystemInfoService infoService, TabletScheduler
tabletScheduler) {
List<Long> aliveBeIds = infoService.getAllBackendIds(true);
for (Partition partition : idToPartition.values()) {
@@ -2136,48 +2305,53 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// arbitrarily choose a partition, and get the buckets backends sequence
from base index.
public Map<Tag, List<List<Long>>> getArbitraryTabletBucketsSeq() throws
DdlException {
- SystemInfoService infoService = Env.getCurrentSystemInfo();
- Map<Tag, List<List<Long>>> backendsPerBucketSeq = Maps.newHashMap();
- for (Partition partition : idToPartition.values()) {
- ReplicaAllocation replicaAlloc =
partitionInfo.getReplicaAllocation(partition.getId());
- short totalReplicaNum = replicaAlloc.getTotalReplicaNum();
- MaterializedIndex baseIdx = partition.getBaseIndex();
- for (Long tabletId : baseIdx.getTabletIdsInOrder()) {
- Tablet tablet = baseIdx.getTablet(tabletId);
- List<Long> replicaBackendIds =
tablet.getNormalReplicaBackendIds();
- if (replicaBackendIds.size() != totalReplicaNum) {
- // this should not happen, but in case, throw an exception
to terminate this process
- throw new DdlException("Normal replica number of tablet "
+ tabletId + " is: "
+ readLock();
+ try {
+ SystemInfoService infoService = Env.getCurrentSystemInfo();
+ Map<Tag, List<List<Long>>> backendsPerBucketSeq =
Maps.newHashMap();
+ for (Partition partition : idToPartition.values()) {
+ ReplicaAllocation replicaAlloc =
partitionInfo.getReplicaAllocation(partition.getId());
+ short totalReplicaNum = replicaAlloc.getTotalReplicaNum();
+ MaterializedIndex baseIdx = partition.getBaseIndex();
+ for (Long tabletId : baseIdx.getTabletIdsInOrder()) {
+ Tablet tablet = baseIdx.getTablet(tabletId);
+ List<Long> replicaBackendIds =
tablet.getNormalReplicaBackendIds();
+ if (replicaBackendIds.size() != totalReplicaNum) {
+ // this should not happen, but in case, throw an
exception to terminate this process
+ throw new DdlException("Normal replica number of
tablet " + tabletId + " is: "
+ replicaBackendIds.size() + ", but expected: " +
totalReplicaNum);
- }
+ }
- // check tag
- Map<Tag, Short> currentReplicaAlloc = Maps.newHashMap();
- Map<Tag, List<Long>> tag2beIds = Maps.newHashMap();
- for (long beId : replicaBackendIds) {
- Backend be = infoService.getBackend(beId);
- if (be == null || !be.isMixNode()) {
- continue;
+ // check tag
+ Map<Tag, Short> currentReplicaAlloc = Maps.newHashMap();
+ Map<Tag, List<Long>> tag2beIds = Maps.newHashMap();
+ for (long beId : replicaBackendIds) {
+ Backend be = infoService.getBackend(beId);
+ if (be == null || !be.isMixNode()) {
+ continue;
+ }
+ short num =
currentReplicaAlloc.getOrDefault(be.getLocationTag(), (short) 0);
+ currentReplicaAlloc.put(be.getLocationTag(), (short)
(num + 1));
+ List<Long> beIds =
tag2beIds.getOrDefault(be.getLocationTag(), Lists.newArrayList());
+ beIds.add(beId);
+ tag2beIds.put(be.getLocationTag(), beIds);
}
- short num =
currentReplicaAlloc.getOrDefault(be.getLocationTag(), (short) 0);
- currentReplicaAlloc.put(be.getLocationTag(), (short) (num
+ 1));
- List<Long> beIds =
tag2beIds.getOrDefault(be.getLocationTag(), Lists.newArrayList());
- beIds.add(beId);
- tag2beIds.put(be.getLocationTag(), beIds);
- }
- if (!currentReplicaAlloc.equals(replicaAlloc.getAllocMap())) {
- throw new DdlException("The relica allocation is " +
currentReplicaAlloc.toString()
+ if
(!currentReplicaAlloc.equals(replicaAlloc.getAllocMap())) {
+ throw new DdlException("The relica allocation is " +
currentReplicaAlloc.toString()
+ ", but expected: " +
replicaAlloc.toCreateStmt());
- }
+ }
- for (Map.Entry<Tag, List<Long>> entry : tag2beIds.entrySet()) {
- backendsPerBucketSeq.putIfAbsent(entry.getKey(),
Lists.newArrayList());
-
backendsPerBucketSeq.get(entry.getKey()).add(entry.getValue());
+ for (Map.Entry<Tag, List<Long>> entry :
tag2beIds.entrySet()) {
+ backendsPerBucketSeq.putIfAbsent(entry.getKey(),
Lists.newArrayList());
+
backendsPerBucketSeq.get(entry.getKey()).add(entry.getValue());
+ }
}
+ break;
}
- break;
+ return backendsPerBucketSeq;
+ } finally {
+ readUnlock();
}
- return backendsPerBucketSeq;
}
/**
@@ -2186,50 +2360,68 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
* @return proximate row count
*/
public long proximateRowCount() {
- long totalCount = 0;
- for (Partition partition : getPartitions()) {
- long version = partition.getVisibleVersion();
- for (MaterializedIndex index :
partition.getMaterializedIndices(IndexExtState.VISIBLE)) {
- for (Tablet tablet : index.getTablets()) {
- long tabletRowCount = 0L;
- for (Replica replica : tablet.getReplicas()) {
- if (replica.checkVersionCatchUp(version, false)
- && replica.getRowCount() > tabletRowCount) {
- tabletRowCount = replica.getRowCount();
+ readLock();
+ try {
+ long totalCount = 0;
+ for (Partition partition : getPartitions()) {
+ long version = partition.getVisibleVersion();
+ for (MaterializedIndex index :
partition.getMaterializedIndices(IndexExtState.VISIBLE)) {
+ for (Tablet tablet : index.getTablets()) {
+ long tabletRowCount = 0L;
+ for (Replica replica : tablet.getReplicas()) {
+ if (replica.checkVersionCatchUp(version, false)
+ && replica.getRowCount() > tabletRowCount)
{
+ tabletRowCount = replica.getRowCount();
+ }
}
+ totalCount += tabletRowCount;
}
- totalCount += tabletRowCount;
}
}
+ return totalCount;
+ } finally {
+ readUnlock();
}
- return totalCount;
}
@Override
public List<Column> getBaseSchema() {
- return getSchemaByIndexId(baseIndexId);
+ readLock();
+ try {
+ return getSchemaByIndexId(baseIndexId);
+ } finally {
+ readUnlock();
+ }
}
@Override
public List<Column> getBaseSchema(boolean full) {
- return getSchemaByIndexId(baseIndexId, full);
+ readLock();
+ try {
+ return getSchemaByIndexId(baseIndexId, full);
+ } finally {
+ readUnlock();
+ }
}
@Override
public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- OlapTable other = (OlapTable) o;
+ readLock();
+ try {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OlapTable other = (OlapTable) o;
+
+ if (!Objects.equals(defaultDistributionInfo,
other.defaultDistributionInfo)) {
+ return false;
+ }
- if (!Objects.equals(defaultDistributionInfo,
other.defaultDistributionInfo)) {
- return false;
- }
- return Double.compare(other.bfFpp, bfFpp) == 0 && hasSequenceCol ==
other.hasSequenceCol
+ return Double.compare(other.bfFpp, bfFpp) == 0 && hasSequenceCol
== other.hasSequenceCol
&& baseIndexId == other.baseIndexId && state == other.state &&
Objects.equals(indexIdToMeta,
other.indexIdToMeta) && Objects.equals(indexNameToId,
other.indexNameToId) && keysType == other.keysType
&& Objects.equals(partitionInfo, other.partitionInfo) &&
Objects.equals(
@@ -2239,6 +2431,9 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
other.colocateGroup) && Objects.equals(sequenceType,
other.sequenceType)
&& Objects.equals(indexes, other.indexes) &&
Objects.equals(tableProperty,
other.tableProperty);
+ } finally {
+ readUnlock();
+ }
}
@Override
@@ -2255,15 +2450,6 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return null;
}
- public Column getBaseColumn(int colUniqueId) {
- for (Column column : getBaseSchema()) {
- if (column.getUniqueId() == colUniqueId) {
- return column;
- }
- }
- return null;
- }
-
public int getKeysNum() {
int keysNum = 0;
for (Column column : getBaseSchema()) {
@@ -2371,7 +2557,12 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public boolean containsPartition(String partitionName) {
- return nameToPartition.containsKey(partitionName);
+ readLock();
+ try {
+ return nameToPartition.containsKey(partitionName);
+ } finally {
+ readUnlock();
+ }
}
public void setInAtomicRestore() {
@@ -2515,8 +2706,13 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public int getBaseSchemaVersion() {
- MaterializedIndexMeta baseIndexMeta = indexIdToMeta.get(baseIndexId);
- return baseIndexMeta.getSchemaVersion();
+ readLock();
+ try {
+ MaterializedIndexMeta baseIndexMeta =
indexIdToMeta.get(baseIndexId);
+ return baseIndexMeta.getSchemaVersion();
+ } finally {
+ readUnlock();
+ }
}
public void setEnableSingleReplicaCompaction(boolean
enableSingleReplicaCompaction) {
@@ -2648,8 +2844,13 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public int getIndexSchemaVersion(long indexId) {
- MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
- return indexMeta.getSchemaVersion();
+ readLock();
+ try {
+ MaterializedIndexMeta indexMeta = indexIdToMeta.get(indexId);
+ return indexMeta.getSchemaVersion();
+ } finally {
+ readUnlock();
+ }
}
public void setDataSortInfo(DataSortInfo dataSortInfo) {
@@ -2661,25 +2862,36 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// return true if partition with given name already exist, both in
partitions and temp partitions.
// return false otherwise
public boolean checkPartitionNameExist(String partitionName) {
- if (nameToPartition.containsKey(partitionName)) {
- return true;
+ readLock();
+ try {
+ if (nameToPartition.containsKey(partitionName)) {
+ return true;
+ }
+ return tempPartitions.hasPartition(partitionName);
+ } finally {
+ readUnlock();
}
- return tempPartitions.hasPartition(partitionName);
}
// if includeTempPartition is true, check if temp partition with given
name exist,
// if includeTempPartition is false, check if normal partition with given
name exist.
// return true if exist, otherwise, return false;
public boolean checkPartitionNameExist(String partitionName, boolean
isTempPartition) {
- if (isTempPartition) {
- return tempPartitions.hasPartition(partitionName);
- } else {
- return nameToPartition.containsKey(partitionName);
+ readLock();
+ try {
+ if (isTempPartition) {
+ return tempPartitions.hasPartition(partitionName);
+ } else {
+ return nameToPartition.containsKey(partitionName);
+ }
+ } finally {
+ readUnlock();
}
}
// drop temp partition. if needDropTablet is true, tablets of this temp
partition
// will be dropped from tablet inverted index.
+ // outer locked
public Partition dropTempPartition(String partitionName, boolean
needDropTablet) {
Partition partition = getPartition(partitionName, true);
if (partition != null) {
@@ -2705,6 +2917,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
* names are still p1 and p2.
*
*/
+ // outer locked
public List<Long> replaceTempPartitions(long dbId, List<String>
partitionNames, List<String> tempPartitionNames,
boolean strictRange, boolean useTempPartitionName, boolean
isForceDropOld) throws DdlException {
List<Long> replacedPartitionIds = Lists.newArrayList();
@@ -2738,6 +2951,7 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
return replacedPartitionIds;
}
+ // outer locked
private void checkPartition(List<String> partitionNames, List<String>
tempPartitionNames,
boolean strictRange) throws DdlException {
if (strictRange) {
@@ -2777,18 +2991,18 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
}
public void addTempPartition(Partition partition) {
+ writeLock();
tempPartitions.addPartition(partition);
- }
-
- public void dropAllTempPartitions() {
- for (Partition partition : tempPartitions.getAllPartitions()) {
- partitionInfo.dropPartition(partition.getId());
- }
- tempPartitions.dropAll();
+ writeUnlock();
}
public boolean existTempPartitions() {
- return !tempPartitions.isEmpty();
+ readLock();
+ try {
+ return !tempPartitions.isEmpty();
+ } finally {
+ readUnlock();
+ }
}
public void setCompressionType(TCompressionType compressionType) {
@@ -2980,12 +3194,17 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
// for light schema change
public void initSchemaColumnUniqueId() {
- if (!getEnableLightSchemaChange()) {
- return;
- }
+ writeLock();
+ try {
+ if (!getEnableLightSchemaChange()) {
+ return;
+ }
- for (MaterializedIndexMeta indexMeta : indexIdToMeta.values()) {
- indexMeta.initSchemaColumnUniqueId();
+ for (MaterializedIndexMeta indexMeta : indexIdToMeta.values()) {
+ indexMeta.initSchemaColumnUniqueId();
+ }
+ } finally {
+ writeUnlock();
}
}
@@ -3101,14 +3320,19 @@ public class OlapTable extends Table implements
MTMVRelatedTableIf, GsonPostProc
@Override
public void analyze(String dbName) {
- for (MaterializedIndexMeta meta : indexIdToMeta.values()) {
- try {
- ConnectContext connectContext = new ConnectContext();
- connectContext.setDatabase(dbName);
- meta.parseStmt();
- } catch (IOException e) {
- LOG.info(e);
+ readLock();
+ try {
+ for (MaterializedIndexMeta meta : indexIdToMeta.values()) {
+ try {
+ ConnectContext connectContext = new ConnectContext();
+ connectContext.setDatabase(dbName);
+ meta.parseStmt();
+ } catch (IOException e) {
+ LOG.info(e);
+ }
}
+ } finally {
+ readUnlock();
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
index 6b00bd39fca..55c4848524f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
@@ -17,15 +17,12 @@
package org.apache.doris.catalog;
-import org.apache.doris.analysis.DateLiteral;
import org.apache.doris.analysis.Expr;
-import org.apache.doris.analysis.MaxLiteral;
-import org.apache.doris.analysis.NullLiteral;
import org.apache.doris.analysis.PartitionDesc;
-import org.apache.doris.analysis.PartitionValue;
import org.apache.doris.analysis.SinglePartitionDesc;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.common.DdlException;
+import org.apache.doris.resource.Tag;
import org.apache.doris.thrift.TStorageMedium;
import org.apache.doris.thrift.TTabletType;
@@ -43,14 +40,14 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
/*
* Repository of a partition's related infos
*/
public class PartitionInfo {
private static final Logger LOG =
LogManager.getLogger(PartitionInfo.class);
-
+ protected ReentrantReadWriteLock rwLock;
@SerializedName("Type")
protected PartitionType type;
// partition columns for list and range partitions
@@ -98,6 +95,7 @@ public class PartitionInfo {
this.idToTabletType = new HashMap<>();
this.idToStoragePolicy = new HashMap<>();
this.partitionExprs = new ArrayList<>();
+ this.rwLock = new ReentrantReadWriteLock();
}
public PartitionInfo(PartitionType type) {
@@ -108,14 +106,34 @@ public class PartitionInfo {
this.idToTabletType = new HashMap<>();
this.idToStoragePolicy = new HashMap<>();
this.partitionExprs = new ArrayList<>();
+ this.rwLock = new ReentrantReadWriteLock();
}
public PartitionInfo(PartitionType type, List<Column> partitionColumns) {
this(type);
this.partitionColumns = partitionColumns;
this.isMultiColumnPartition = partitionColumns.size() > 1;
+ this.rwLock = new ReentrantReadWriteLock();
+ }
+
+
+ private void readLock() {
+ rwLock.readLock().lock();
+ }
+
+ private void readUnlock() {
+ rwLock.readLock().unlock();
+ }
+
+ private void writeLock() {
+ rwLock.writeLock().lock();
}
+ private void writeUnlock() {
+ rwLock.writeLock().unlock();
+ }
+
+
public PartitionType getType() {
return type;
}
@@ -127,6 +145,7 @@ public class PartitionInfo {
public String getDisplayPartitionColumns() {
StringBuilder sb = new StringBuilder();
int index = 0;
+ readLock();
for (Column c : partitionColumns) {
if (index != 0) {
sb.append(", ");
@@ -134,15 +153,23 @@ public class PartitionInfo {
sb.append(c.getDisplayName());
index++;
}
+ readUnlock();
return sb.toString();
}
public Map<Long, PartitionItem> getIdToItem(boolean isTemp) {
- if (isTemp) {
- return idToTempItem;
- } else {
- return idToItem;
+ HashMap all = new HashMap<>();
+ readLock();
+ try {
+ if (isTemp) {
+ all.putAll(idToTempItem);
+ } else {
+ all.putAll(idToItem);
+ }
+ } finally {
+ readUnlock();
}
+ return all;
}
/**
@@ -150,15 +177,26 @@ public class PartitionInfo {
*/
public Map<Long, PartitionItem> getAllPartitions() {
HashMap all = new HashMap<>();
- all.putAll(idToTempItem);
- all.putAll(idToItem);
+ readLock();
+ try {
+ all.putAll(idToTempItem);
+ all.putAll(idToItem);
+ } finally {
+ readUnlock();
+ }
return all;
}
public PartitionItem getItem(long partitionId) {
- PartitionItem item = idToItem.get(partitionId);
- if (item == null) {
- item = idToTempItem.get(partitionId);
+ PartitionItem item = null;
+ readLock();
+ try {
+ item = idToItem.get(partitionId);
+ if (item == null) {
+ item = idToTempItem.get(partitionId);
+ }
+ } finally {
+ readUnlock();
}
return item;
}
@@ -173,22 +211,20 @@ public class PartitionInfo {
return partitionRange;
}
- public PartitionItem getItemOrAnalysisException(long partitionId) throws
AnalysisException {
- PartitionItem item = idToItem.get(partitionId);
- if (item == null) {
- item = idToTempItem.get(partitionId);
- }
- if (item == null) {
- throw new AnalysisException("PartitionItem not found: " +
partitionId);
- }
- return item;
- }
-
public void setItem(long partitionId, boolean isTemp, PartitionItem item) {
- setItemInternal(partitionId, isTemp, item);
+ writeLock();
+ try {
+ if (isTemp) {
+ idToTempItem.put(partitionId, item);
+ } else {
+ idToItem.put(partitionId, item);
+ }
+ } finally {
+ writeUnlock();
+ }
}
- private void setItemInternal(long partitionId, boolean isTemp,
PartitionItem item) {
+ private void setItemInternalWithOutLock(long partitionId, boolean isTemp,
PartitionItem item) {
if (isTemp) {
idToTempItem.put(partitionId, item);
} else {
@@ -200,12 +236,16 @@ public class PartitionInfo {
long partitionId,
boolean isTemp) throws DdlException {
Preconditions.checkArgument(desc.isAnalyzed());
PartitionItem partitionItem = createAndCheckPartitionItem(desc,
isTemp);
- setItemInternal(partitionId, isTemp, partitionItem);
-
- idToDataProperty.put(partitionId, desc.getPartitionDataProperty());
- idToReplicaAllocation.put(partitionId, desc.getReplicaAlloc());
- idToInMemory.put(partitionId, desc.isInMemory());
- idToStoragePolicy.put(partitionId, desc.getStoragePolicy());
+ writeLock();
+ try {
+ setItemInternalWithOutLock(partitionId, isTemp, partitionItem);
+ idToDataProperty.put(partitionId, desc.getPartitionDataProperty());
+ idToReplicaAllocation.put(partitionId, desc.getReplicaAlloc());
+ idToInMemory.put(partitionId, desc.isInMemory());
+ idToStoragePolicy.put(partitionId, desc.getStoragePolicy());
+ } finally {
+ writeUnlock();
+ }
return partitionItem;
}
@@ -217,57 +257,75 @@ public class PartitionInfo {
public void unprotectHandleNewSinglePartitionDesc(long partitionId,
boolean isTemp, PartitionItem partitionItem,
DataProperty
dataProperty, ReplicaAllocation replicaAlloc,
boolean isInMemory,
boolean isMutable) {
- setItemInternal(partitionId, isTemp, partitionItem);
- idToDataProperty.put(partitionId, dataProperty);
- idToReplicaAllocation.put(partitionId, replicaAlloc);
- idToInMemory.put(partitionId, isInMemory);
- idToStoragePolicy.put(partitionId, "");
- //TODO
- //idToMutable.put(partitionId, isMutable);
+ writeLock();
+ try {
+ setItemInternalWithOutLock(partitionId, isTemp, partitionItem);
+ idToDataProperty.put(partitionId, dataProperty);
+ idToReplicaAllocation.put(partitionId, replicaAlloc);
+ idToInMemory.put(partitionId, isInMemory);
+ idToStoragePolicy.put(partitionId, "");
+ } finally {
+ writeUnlock();
+ }
}
public List<Map.Entry<Long, PartitionItem>>
getPartitionItemEntryList(boolean isTemp, boolean isSorted) {
- Map<Long, PartitionItem> tmpMap = idToItem;
- if (isTemp) {
- tmpMap = idToTempItem;
- }
- List<Map.Entry<Long, PartitionItem>> itemEntryList =
Lists.newArrayList(tmpMap.entrySet());
- if (isSorted) {
- Collections.sort(itemEntryList,
PartitionItem.ITEM_MAP_ENTRY_COMPARATOR);
+ readLock();
+ try {
+ Map<Long, PartitionItem> tmpMap = idToItem;
+ if (isTemp) {
+ tmpMap = idToTempItem;
+ }
+ List<Map.Entry<Long, PartitionItem>> itemEntryList =
Lists.newArrayList(tmpMap.entrySet());
+ if (isSorted) {
+ Collections.sort(itemEntryList,
PartitionItem.ITEM_MAP_ENTRY_COMPARATOR);
+ }
+ return itemEntryList;
+ } finally {
+ readUnlock();
}
- return itemEntryList;
}
// get sorted item list, exclude partitions which ids are in
'excludePartitionIds'
public List<PartitionItem> getItemList(Set<Long> excludePartitionIds,
boolean isTemp) {
- Map<Long, PartitionItem> tempMap = idToItem;
- if (isTemp) {
- tempMap = idToTempItem;
- }
- List<PartitionItem> resultList = Lists.newArrayList();
- for (Map.Entry<Long, PartitionItem> entry : tempMap.entrySet()) {
- if (!excludePartitionIds.contains(entry.getKey())) {
- resultList.add(entry.getValue());
+ readLock();
+ try {
+ Map<Long, PartitionItem> tempMap = idToItem;
+ if (isTemp) {
+ tempMap = idToTempItem;
}
+ List<PartitionItem> resultList = Lists.newArrayList();
+ for (Map.Entry<Long, PartitionItem> entry : tempMap.entrySet()) {
+ if (!excludePartitionIds.contains(entry.getKey())) {
+ resultList.add(entry.getValue());
+ }
+ }
+ return resultList;
+ } finally {
+ readUnlock();
}
- return resultList;
}
// return any item intersect with the newItem.
// return null if no item intersect.
public PartitionItem getAnyIntersectItem(PartitionItem newItem, boolean
isTemp) {
- Map<Long, PartitionItem> tmpMap = idToItem;
- if (isTemp) {
- tmpMap = idToTempItem;
- }
- PartitionItem retItem;
- for (PartitionItem item : tmpMap.values()) {
- retItem = item.getIntersect(newItem);
- if (null != retItem) {
- return retItem;
+ readLock();
+ try {
+ Map<Long, PartitionItem> tmpMap = idToItem;
+ if (isTemp) {
+ tmpMap = idToTempItem;
+ }
+ PartitionItem retItem;
+ for (PartitionItem item : tmpMap.values()) {
+ retItem = item.getIntersect(newItem);
+ if (null != retItem) {
+ return retItem;
+ }
}
+ return null;
+ } finally {
+ readUnlock();
}
- return null;
}
public boolean enableAutomaticPartition() {
@@ -287,94 +345,162 @@ public class PartitionInfo {
}
public DataProperty getDataProperty(long partitionId) {
- return idToDataProperty.get(partitionId);
+ readLock();
+ try {
+ return idToDataProperty.get(partitionId);
+ } finally {
+ readUnlock();
+ }
}
public void setDataProperty(long partitionId, DataProperty
newDataProperty) {
- idToDataProperty.put(partitionId, newDataProperty);
+ writeLock();
+ try {
+ idToDataProperty.put(partitionId, newDataProperty);
+ } finally {
+ writeUnlock();
+ }
}
public void refreshTableStoragePolicy(String storagePolicy) {
- idToStoragePolicy.replaceAll((k, v) -> storagePolicy);
- idToDataProperty.entrySet().forEach(entry -> {
- entry.getValue().setStoragePolicy(storagePolicy);
- });
+ writeLock();
+ try {
+ idToStoragePolicy.replaceAll((k, v) -> storagePolicy);
+ idToDataProperty.entrySet().forEach(entry -> {
+ entry.getValue().setStoragePolicy(storagePolicy);
+ });
+ } finally {
+ writeUnlock();
+ }
}
public String getStoragePolicy(long partitionId) {
- return idToStoragePolicy.getOrDefault(partitionId, "");
+ readLock();
+ try {
+ return idToStoragePolicy.getOrDefault(partitionId, "");
+ } finally {
+ readUnlock();
+ }
}
public void setStoragePolicy(long partitionId, String storagePolicy) {
- idToStoragePolicy.put(partitionId, storagePolicy);
+ writeLock();
+ try {
+ idToStoragePolicy.put(partitionId, storagePolicy);
+ } finally {
+ writeUnlock();
+ }
}
- public Map<Long, ReplicaAllocation> getPartitionReplicaAllocations() {
- return idToReplicaAllocation;
+ public void modifyReplicaAlloc(ReplicaAllocation replicaAlloc) {
+ writeLock();
+ for (ReplicaAllocation alloc : idToReplicaAllocation.values()) {
+ Map<Tag, Short> allocMap = alloc.getAllocMap();
+ allocMap.clear();
+ allocMap.putAll(replicaAlloc.getAllocMap());
+ }
+ writeUnlock();
}
public ReplicaAllocation getReplicaAllocation(long partitionId) {
- if (!idToReplicaAllocation.containsKey(partitionId)) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("failed to get replica allocation for partition:
{}", partitionId);
+ readLock();
+ try {
+ if (!idToReplicaAllocation.containsKey(partitionId)) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("failed to get replica allocation for partition:
{}", partitionId);
+ }
+ return ReplicaAllocation.DEFAULT_ALLOCATION;
}
- return ReplicaAllocation.DEFAULT_ALLOCATION;
+ return idToReplicaAllocation.get(partitionId);
+ } finally {
+ readUnlock();
}
- return idToReplicaAllocation.get(partitionId);
}
public void setReplicaAllocation(long partitionId, ReplicaAllocation
replicaAlloc) {
+ writeLock();
this.idToReplicaAllocation.put(partitionId, replicaAlloc);
+ writeUnlock();
}
public boolean getIsInMemory(long partitionId) {
- return idToInMemory.get(partitionId);
+ readLock();
+ try {
+ return idToInMemory.get(partitionId);
+ } finally {
+ readUnlock();
+ }
}
public boolean getIsMutable(long partitionId) {
- return idToDataProperty.get(partitionId).isMutable();
+ readLock();
+ try {
+ return idToDataProperty.get(partitionId).isMutable();
+ } finally {
+ readUnlock();
+ }
}
public void setIsMutable(long partitionId, boolean isMutable) {
+ writeLock();
idToDataProperty.get(partitionId).setMutable(isMutable);
+ writeUnlock();
}
public void setIsInMemory(long partitionId, boolean isInMemory) {
+ writeLock();
idToInMemory.put(partitionId, isInMemory);
+ writeUnlock();
}
public TTabletType getTabletType(long partitionId) {
- if (!idToTabletType.containsKey(partitionId)) {
- return TTabletType.TABLET_TYPE_DISK;
+ readLock();
+ try {
+ if (!idToTabletType.containsKey(partitionId)) {
+ return TTabletType.TABLET_TYPE_DISK;
+ }
+ return idToTabletType.get(partitionId);
+ } finally {
+ readUnlock();
}
- return idToTabletType.get(partitionId);
}
public void setTabletType(long partitionId, TTabletType tabletType) {
+ writeLock();
idToTabletType.put(partitionId, tabletType);
+ writeUnlock();
}
public void dropPartition(long partitionId) {
+ writeLock();
idToDataProperty.remove(partitionId);
idToReplicaAllocation.remove(partitionId);
idToInMemory.remove(partitionId);
idToItem.remove(partitionId);
idToTempItem.remove(partitionId);
+ writeUnlock();
}
public void addPartition(long partitionId, boolean isTemp, PartitionItem
item, DataProperty dataProperty,
ReplicaAllocation replicaAlloc, boolean
isInMemory, boolean isMutable) {
- addPartition(partitionId, dataProperty, replicaAlloc, isInMemory,
isMutable);
- setItemInternal(partitionId, isTemp, item);
+ writeLock();
+ dataProperty.setMutable(isMutable);
+ idToDataProperty.put(partitionId, dataProperty);
+ idToReplicaAllocation.put(partitionId, replicaAlloc);
+ idToInMemory.put(partitionId, isInMemory);
+ setItemInternalWithOutLock(partitionId, isTemp, item);
+ writeUnlock();
}
public void addPartition(long partitionId, DataProperty dataProperty,
ReplicaAllocation replicaAlloc,
boolean isInMemory, boolean isMutable) {
+ writeLock();
dataProperty.setMutable(isMutable);
idToDataProperty.put(partitionId, dataProperty);
idToReplicaAllocation.put(partitionId, replicaAlloc);
idToInMemory.put(partitionId, isInMemory);
+ writeUnlock();
}
public boolean isMultiColumnPartition() {
@@ -389,30 +515,19 @@ public class PartitionInfo {
throw new RuntimeException("Should implement it in derived classes.");
}
- public static List<PartitionValue> toPartitionValue(PartitionKey
partitionKey) {
- return partitionKey.getKeys().stream().map(expr -> {
- if (expr == MaxLiteral.MAX_VALUE) {
- return PartitionValue.MAX_VALUE;
- } else if (expr instanceof DateLiteral) {
- return new PartitionValue(expr.getStringValue());
- } else if (expr instanceof NullLiteral) {
- return new PartitionValue("NULL", true);
- } else {
- return new PartitionValue(expr.getRealValue().toString());
- }
- }).collect(Collectors.toList());
- }
-
public void moveFromTempToFormal(long tempPartitionId) {
+ writeLock();
PartitionItem item = idToTempItem.remove(tempPartitionId);
if (item != null) {
idToItem.put(tempPartitionId, item);
}
+ writeUnlock();
}
public void resetPartitionIdForRestore(
Map<Long, Long> partitionIdMap,
ReplicaAllocation restoreReplicaAlloc, boolean
isSinglePartitioned) {
+ writeLock();
Map<Long, DataProperty> origIdToDataProperty = idToDataProperty;
Map<Long, ReplicaAllocation> origIdToReplicaAllocation =
idToReplicaAllocation;
Map<Long, PartitionItem> origIdToItem = idToItem;
@@ -435,6 +550,7 @@ public class PartitionInfo {
idToInMemory.put(entry.getKey(),
origIdToInMemory.get(entry.getValue()));
idToStoragePolicy.put(entry.getKey(),
origIdToStoragePolicy.getOrDefault(entry.getValue(), ""));
}
+ writeUnlock();
}
@Override
@@ -442,6 +558,7 @@ public class PartitionInfo {
StringBuilder buff = new StringBuilder();
buff.append("type: ").append(type.typeString).append("; ");
+ readLock();
for (Map.Entry<Long, DataProperty> entry :
idToDataProperty.entrySet()) {
buff.append(entry.getKey()).append(" is HDD: ");
if (entry.getValue().equals(new DataProperty(TStorageMedium.HDD)))
{
@@ -455,6 +572,7 @@ public class PartitionInfo {
buff.append("in memory:
").append(idToInMemory.get(entry.getKey()));
buff.append("is mutable:
").append(idToDataProperty.get(entry.getKey()).isMutable());
}
+ readUnlock();
return buff.toString();
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
index 091f9ed304f..7e476e73090 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionKey.java
@@ -592,4 +592,19 @@ public class PartitionKey implements
Comparable<PartitionKey>, Writable {
public List<String> getOriginHiveKeys() {
return originHiveKeys;
}
+
+
+ public static List<PartitionValue> toPartitionValue(PartitionKey
partitionKey) {
+ return partitionKey.getKeys().stream().map(expr -> {
+ if (expr == MaxLiteral.MAX_VALUE) {
+ return PartitionValue.MAX_VALUE;
+ } else if (expr instanceof DateLiteral) {
+ return new PartitionValue(expr.getStringValue());
+ } else if (expr instanceof NullLiteral) {
+ return new PartitionValue("NULL", true);
+ } else {
+ return new PartitionValue(expr.getRealValue().toString());
+ }
+ }).collect(Collectors.toList());
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionInfo.java
index a59c3ca4010..7ccc7b62ff3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionInfo.java
@@ -289,8 +289,8 @@ public class RangePartitionInfo extends PartitionInfo {
Range<PartitionKey> range = entry.getValue().getItems();
PartitionKeyDesc partitionKeyDesc = PartitionKeyDesc.createFixed(
- PartitionInfo.toPartitionValue(range.lowerEndpoint()),
- PartitionInfo.toPartitionValue(range.upperEndpoint()));
+ PartitionKey.toPartitionValue(range.lowerEndpoint()),
+ PartitionKey.toPartitionValue(range.upperEndpoint()));
Map<String, String> properties = Maps.newHashMap();
Optional.ofNullable(this.idToStoragePolicy.get(entry.getKey())).ifPresent(p -> {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionItem.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionItem.java
index cad6ca38130..8f29da1fdd7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionItem.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RangePartitionItem.java
@@ -66,8 +66,8 @@ public class RangePartitionItem extends PartitionItem {
@Override
public PartitionKeyDesc toPartitionKeyDesc() {
return PartitionKeyDesc.createFixed(
-
PartitionInfo.toPartitionValue(partitionKeyRange.lowerEndpoint()),
-
PartitionInfo.toPartitionValue(partitionKeyRange.upperEndpoint()));
+ PartitionKey.toPartitionValue(partitionKeyRange.lowerEndpoint()),
+ PartitionKey.toPartitionValue(partitionKeyRange.upperEndpoint()));
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIndexes.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIndexes.java
index 345362e2d53..b47f0b59c49 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIndexes.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIndexes.java
@@ -44,11 +44,6 @@ public class TableIndexes {
this.properties = Maps.newHashMap();
}
- public TableIndexes(List<Index> indexes, Map<String, String> properties) {
- this.indexes = indexes;
- this.properties = properties;
- }
-
public List<Index> getIndexes() {
if (indexes == null) {
indexes = Lists.newArrayList();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
index 575024e39c8..3098347fc77 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java
@@ -3823,8 +3823,10 @@ public class InternalCatalog implements
CatalogIf<Database> {
throw new DdlException(e.getMessage());
}
int schemaHash = Util.generateSchemaHash();
+ olapTable.writeLock();
olapTable.setIndexMeta(baseIndexId, tableName, baseSchema,
schemaVersion, schemaHash, shortKeyColumnCount,
baseIndexStorageType, keysType, olapTable.getIndexes());
+ olapTable.writeUnlock();
for (AlterClause alterClause : stmt.getRollupAlterClauseList()) {
if (olapTable.isDuplicateWithoutKey()) {
@@ -3849,8 +3851,10 @@ public class InternalCatalog implements
CatalogIf<Database> {
true/*isKeysRequired*/);
int rollupSchemaHash = Util.generateSchemaHash();
long rollupIndexId = idGeneratorBuffer.getNextId();
+ olapTable.writeLock();
olapTable.setIndexMeta(rollupIndexId,
addRollupClause.getRollupName(), rollupColumns, schemaVersion,
rollupSchemaHash, rollupShortKeyColumnCount,
rollupIndexStorageType, keysType);
+ olapTable.writeUnlock();
}
// analyse sequence map column
@@ -3902,7 +3906,9 @@ public class InternalCatalog implements
CatalogIf<Database> {
olapTable.initSchemaColumnUniqueId();
olapTable.initAutoIncrementGenerator(db.getId());
+ olapTable.writeLock();
olapTable.rebuildFullSchema();
+ olapTable.writeUnlock();
// analyze version info
Long versionInfo = null;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]