From d57b144b90785a2451d4e482700f9572a26d526f Mon Sep 17 00:00:00 2001 From: dsplayerX Date: Wed, 11 Oct 2023 10:35:24 +0530 Subject: [PATCH 1/2] Add synchronized access to transactionInfoMap --- .../runtime/transactions/TransactionResourceManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java index 00cde49ef17a..1671326834a2 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java @@ -106,7 +106,7 @@ private TransactionResourceManager() { resourceRegistry = new HashMap<>(); committedFuncRegistry = new HashMap<>(); abortedFuncRegistry = new HashMap<>(); - transactionInfoMap = new HashMap<>(); + transactionInfoMap = new ConcurrentHashMap<>(); transactionManagerEnabled = getTransactionManagerEnabled(); if (transactionManagerEnabled) { trxRegistry = new HashMap<>(); From 20d0438e2fed9797383430882e800d48dd4fbbf0 Mon Sep 17 00:00:00 2001 From: dsplayerX Date: Tue, 24 Oct 2023 15:22:59 +0530 Subject: [PATCH 2/2] Fix null pointer exception when 'infoRecord' is null --- .../transactions/TransactionLocalContext.java | 12 +++++++++--- .../transactions/TransactionResourceManager.java | 7 ++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionLocalContext.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionLocalContext.java index 1b1890ecb58c..7f8cdcdea9d9 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionLocalContext.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionLocalContext.java @@ -64,8 +64,14 @@ private TransactionLocalContext(String globalTransactionId, String url, String p this.rollbackOnlyError = null; this.isTransactional = true; this.transactionId = ValueCreator.createArrayValue(globalTransactionId.getBytes()); - transactionResourceManager.transactionInfoMap.put(ByteBuffer.wrap(transactionId.getBytes().clone()), - infoRecord); + validateAndPutTransactionInfo(ByteBuffer.wrap(transactionId.getBytes().clone()), infoRecord); + } + + private void validateAndPutTransactionInfo(ByteBuffer transactionIdBytes, Object infoRecord) { + if (infoRecord == null) { + return; + } + transactionResourceManager.transactionInfoMap.put(transactionIdBytes, infoRecord); } public static TransactionLocalContext createTransactionParticipantLocalCtx(String globalTransactionId, @@ -228,7 +234,7 @@ public void setResourceParticipant(boolean resourceParticipant) { } public Object getInfoRecord() { - return transactionResourceManager.transactionInfoMap.get(ByteBuffer.wrap(transactionId.getBytes())); + return transactionResourceManager.getTransactionRecord(transactionId); } public boolean isTransactional() { diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java index 1671326834a2..c796731d8332 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/transactions/TransactionResourceManager.java @@ -610,6 +610,11 @@ public void notifyLocalParticipantFailure(String gTransactionId, String blockId) } public Object getTransactionRecord(BArray xid) { - return transactionInfoMap.get(ByteBuffer.wrap(xid.getBytes())); + synchronized (transactionInfoMap) { + if (transactionInfoMap.containsKey(ByteBuffer.wrap(xid.getBytes()))) { + return transactionInfoMap.get(ByteBuffer.wrap(xid.getBytes())); + } + return null; + } } }