You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2018/10/30 07:42:41 UTC
[kylin] 01/02: KYLIN-3556,
replace String.intern to avoid unexpected locking collisions
This is an automated email from the ASF dual-hosted git repository.
shaofengshi pushed a commit to branch 2.5.x
in repository https://gitbox.apache.org/repos/asf/kylin.git
commit 3a441f2e3d464265b15d6c1bf90e375f156dae7c
Author: etherge <et...@163.com>
AuthorDate: Mon Oct 29 17:39:44 2018 +0800
KYLIN-3556, replace String.intern to avoid unexpected locking collisions
---
.../apache/kylin/common/persistence/JDBCResourceDAO.java | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/JDBCResourceDAO.java b/core-common/src/main/java/org/apache/kylin/common/persistence/JDBCResourceDAO.java
index 5ad484a..9a33716 100644
--- a/core-common/src/main/java/org/apache/kylin/common/persistence/JDBCResourceDAO.java
+++ b/core-common/src/main/java/org/apache/kylin/common/persistence/JDBCResourceDAO.java
@@ -30,6 +30,7 @@ import java.sql.SQLException;
import java.sql.Types;
import java.text.MessageFormat;
import java.util.List;
+import java.util.NavigableSet;
import java.util.TreeSet;
import org.apache.commons.io.IOUtils;
@@ -43,6 +44,8 @@ import org.apache.kylin.common.util.HadoopUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
import com.google.common.collect.Lists;
public class JDBCResourceDAO {
@@ -69,6 +72,7 @@ public class JDBCResourceDAO {
private FileSystem redirectFileSystem;
public static final String LOG_TABLE_SUFFIX = "_log";
+ private Interner<String> interner = Interners.newStrongInterner();
public JDBCResourceDAO(KylinConfig kylinConfig, String metadataIdentifier) throws SQLException {
this.kylinConfig = kylinConfig;
@@ -160,7 +164,8 @@ public class JDBCResourceDAO {
return allResourceName;
}
- private void listResource(final String tableName, final String folderPath, final TreeSet<String> allResourceName, final boolean recursive) throws SQLException {
+ private void listResource(final String tableName, final String folderPath,
+ final NavigableSet<String> allResourceName, final boolean recursive) throws SQLException {
executeSql(new SqlOperation() {
@Override
public void execute(Connection connection) throws SQLException {
@@ -278,7 +283,7 @@ public class JDBCResourceDAO {
@Override
public void execute(Connection connection) throws SQLException {
byte[] content = getResourceDataBytes(resource);
- synchronized (resource.getPath().intern()) {
+ synchronized (interner.intern(resource.getPath())) {
boolean existing = existResource(resource.getPath());
String tableName = getMetaTableName(resource.getPath());
if (existing) {
@@ -329,7 +334,7 @@ public class JDBCResourceDAO {
executeSql(new SqlOperation() {
@Override
public void execute(Connection connection) throws SQLException {
- synchronized (resPath.intern()) {
+ synchronized (interner.intern(resPath)) {
String tableName = getMetaTableName(resPath);
if (!existResource(resPath)) {
if (oldTS != 0) {
@@ -460,8 +465,9 @@ public class JDBCResourceDAO {
private boolean checkTableExists(final String tableName, final Connection connection) throws SQLException {
final PreparedStatement ps = connection.prepareStatement(getCheckTableExistsSql(tableName));
- final ResultSet rs = ps.executeQuery();
+ ResultSet rs = null;
try {
+ rs = ps.executeQuery();
while (rs.next()) {
if (tableName.equals(rs.getString(1))) {
return true;