This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/dev/1.3 by this push:
new 6efd4d9e508 [To dev/1.3] Fixed the concurrency bug of create
timeseries / set(unset) template
6efd4d9e508 is described below
commit 6efd4d9e508e53e2feacfc0aaa02d37ab05a9a50
Author: Caideyipi <[email protected]>
AuthorDate: Thu Mar 13 09:09:56 2025 +0800
[To dev/1.3] Fixed the concurrency bug of create timeseries / set(unset)
template
---
.../impl/schema/UnsetTemplateProcedure.java | 146 ++++++++-------------
.../template/NoTemplateOnMNodeException.java | 34 -----
.../impl/DataNodeInternalRPCServiceImpl.java | 19 +--
.../queryengine/plan/analyze/AnalyzeVisitor.java | 42 ++----
.../template/TemplateInternalRPCUpdateType.java | 5 +-
5 files changed, 83 insertions(+), 163 deletions(-)
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
index d85d1bfb301..81405960885 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
@@ -69,12 +69,15 @@ public class UnsetTemplateProcedure
private transient ByteBuffer addTemplateSetInfo;
private transient ByteBuffer invalidateTemplateSetInfo;
- public UnsetTemplateProcedure(boolean isGeneratedByPipe) {
+ public UnsetTemplateProcedure(final boolean isGeneratedByPipe) {
super(isGeneratedByPipe);
}
public UnsetTemplateProcedure(
- String queryId, Template template, PartialPath path, boolean
isGeneratedByPipe) {
+ final String queryId,
+ final Template template,
+ final PartialPath path,
+ final boolean isGeneratedByPipe) {
super(isGeneratedByPipe);
this.queryId = queryId;
this.template = template;
@@ -82,9 +85,9 @@ public class UnsetTemplateProcedure
}
@Override
- protected Flow executeFromState(ConfigNodeProcedureEnv env,
UnsetTemplateState state)
+ protected Flow executeFromState(final ConfigNodeProcedureEnv env, final
UnsetTemplateState state)
throws ProcedureSuspendedException, ProcedureYieldException,
InterruptedException {
- long startTime = System.currentTimeMillis();
+ final long startTime = System.currentTimeMillis();
try {
switch (state) {
case CONSTRUCT_BLACK_LIST:
@@ -127,8 +130,8 @@ public class UnsetTemplateProcedure
}
}
- private void constructBlackList(ConfigNodeProcedureEnv env) {
- TSStatus status =
+ private void constructBlackList(final ConfigNodeProcedureEnv env) {
+ final TSStatus status =
env.getConfigManager()
.getClusterSchemaManager()
.preUnsetSchemaTemplate(template.getId(), path);
@@ -139,30 +142,33 @@ public class UnsetTemplateProcedure
}
}
- private void invalidateCache(ConfigNodeProcedureEnv env) {
+ private void invalidateCache(final ConfigNodeProcedureEnv env) {
try {
+ // Cannot roll back after cache invalidation
+ // Because we do not know whether there are time series successfully
created
+ alreadyRollback = true;
executeInvalidateCache(env);
setNextState(UnsetTemplateState.CHECK_DATANODE_TEMPLATE_ACTIVATION);
- } catch (ProcedureException e) {
+ } catch (final ProcedureException e) {
setFailure(e);
}
}
- private void executeInvalidateCache(ConfigNodeProcedureEnv env) throws
ProcedureException {
- Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+ private void executeInvalidateCache(final ConfigNodeProcedureEnv env) throws
ProcedureException {
+ final Map<Integer, TDataNodeLocation> dataNodeLocationMap =
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
- TUpdateTemplateReq invalidateTemplateSetInfoReq = new TUpdateTemplateReq();
+ final TUpdateTemplateReq invalidateTemplateSetInfoReq = new
TUpdateTemplateReq();
invalidateTemplateSetInfoReq.setType(
TemplateInternalRPCUpdateType.INVALIDATE_TEMPLATE_SET_INFO.toByte());
invalidateTemplateSetInfoReq.setTemplateInfo(getInvalidateTemplateSetInfo());
- DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus> clientHandler =
+ final DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus>
clientHandler =
new DataNodeAsyncRequestContext<>(
CnToDnAsyncRequestType.UPDATE_TEMPLATE,
invalidateTemplateSetInfoReq,
dataNodeLocationMap);
CnToDnInternalServiceAsyncRequestManager.getInstance().sendAsyncRequestWithRetry(clientHandler);
- Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
- for (TSStatus status : statusMap.values()) {
+ final Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
+ for (final TSStatus status : statusMap.values()) {
// all dataNodes must clear the related template cache
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
LOGGER.error(
@@ -174,14 +180,14 @@ public class UnsetTemplateProcedure
}
}
- private boolean checkDataNodeTemplateActivation(ConfigNodeProcedureEnv env) {
- PathPatternTree patternTree = new PathPatternTree();
+ private boolean checkDataNodeTemplateActivation(final ConfigNodeProcedureEnv
env) {
+ final PathPatternTree patternTree = new PathPatternTree();
patternTree.appendPathPattern(path);
patternTree.appendPathPattern(path.concatNode(MULTI_LEVEL_PATH_WILDCARD));
try {
return SchemaUtils.checkDataNodeTemplateActivation(
env.getConfigManager(), patternTree, template);
- } catch (MetadataException e) {
+ } catch (final MetadataException e) {
setFailure(
new ProcedureException(
new MetadataException(
@@ -192,51 +198,45 @@ public class UnsetTemplateProcedure
}
}
- private void unsetTemplate(ConfigNodeProcedureEnv env) {
- TSStatus status =
+ private void unsetTemplate(final ConfigNodeProcedureEnv env) {
+ final TSStatus status =
env.getConfigManager()
.getClusterSchemaManager()
.unsetSchemaTemplateInBlackList(template.getId(), path,
isGeneratedByPipe);
- if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- setNextState(UnsetTemplateState.CLEAN_DATANODE_TEMPLATE_CACHE);
- } else {
+ if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
setFailure(new ProcedureException(new
IoTDBException(status.getMessage(), status.getCode())));
}
}
@Override
- protected void rollbackState(ConfigNodeProcedureEnv env, UnsetTemplateState
unsetTemplateState)
+ protected void rollbackState(
+ final ConfigNodeProcedureEnv env, final UnsetTemplateState
unsetTemplateState)
throws IOException, InterruptedException, ProcedureException {
if (alreadyRollback) {
return;
}
alreadyRollback = true;
ProcedureException rollbackException;
- try {
- executeRollbackInvalidateCache(env);
- TSStatus status =
- env.getConfigManager()
- .getClusterSchemaManager()
- .rollbackPreUnsetSchemaTemplate(template.getId(), path);
- if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- return;
- } else {
- LOGGER.error(
- "Failed to rollback pre unset template operation of template {}
set on {}",
- template.getName(),
- path);
- rollbackException =
- new ProcedureException(
- new MetadataException(
- "Rollback template pre unset failed because of" +
status.getMessage()));
- }
- } catch (ProcedureException e) {
- rollbackException = e;
+ final TSStatus status =
+ env.getConfigManager()
+ .getClusterSchemaManager()
+ .rollbackPreUnsetSchemaTemplate(template.getId(), path);
+ if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ return;
+ } else {
+ LOGGER.error(
+ "Failed to rollback pre unset template operation of template {} set
on {}",
+ template.getName(),
+ path);
+ rollbackException =
+ new ProcedureException(
+ new MetadataException(
+ "Rollback template pre unset failed because of" +
status.getMessage()));
}
try {
executeInvalidateCache(env);
setFailure(rollbackException);
- } catch (ProcedureException exception) {
+ } catch (final ProcedureException exception) {
setFailure(
new ProcedureException(
new MetadataException(
@@ -244,43 +244,18 @@ public class UnsetTemplateProcedure
}
}
- private void executeRollbackInvalidateCache(ConfigNodeProcedureEnv env)
- throws ProcedureException {
- Map<Integer, TDataNodeLocation> dataNodeLocationMap =
-
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
- TUpdateTemplateReq rollbackTemplateSetInfoReq = new TUpdateTemplateReq();
- rollbackTemplateSetInfoReq.setType(
- TemplateInternalRPCUpdateType.ADD_TEMPLATE_SET_INFO.toByte());
- rollbackTemplateSetInfoReq.setTemplateInfo(getAddTemplateSetInfo());
- DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus> clientHandler =
- new DataNodeAsyncRequestContext<>(
- CnToDnAsyncRequestType.UPDATE_TEMPLATE,
- rollbackTemplateSetInfoReq,
- dataNodeLocationMap);
-
CnToDnInternalServiceAsyncRequestManager.getInstance().sendAsyncRequestWithRetry(clientHandler);
- Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
- for (TSStatus status : statusMap.values()) {
- // all dataNodes must clear the related template cache
- if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
- LOGGER.error(
- "Failed to rollback template cache of template {} set on {}",
template.getName(), path);
- throw new ProcedureException(new MetadataException("Rollback template
cache failed"));
- }
- }
- }
-
@Override
- protected boolean isRollbackSupported(UnsetTemplateState unsetTemplateState)
{
+ protected boolean isRollbackSupported(final UnsetTemplateState
unsetTemplateState) {
return true;
}
@Override
- protected UnsetTemplateState getState(int stateId) {
+ protected UnsetTemplateState getState(final int stateId) {
return UnsetTemplateState.values()[stateId];
}
@Override
- protected int getStateId(UnsetTemplateState unsetTemplateState) {
+ protected int getStateId(final UnsetTemplateState unsetTemplateState) {
return unsetTemplateState.ordinal();
}
@@ -309,17 +284,6 @@ public class UnsetTemplateProcedure
return path;
}
- private ByteBuffer getAddTemplateSetInfo() {
- if (this.addTemplateSetInfo == null) {
- this.addTemplateSetInfo =
- ByteBuffer.wrap(
- TemplateInternalRPCUtil.generateAddTemplateSetInfoBytes(
- template, path.getFullPath()));
- }
-
- return addTemplateSetInfo;
- }
-
private ByteBuffer getInvalidateTemplateSetInfo() {
if (this.invalidateTemplateSetInfo == null) {
this.invalidateTemplateSetInfo =
@@ -331,7 +295,7 @@ public class UnsetTemplateProcedure
}
@Override
- public void serialize(DataOutputStream stream) throws IOException {
+ public void serialize(final DataOutputStream stream) throws IOException {
stream.writeShort(
isGeneratedByPipe
?
ProcedureType.PIPE_ENRICHED_UNSET_TEMPLATE_PROCEDURE.getTypeCode()
@@ -344,7 +308,7 @@ public class UnsetTemplateProcedure
}
@Override
- public void deserialize(ByteBuffer byteBuffer) {
+ public void deserialize(final ByteBuffer byteBuffer) {
super.deserialize(byteBuffer);
queryId = ReadWriteIOUtils.readString(byteBuffer);
template = new Template();
@@ -354,10 +318,14 @@ public class UnsetTemplateProcedure
}
@Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- UnsetTemplateProcedure that = (UnsetTemplateProcedure) o;
+ public boolean equals(final Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ final UnsetTemplateProcedure that = (UnsetTemplateProcedure) o;
return Objects.equals(getProcId(), that.getProcId())
&& Objects.equals(getCurrentState(), that.getCurrentState())
&& Objects.equals(getCycles(), that.getCycles())
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
deleted file mode 100644
index 0f2a274235a..00000000000
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.iotdb.db.exception.metadata.template;
-
-import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-public class NoTemplateOnMNodeException extends MetadataException {
-
- public NoTemplateOnMNodeException(String path) {
- super(
- String.format("NO template on %s", path),
- TSStatusCode.TEMPLATE_NOT_SET.getStatusCode(),
- true);
- }
-}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
index 20ef565ca54..5deebe5b3ab 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -1973,24 +1973,25 @@ public class DataNodeInternalRPCServiceImpl implements
IDataNodeRPCService.Iface
}
@Override
- public TSStatus updateTemplate(TUpdateTemplateReq req) {
+ public TSStatus updateTemplate(final TUpdateTemplateReq req) {
switch (TemplateInternalRPCUpdateType.getType(req.type)) {
- case ADD_TEMPLATE_SET_INFO:
+ // Reserved for rolling upgrade
+ case ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO:
+
ClusterTemplateManager.getInstance().addTemplateSetInfo(req.getTemplateInfo());
+ break;
+ case INVALIDATE_TEMPLATE_SET_INFO:
+
ClusterTemplateManager.getInstance().invalidateTemplateSetInfo(req.getTemplateInfo());
+ break;
+ case ADD_TEMPLATE_PRE_SET_INFO:
DataNodeSchemaLockManager.getInstance()
.takeWriteLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
try {
-
ClusterTemplateManager.getInstance().addTemplateSetInfo(req.getTemplateInfo());
+
ClusterTemplateManager.getInstance().addTemplatePreSetInfo(req.getTemplateInfo());
} finally {
DataNodeSchemaLockManager.getInstance()
.releaseWriteLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
}
break;
- case INVALIDATE_TEMPLATE_SET_INFO:
-
ClusterTemplateManager.getInstance().invalidateTemplateSetInfo(req.getTemplateInfo());
- break;
- case ADD_TEMPLATE_PRE_SET_INFO:
-
ClusterTemplateManager.getInstance().addTemplatePreSetInfo(req.getTemplateInfo());
- break;
case COMMIT_TEMPLATE_SET_INFO:
ClusterTemplateManager.getInstance().commitTemplatePreSetInfo(req.getTemplateInfo());
break;
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index fefba280c4c..cd9fd65cfd9 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -2570,7 +2570,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
analysis.setStatement(createTimeSeriesStatement);
checkIsTemplateCompatible(
- createTimeSeriesStatement.getPath(),
createTimeSeriesStatement.getAlias(), context, true);
+ createTimeSeriesStatement.getPath(),
createTimeSeriesStatement.getAlias(), context);
PathPatternTree patternTree = new PathPatternTree();
patternTree.appendFullPath(createTimeSeriesStatement.getPath());
@@ -2582,14 +2582,9 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
}
private void checkIsTemplateCompatible(
- final PartialPath timeSeriesPath,
- final String alias,
- final MPPQueryContext context,
- final boolean takeLock) {
- if (takeLock) {
- DataNodeSchemaLockManager.getInstance()
- .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
- }
+ final PartialPath timeSeriesPath, final String alias, final
MPPQueryContext context) {
+ DataNodeSchemaLockManager.getInstance()
+ .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
final Pair<Template, PartialPath> templateInfo =
schemaFetcher.checkTemplateSetAndPreSetInfo(timeSeriesPath, alias);
if (templateInfo != null) {
@@ -2603,12 +2598,9 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
final PartialPath devicePath,
final List<String> measurements,
final List<String> aliasList,
- final MPPQueryContext context,
- final boolean takeLock) {
- if (takeLock) {
- DataNodeSchemaLockManager.getInstance()
- .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
- }
+ final MPPQueryContext context) {
+ DataNodeSchemaLockManager.getInstance()
+ .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
for (int i = 0; i < measurements.size(); i++) {
final Pair<Template, PartialPath> templateInfo =
schemaFetcher.checkTemplateSetAndPreSetInfo(
@@ -2677,8 +2669,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
createAlignedTimeSeriesStatement.getDevicePath(),
createAlignedTimeSeriesStatement.getMeasurements(),
createAlignedTimeSeriesStatement.getAliasList(),
- context,
- true);
+ context);
PathPatternTree pathPatternTree = new PathPatternTree();
for (String measurement :
createAlignedTimeSeriesStatement.getMeasurements()) {
@@ -2705,8 +2696,7 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
internalCreateTimeSeriesStatement.getDevicePath(),
internalCreateTimeSeriesStatement.getMeasurements(),
null,
- context,
- true);
+ context);
PathPatternTree pathPatternTree = new PathPatternTree();
for (String measurement :
internalCreateTimeSeriesStatement.getMeasurements()) {
@@ -2732,12 +2722,10 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
analysis.setStatement(internalCreateMultiTimeSeriesStatement);
final PathPatternTree pathPatternTree = new PathPatternTree();
- DataNodeSchemaLockManager.getInstance()
- .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
for (final Map.Entry<PartialPath, Pair<Boolean, MeasurementGroup>> entry :
internalCreateMultiTimeSeriesStatement.getDeviceMap().entrySet()) {
checkIsTemplateCompatible(
- entry.getKey(), entry.getValue().right.getMeasurements(), null,
context, false);
+ entry.getKey(), entry.getValue().right.getMeasurements(), null,
context);
pathPatternTree.appendFullPath(entry.getKey().concatNode(ONE_LEVEL_PATH_WILDCARD));
}
@@ -2762,11 +2750,9 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
final List<PartialPath> timeseriesPathList =
createMultiTimeSeriesStatement.getPaths();
final List<String> aliasList =
createMultiTimeSeriesStatement.getAliasList();
- DataNodeSchemaLockManager.getInstance()
- .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
for (int i = 0; i < timeseriesPathList.size(); i++) {
checkIsTemplateCompatible(
- timeseriesPathList.get(i), aliasList == null ? null :
aliasList.get(i), context, false);
+ timeseriesPathList.get(i), aliasList == null ? null :
aliasList.get(i), context);
}
final PathPatternTree patternTree = new PathPatternTree();
@@ -4103,10 +4089,8 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
}
// Make sure all paths are not under any templates
try {
- DataNodeSchemaLockManager.getInstance()
- .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
- for (PartialPath path : createLogicalViewStatement.getTargetPathList()) {
- checkIsTemplateCompatible(path, null, context, false);
+ for (final PartialPath path :
createLogicalViewStatement.getTargetPathList()) {
+ checkIsTemplateCompatible(path, null, context);
}
} catch (final Exception e) {
analysis.setFinishQueryAfterAnalyze(true);
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
index c273849e385..ebe730114e2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
@@ -26,7 +26,8 @@ import java.io.OutputStream;
import java.nio.ByteBuffer;
public enum TemplateInternalRPCUpdateType {
- ADD_TEMPLATE_SET_INFO((byte) 0),
+ // Deprecated
+ ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO((byte) 0),
INVALIDATE_TEMPLATE_SET_INFO((byte) 1),
ADD_TEMPLATE_PRE_SET_INFO((byte) 2),
COMMIT_TEMPLATE_SET_INFO((byte) 3),
@@ -54,7 +55,7 @@ public enum TemplateInternalRPCUpdateType {
public static TemplateInternalRPCUpdateType getType(byte type) {
switch (type) {
case 0:
- return ADD_TEMPLATE_SET_INFO;
+ return ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO;
case 1:
return INVALIDATE_TEMPLATE_SET_INFO;
case 2: