From 1e08c0330e5f20af7fd3eb91ba8665eda8c81ced Mon Sep 17 00:00:00 2001 From: jimin <slievrly@gmail.com> Date: Wed, 28 Oct 2020 22:31:55 +0800 Subject: [PATCH] bugfix: fix Collections NPE (#3233) --- pom.xml | 3 --- .../rm/datasource/mock/MockResultSet.java | 24 +++++++++++++------ .../seata/server/session/SessionHolder.java | 17 +++++++++---- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 3af334017..31c10a213 100644 --- a/pom.xml +++ b/pom.xml @@ -466,9 +466,6 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> - <configuration> - <skipTests>true</skipTests> - </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> diff --git a/rm-datasource/src/test/java/io/seata/rm/datasource/mock/MockResultSet.java b/rm-datasource/src/test/java/io/seata/rm/datasource/mock/MockResultSet.java index bad35c0db..8f29b2dcf 100644 --- a/rm-datasource/src/test/java/io/seata/rm/datasource/mock/MockResultSet.java +++ b/rm-datasource/src/test/java/io/seata/rm/datasource/mock/MockResultSet.java @@ -15,12 +15,6 @@ */ package io.seata.rm.datasource.mock; -import com.alibaba.druid.util.jdbc.ResultSetBase; - -import com.google.common.collect.Lists; -import io.seata.rm.datasource.sql.struct.ColumnMeta; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.sql.Blob; import java.sql.Clob; import java.sql.ResultSetMetaData; @@ -29,6 +23,13 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.util.jdbc.ResultSetBase; + +import com.google.common.collect.Lists; +import io.seata.rm.datasource.sql.struct.ColumnMeta; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * @author will */ @@ -108,7 +109,16 @@ public class MockResultSet extends ResultSetBase { @Override public int findColumn(String columnLabel) throws SQLException { - return columnLabels.indexOf(columnLabel) + 1; + if (columnLabels.indexOf(columnLabel) != -1) { + return columnLabels.indexOf(columnLabel) + 1; + } + if (columnLabels.indexOf(columnLabel.toLowerCase()) != -1) { + return columnLabels.indexOf(columnLabel.toLowerCase()) + 1; + } + if (columnLabels.indexOf(columnLabel.toUpperCase()) != -1) { + return columnLabels.indexOf(columnLabel.toUpperCase()) + 1; + } + return -1; } @Override diff --git a/server/src/main/java/io/seata/server/session/SessionHolder.java b/server/src/main/java/io/seata/server/session/SessionHolder.java index 18f12bf97..19cd4d9a8 100644 --- a/server/src/main/java/io/seata/server/session/SessionHolder.java +++ b/server/src/main/java/io/seata/server/session/SessionHolder.java @@ -17,6 +17,8 @@ package io.seata.server.session; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; import io.seata.common.exception.ShouldNeverHappenException; @@ -131,10 +133,12 @@ public class SessionHolder { ((Reloadable) ROOT_SESSION_MANAGER).reload(); } - // There is a remove operation in the following code, it will affect the file mode, so new ArrayList - List<GlobalSession> allSessions = new ArrayList<>(ROOT_SESSION_MANAGER.allSessions()); + Collection<GlobalSession> allSessions = ROOT_SESSION_MANAGER.allSessions(); if (CollectionUtils.isNotEmpty(allSessions)) { - allSessions.forEach(globalSession -> { + List<GlobalSession> removeGlobalSessions = new ArrayList<>(); + Iterator<GlobalSession> iterator = allSessions.iterator(); + while (iterator.hasNext()) { + GlobalSession globalSession = iterator.next(); GlobalStatus globalStatus = globalSession.getStatus(); switch (globalStatus) { case UnKnown: @@ -145,7 +149,7 @@ public class SessionHolder { case TimeoutRollbacked: case TimeoutRollbackFailed: case Finished: - removeInErrorState(globalSession); + removeGlobalSessions.add(globalSession); break; case AsyncCommitting: if (storeMode == StoreMode.FILE) { @@ -177,7 +181,10 @@ public class SessionHolder { break; } } - }); + } + for (GlobalSession globalSession : removeGlobalSessions) { + removeInErrorState(globalSession); + } } } -- GitLab