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]

Reply via email to