You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2018/04/03 03:15:26 UTC

[kylin] 01/08: KYLIN-3311 refactor Resource.checkAndPutResourceImpl() to throw WriteConflictException

This is an automated email from the ASF dual-hosted git repository.

liyang pushed a commit to branch sync
in repository https://gitbox.apache.org/repos/asf/kylin.git

commit 3222de27c508ed3e7576330dc8c40206fe6cd84d
Author: Li Yang <li...@apache.org>
AuthorDate: Sun Mar 25 18:12:53 2018 +0800

    KYLIN-3311 refactor Resource.checkAndPutResourceImpl() to throw WriteConflictException
---
 .../apache/kylin/common/persistence/FileResourceStore.java   |  6 +++---
 .../apache/kylin/common/persistence/HDFSResourceStore.java   |  4 ++--
 .../org/apache/kylin/common/persistence/ResourceStore.java   | 12 ++++++++----
 .../{StorageException.java => WriteConflictException.java}   |  9 +++------
 .../apache/kylin/common/persistence/ResourceStoreTest.java   |  2 +-
 .../src/main/java/org/apache/kylin/cube/CubeManager.java     |  3 ++-
 .../java/org/apache/kylin/metadata/TempStatementManager.java |  3 ++-
 .../main/java/org/apache/kylin/rest/service/AclService.java  |  3 ++-
 .../java/org/apache/kylin/storage/hbase/HBaseConnection.java |  3 +--
 .../org/apache/kylin/storage/hbase/HBaseResourceStore.java   |  3 ++-
 10 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
index 38ccbdd..7c6c506 100644
--- a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
+++ b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java
@@ -31,13 +31,13 @@ import java.util.List;
 import java.util.NavigableSet;
 import java.util.TreeSet;
 
