This is an automated email from the ASF dual-hosted git repository.
wangzhen pushed a commit to branch dev-1.1.2
in repository https://gitbox.apache.org/repos/asf/incubator-linkis.git
The following commit(s) were added to refs/heads/dev-1.1.2 by this push:
new f4614b5ad Fix the deadlock issue of Manager db under high concurrency
(#2100)
f4614b5ad is described below
commit f4614b5ad1d8c7b774e8db5c27ca79760ea91e56
Author: peacewong <[email protected]>
AuthorDate: Tue May 10 15:22:27 2022 +0800
Fix the deadlock issue of Manager db under high concurrency (#2100)
* Fix Deadlock issue that update label keyValue, Modify replace into to
insert into on update
---
.../engine/DefaultEngineCreateService.scala | 5 ++++-
.../linkis/manager/dao/LabelManagerMapper.java | 5 +++++
.../linkis/manager/dao/impl/LabelManagerMapper.xml | 5 +++++
.../impl/DefaultLabelManagerPersistence.java | 24 ++++++++++++++++------
4 files changed, 32 insertions(+), 7 deletions(-)
diff --git
a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineCreateService.scala
b/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineCreateService.scala
index dd24367b7..54c2bfc0e 100644
---
a/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineCreateService.scala
+++
b/linkis-computation-governance/linkis-manager/linkis-application-manager/src/main/scala/org/apache/linkis/manager/am/service/engine/DefaultEngineCreateService.scala
@@ -213,7 +213,10 @@ class DefaultEngineCreateService extends
AbstractEngineService with EngineCreate
engineNode.setTicketId(resourceTicketId)
//7. 更新持久化信息:包括插入engine/metrics
- getEngineNodeManager.updateEngineNode(oldServiceInstance, engineNode)
+ Utils.tryCatch(getEngineNodeManager.updateEngineNode(oldServiceInstance,
engineNode)) { t =>
+ warn(s"Failed to update engineNode $engineNode", t)
+ throw new LinkisRetryException(AMConstant.EM_ERROR_CODE, s"Failed to
update engineNode: ${t.getMessage}")
+ }
//8. 新增 EngineConn的Label,添加engineConn的Alias
val engineConnAliasLabel =
labelBuilderFactory.createLabel(classOf[AliasServiceInstanceLabel])
diff --git
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/LabelManagerMapper.java
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/LabelManagerMapper.java
index 5c0e1d426..f7313bddf 100644
---
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/LabelManagerMapper.java
+++
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/LabelManagerMapper.java
@@ -39,6 +39,11 @@ public interface LabelManagerMapper {
@Param("labelValueKeyAndContent") Map<String, String>
labelValueKeyAndContent,
@Param("labelId") int labelId);
+ void replaceIntoLabelKeyValue(
+ @Param("labelKey") String labelKey,
+ @Param("labelStringValue") String labelStringValue,
+ @Param("labelId") int labelId);
+
PersistenceLabel getLabel(@Param("id") int id);
void deleteLabel(@Param("id") int id);
diff --git
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/impl/LabelManagerMapper.xml
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/impl/LabelManagerMapper.xml
index 2514c2a84..cbbd6d462 100644
---
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/impl/LabelManagerMapper.xml
+++
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/dao/impl/LabelManagerMapper.xml
@@ -82,6 +82,11 @@
</foreach>
</insert>
+ <insert id="replaceIntoLabelKeyValue">
+ INSERT INTO linkis_cg_manager_label_value_relation
(label_value_key,label_value_content,label_id,update_time,create_time)
VALUES(#{labelKey}, #{labelStringValue},#{labelId},now(),now())
+ ON DUPLICATE KEY UPDATE
label_value_content=#{labelStringValue},update_time=now()
+ </insert>
+
<select id="getLabel" resultMap="persistenceLabelResultMap">
select * from linkis_cg_manager_label where id=#{id}
</select>
diff --git
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/persistence/impl/DefaultLabelManagerPersistence.java
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/persistence/impl/DefaultLabelManagerPersistence.java
index fc4b9183c..8a51af698 100644
---
a/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/persistence/impl/DefaultLabelManagerPersistence.java
+++
b/linkis-computation-governance/linkis-manager/linkis-manager-persistence/src/main/java/org/apache/linkis/manager/persistence/impl/DefaultLabelManagerPersistence.java
@@ -32,6 +32,7 @@ import org.apache.linkis.manager.util.PersistenceUtils;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +79,7 @@ public class DefaultLabelManagerPersistence implements
LabelManagerPersistence {
// 此处需要修正,要拿到 label_value_key label_value_content labelValue中有多对参数
Map<String, String> labelValueKeyAndContent =
persistenceLabel.getValue();
- labelManagerMapper.registerLabelKeyValues(labelValueKeyAndContent,
labelId);
+ replaceIntoLabelKeyValues(labelValueKeyAndContent, labelId);
}
@Override
@@ -113,15 +114,26 @@ public class DefaultLabelManagerPersistence implements
LabelManagerPersistence {
@Override
public void updateLabel(int id, PersistenceLabel persistenceLabel) {
- // 1.更新label表
- // 2.删掉value
- // 3.更新labelValue
- // TODO: 2020/10/12 updateLabel 要重写判空
persistenceLabel.setUpdateTime(new Date());
labelManagerMapper.updateLabel(id, persistenceLabel);
labelManagerMapper.deleteLabelKeyVaules(id);
if (!persistenceLabel.getValue().isEmpty()) {
-
labelManagerMapper.registerLabelKeyValues(persistenceLabel.getValue(), id);
+ replaceIntoLabelKeyValues(persistenceLabel.getValue(), id);
+ }
+ }
+
+ private void replaceIntoLabelKeyValues(
+ Map<String, String> labelValueKeyAndContent, int labelId) {
+ if (null != labelValueKeyAndContent && labelId > 0) {
+ Iterator<Map.Entry<String, String>> iterator =
+ labelValueKeyAndContent.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<String, String> labelKeyValue = iterator.next();
+ if (StringUtils.isNotBlank(labelKeyValue.getKey())) {
+ labelManagerMapper.replaceIntoLabelKeyValue(
+ labelKeyValue.getKey(), labelKeyValue.getValue(),
labelId);
+ }
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]