From 74fddb548ef48c334ce0f167e90221a037c122ff Mon Sep 17 00:00:00 2001 From: PeppaO <2402576196@qq.com> Date: Mon, 30 Oct 2023 18:43:49 +0800 Subject: [PATCH] bugfix --- .../io/seata/server/storage/redis/LuaParser.java | 16 ++++++++++++++++ .../storage/redis/lock/RedisLuaLocker.java | 10 +++++----- .../store/RedisLuaTransactionStoreManager.java | 12 ++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/server/src/main/java/io/seata/server/storage/redis/LuaParser.java b/server/src/main/java/io/seata/server/storage/redis/LuaParser.java index e711d8bcec0..bc5fdac17a8 100644 --- a/server/src/main/java/io/seata/server/storage/redis/LuaParser.java +++ b/server/src/main/java/io/seata/server/storage/redis/LuaParser.java @@ -31,8 +31,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisDataException; +import redis.clients.jedis.exceptions.JedisNoScriptException; /** * lua related utils @@ -40,11 +43,14 @@ * @author conghuhu */ public class LuaParser { + private static final Logger LOGGER = LoggerFactory.getLogger(LuaParser.class); private static final String WHITE_SPACE = " "; private static final String ANNOTATION_LUA = "--"; + private static String ACQUIRE_LUA_FILE; + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public final static class LuaResult implements Serializable { @@ -149,4 +155,14 @@ public static List getListFromJson(String json, Class classz) { throw new StoreException(e.getMessage()); } } + + public static String jedisEvalSha(Jedis jedis, String luaSHA, String luaFileName, List keys, List args){ + try { + return (String)jedis.evalsha(luaSHA, keys, args); + }catch (JedisNoScriptException e) { + LOGGER.warn("jedis ex:" + e.getMessage()); + jedis.scriptLoad(luaFileName); + return (String)jedis.evalsha(luaSHA, keys, args); + } + } } diff --git a/server/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java b/server/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java index 8ad6ea41a0b..62a3cdbd110 100644 --- a/server/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java +++ b/server/src/main/java/io/seata/server/storage/redis/lock/RedisLuaLocker.java @@ -131,7 +131,7 @@ public boolean acquireLock(List rowLocks, boolean autoCommit, boolean s // reset args index 2 args.set(1, String.valueOf(args.size())); - String result = (String) jedis.evalsha(luaSHA, keys, args); + String result = LuaParser.jedisEvalSha(jedis, luaSHA, ACQUIRE_LOCK_LUA_FILE_NAME, keys, args); LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); @@ -162,7 +162,7 @@ public boolean releaseLock(String xid) { List keys = new ArrayList<>(); List args = Collections.emptyList(); keys.add(xidLockKey); - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, RELEASE_LOCK_LUA_FILE_NAME, keys, args); return true; } } @@ -182,7 +182,7 @@ public boolean releaseLock(String xid, Long branchId) { List args = Collections.emptyList(); keys.add(xidLockKey); keys.add(String.valueOf(branchId)); - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, RELEASE_LOCK_LUA_FILE_NAME, keys, args); return true; } } @@ -208,7 +208,7 @@ public boolean isLockable(List rowLocks) { keys.addAll(lockKeys); List args = new ArrayList<>(); args.add(xid); - String res = (String) jedis.evalsha(luaSHA, keys, args); + String res = LuaParser.jedisEvalSha(jedis, luaSHA, LOCKABLE_LUA_FILE_NAME, keys, args); return "true".equals(res); } } @@ -227,7 +227,7 @@ public void updateLockStatus(String xid, LockStatus lockStatus) { keys.add(xidLockKey); keys.add(STATUS); args.add(String.valueOf(lockStatus.getCode())); - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_LOCK_LUA_FILE_NAME, keys, args); } } } diff --git a/server/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java b/server/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java index f42c3134734..d5768ffa7d1 100644 --- a/server/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java +++ b/server/src/main/java/io/seata/server/storage/redis/store/RedisLuaTransactionStoreManager.java @@ -152,7 +152,7 @@ protected boolean insertBranchTransactionDO(BranchTransactionDO branchTransactio keys.add(entry.getKey()); args.add(entry.getValue()); } - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, INSERT_TRANSACTION_DO_LUA_FILE_NAME, keys, args); return true; } catch (Exception ex) { throw new RedisException(ex); @@ -180,7 +180,7 @@ protected boolean deleteBranchTransactionDO(BranchTransactionDO branchTransactio add("branch"); } }; - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, DELETE_TRANSACTION_DO_LUA_FILE_NAME, keys, args); return true; } catch (Exception ex) { throw new RedisException(ex); @@ -212,7 +212,7 @@ protected boolean updateBranchTransactionDO(BranchTransactionDO branchTransactio add(applicationData); } }; - String result = (String) jedis.evalsha(luaSHA, keys, args); + String result = LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_BRANCH_TRANSACTION_DO_LUA_FILE_NAME, keys, args); LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); if (!luaResult.getSuccess()) { throw new StoreException("Branch transaction is not exist, update branch transaction failed."); @@ -258,7 +258,7 @@ protected boolean insertGlobalTransactionDO(GlobalTransactionDO globalTransactio keys.add(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY); args.add(xid); args.add(String.valueOf(globalTransactionDO.getBeginTime() + globalTransactionDO.getTimeout())); - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, INSERT_TRANSACTION_DO_LUA_FILE_NAME, keys, args); return true; } catch (Exception ex) { throw new RedisException(ex); @@ -290,7 +290,7 @@ protected boolean deleteGlobalTransactionDO(GlobalTransactionDO globalTransactio add(String.valueOf(globalTransactionDO.getStatus())); } }; - jedis.evalsha(luaSHA, keys, args); + LuaParser.jedisEvalSha(jedis, luaSHA, DELETE_TRANSACTION_DO_LUA_FILE_NAME, keys, args); return true; } catch (Exception ex) { throw new RedisException(ex); @@ -323,7 +323,7 @@ protected boolean updateGlobalTransactionDO(GlobalTransactionDO globalTransactio add(xid); } }; - String result = (String) jedis.evalsha(luaSHA, keys, args); + String result = LuaParser.jedisEvalSha(jedis, luaSHA, UPDATE_GLOBAL_TRANSACTION_DO_LUA_FILE_NAME, keys, args); LuaParser.LuaResult luaResult = LuaParser.getObjectFromJson(result, LuaParser.LuaResult.class); // fail if (!luaResult.getSuccess()) {