-import com.google.common.base.Preconditions;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.kylin.common.KylinConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 
 public class FileResourceStore extends ResourceStore {
@@ -176,12 +176,12 @@ public class FileResourceStore extends ResourceStore {
 
     @Override
     protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS)
-            throws IOException, IllegalStateException {
+            throws IOException, WriteConflictException {
         synchronized (FileResourceStore.class) {
 
             File f = file(resPath);
             if ((f.exists() && f.lastModified() != oldTS) || (f.exists() == false && oldTS != 0))
-                throw new IllegalStateException("Overwriting conflict " + resPath + ", expect old TS " + oldTS
+                throw new WriteConflictException("Overwriting conflict " + resPath + ", expect old TS " + oldTS
                         + ", but found " + f.lastModified());
 
             putResourceImpl(resPath, new ByteArrayInputStream(content), newTS);
diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/HDFSResourceStore.java b/core-common/src/main/java/org/apache/kylin/common/persistence/HDFSResourceStore.java
index 8ad2540..1739ce0 100644
--- a/core-common/src/main/java/org/apache/kylin/common/persistence/HDFSResourceStore.java
+++ b/core-common/src/main/java/org/apache/kylin/common/persistence/HDFSResourceStore.java
@@ -207,7 +207,7 @@ public class HDFSResourceStore extends ResourceStore {
     }
 
     @Override
-    protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS) throws IOException, IllegalStateException {
+    protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS) throws IOException, WriteConflictException {
         Path p = getRealHDFSPath(resPath);
         if (!fs.exists(p)) {
             if (oldTS != 0) {
@@ -217,7 +217,7 @@ public class HDFSResourceStore extends ResourceStore {
         } else {
             long realLastModify = getResourceTimestamp(resPath);
             if (realLastModify != oldTS) {
-                throw new IllegalStateException("Overwriting conflict " + resPath + ", expect old TS " + oldTS + ", but found " + realLastModify);
+                throw new WriteConflictException("Overwriting conflict " + resPath + ", expect old TS " + oldTS + ", but found " + realLastModify);
             }
         }
         putResourceImpl(resPath, new ByteArrayInputStream(content), newTS);
diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java b/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java
index 2bccd67..bda6cd0 100644
--- a/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java
+++ b/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java
@@ -276,14 +276,16 @@ abstract public class ResourceStore {
     /**
      * check & set, overwrite a resource
      */
-    final public <T extends RootPersistentEntity> long putResource(String resPath, T obj, Serializer<T> serializer) throws IOException {
+    final public <T extends RootPersistentEntity> long putResource(String resPath, T obj, Serializer<T> serializer)
+            throws IOException, WriteConflictException {
         return putResource(resPath, obj, System.currentTimeMillis(), serializer);
     }
 
     /**
      * check & set, overwrite a resource
      */
-    final public <T extends RootPersistentEntity> long putResource(String resPath, T obj, long newTS, Serializer<T> serializer) throws IOException {
+    final public <T extends RootPersistentEntity> long putResource(String resPath, T obj, long newTS,
+            Serializer<T> serializer) throws IOException, WriteConflictException {
         resPath = norm(resPath);
         //logger.debug("Saving resource " + resPath + " (Store " + kylinConfig.getMetadataUrl() + ")");
 
@@ -309,7 +311,8 @@ abstract public class ResourceStore {
         }
     }
 
-    private long checkAndPutResourceCheckpoint(String resPath, byte[] content, long oldTS, long newTS) throws IOException {
+    private long checkAndPutResourceCheckpoint(String resPath, byte[] content, long oldTS, long newTS)
+            throws IOException, WriteConflictException {
         beforeChange(resPath);
         return checkAndPutResourceImpl(resPath, content, oldTS, newTS);
     }
@@ -317,7 +320,8 @@ abstract public class ResourceStore {
     /**
      * checks old timestamp when overwriting existing
      */
-    abstract protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS) throws IOException, IllegalStateException;
+    abstract protected long checkAndPutResourceImpl(String resPath, byte[] content, long oldTS, long newTS)
+            throws IOException, WriteConflictException;
 
     /**
      * delete a resource, does nothing on a folder
diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/StorageException.java b/core-common/src/main/java/org/apache/kylin/common/persistence/WriteConflictException.java
similarity index 84%
rename from core-common/src/main/java/org/apache/kylin/common/persistence/StorageException.java
rename to core-common/src/main/java/org/apache/kylin/common/persistence/WriteConflictException.java
index 604941a..f235b05 100644
--- a/core-common/src/main/java/org/apache/kylin/common/persistence/StorageException.java
+++ b/core-common/src/main/java/org/apache/kylin/common/persistence/WriteConflictException.java
@@ -19,19 +19,16 @@
 package org.apache.kylin.common.persistence;
 
 /**
- * 
- * @author xjiang
- * 
  */
-public class StorageException extends RuntimeException {
+public class WriteConflictException extends RuntimeException {
 
     private static final long serialVersionUID = -3748712888242406257L;
 
-    public StorageException(String msg, Throwable t) {
+    public WriteConflictException(String msg, Throwable t) {
         super(msg, t);
     }
 
-    public StorageException(String msg) {
+    public WriteConflictException(String msg) {
         super(msg);
     }
 
diff --git a/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java b/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
index f183e7c..3e1a31c 100644
--- a/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
+++ b/core-common/src/test/java/org/apache/kylin/common/persistence/ResourceStoreTest.java
@@ -137,7 +137,7 @@ public class ResourceStoreTest {
             t.setLastModified(t.getLastModified() - 1);
             store.putResource(path2, t, StringEntity.serializer);
             fail("write conflict should trigger IllegalStateException");
-        } catch (IllegalStateException e) {
+        } catch (WriteConflictException e) {
             // expected
         }
 
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
index 15bb676..b8deadb 100755
--- a/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/CubeManager.java
@@ -37,6 +37,7 @@ import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.JsonSerializer;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.persistence.Serializer;
+import org.apache.kylin.common.persistence.WriteConflictException;
 import org.apache.kylin.common.util.AutoReadWriteLock;
 import org.apache.kylin.common.util.AutoReadWriteLock.AutoLock;
 import org.apache.kylin.common.util.Dictionary;
@@ -354,7 +355,7 @@ public class CubeManager implements IRealizationProvider {
 
         try {
             cube = crud.save(cube);
-        } catch (IllegalStateException ise) {
+        } catch (WriteConflictException ise) {
             logger.warn("Write conflict to update cube " + cube.getName() + " at try " + retry + ", will retry...");
             if (retry >= 7) {
                 logger.error("Retried 7 times till got error, abandoning...", ise);
diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/TempStatementManager.java b/core-metadata/src/main/java/org/apache/kylin/metadata/TempStatementManager.java
index 970df0c..182fc47 100644
--- a/core-metadata/src/main/java/org/apache/kylin/metadata/TempStatementManager.java
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/TempStatementManager.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.persistence.RootPersistentEntity;
+import org.apache.kylin.common.persistence.WriteConflictException;
 import org.apache.kylin.common.util.AutoReadWriteLock;
 import org.apache.kylin.common.util.AutoReadWriteLock.AutoLock;
 import org.apache.kylin.metadata.cachesync.Broadcaster;
@@ -136,7 +137,7 @@ public class TempStatementManager {
     private void updateTempStatementWithRetry(TempStatementEntity entity, int retry) throws IOException {
         try {
             crud.save(entity);
-        } catch (IllegalStateException ise) {
+        } catch (WriteConflictException ise) {
             logger.warn("Write conflict to update temp statement" + entity.statementId + " at try " + retry
                     + ", will retry...");
             if (retry >= 7) {
diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/AclService.java b/server-base/src/main/java/org/apache/kylin/rest/service/AclService.java
index f3e2393..4f439fe 100644
--- a/server-base/src/main/java/org/apache/kylin/rest/service/AclService.java
+++ b/server-base/src/main/java/org/apache/kylin/rest/service/AclService.java
@@ -32,6 +32,7 @@ import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.persistence.JsonSerializer;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.persistence.Serializer;
+import org.apache.kylin.common.persistence.WriteConflictException;
 import org.apache.kylin.common.util.AutoReadWriteLock;
 import org.apache.kylin.common.util.AutoReadWriteLock.AutoLock;
 import org.apache.kylin.metadata.cachesync.Broadcaster;
@@ -305,7 +306,7 @@ public class AclService implements MutableAclService, InitializingBean {
                 crud.save(record);
                 return acl; // here we are done
 
-            } catch (IllegalStateException ise) {
+            } catch (WriteConflictException ise) {
                 if (retry <= 0) {
                     logger.error("Retry is out, till got error, abandoning...", ise);
                     throw ise;
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
index 0c2fb04..53e8a68 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseConnection.java
@@ -49,7 +49,6 @@ import org.apache.hadoop.hdfs.DFSConfigKeys;
 import org.apache.kylin.common.KylinConfig;
 import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.lock.DistributedLock;
-import org.apache.kylin.common.persistence.StorageException;
 import org.apache.kylin.common.util.HadoopUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -269,7 +268,7 @@ public class HBaseConnection {
 
         } catch (Throwable t) {
             logger.error("Error when open connection " + url, t);
-            throw new StorageException("Error when open connection " + url, t);
+            throw new RuntimeException("Error when open connection " + url, t);
         }
 
         return connection;
diff --git a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
index 3762437..23df556 100644
--- a/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
+++ b/storage-hbase/src/main/java/org/apache/kylin/storage/hbase/HBaseResourceStore.java
@@ -54,6 +54,7 @@ import org.apache.kylin.common.StorageURL;
 import org.apache.kylin.common.persistence.RawResource;
 import org.apache.kylin.common.persistence.ResourceStore;
 import org.apache.kylin.common.persistence.StringEntity;
+import org.apache.kylin.common.persistence.WriteConflictException;
 import org.apache.kylin.common.util.Bytes;
 import org.apache.kylin.common.util.BytesUtil;
 import org.apache.kylin.common.util.HadoopUtil;
@@ -321,7 +322,7 @@ public class HBaseResourceStore extends ResourceStore {
                     + ", operation result: " + ok);
             if (!ok) {
                 long real = getResourceTimestampImpl(resPath);
-                throw new IllegalStateException(
+                throw new WriteConflictException(
                         "Overwriting conflict " + resPath + ", expect old TS " + oldTS + ", but it is " + real);
             }
 

-- 
To stop receiving notification emails like this one, please contact
liyang@apache.org.