diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java index 93a4c1b19e63fc..91273736ebfecc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogMgr.java @@ -93,9 +93,9 @@ public class CatalogMgr implements Writable, GsonPostProcessable { private final MonitoredReentrantReadWriteLock lock = new MonitoredReentrantReadWriteLock(true); @SerializedName(value = "idToCatalog") - private final Map>> idToCatalog = Maps.newConcurrentMap(); + private Map>> idToCatalog = Maps.newConcurrentMap(); // this map will be regenerated from idToCatalog, so not need to persist. - private final Map nameToCatalog = Maps.newConcurrentMap(); + private Map nameToCatalog = Maps.newConcurrentMap(); // Use a separate instance to facilitate access. // internalDataSource still exists in idToCatalog and nameToCatalog @@ -817,10 +817,17 @@ public void write(DataOutput out) throws IOException { @Override public void gsonPostProcess() throws IOException { + // After deserializing from Gson, the concurrent map may become a normal map. + // So here we reconstruct the concurrent map. + Map>> newIdToCatalog = Maps.newConcurrentMap(); + Map newNameToCatalog = Maps.newConcurrentMap(); for (CatalogIf catalog : idToCatalog.values()) { - nameToCatalog.put(catalog.getName(), catalog); + newNameToCatalog.put(catalog.getName(), catalog); + newIdToCatalog.put(catalog.getId(), catalog); // ATTN: can not call catalog.getProperties() here, because ResourceMgr is not replayed yet. } + this.idToCatalog = newIdToCatalog; + this.nameToCatalog = newNameToCatalog; internalCatalog = (InternalCatalog) idToCatalog.get(InternalCatalog.INTERNAL_CATALOG_ID); }