You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/08/26 09:16:31 UTC

[27/50] ignite git commit: IGNITE-3197 - OverlappingFileLockException in marshaller context

IGNITE-3197 - OverlappingFileLockException in marshaller context


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a0c7c44f
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a0c7c44f
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a0c7c44f

Branch: refs/heads/ignite-3443
Commit: a0c7c44fc864aa965fd4d14e5362a4f6356c01ab
Parents: fa13832
Author: AndreVel <an...@gmail.com>
Authored: Mon Aug 22 20:50:57 2016 -0700
Committer: Valentin Kulichenko <va...@gmail.com>
Committed: Mon Aug 22 20:50:57 2016 -0700

----------------------------------------------------------------------
 .../ignite/internal/MarshallerContextImpl.java  |   9 +-
 .../continuous/CacheContinuousQueryManager.java |   2 +-
 .../MarshallerContextLockingSelfTest.java       | 139 +++++++++++++++++++
 .../ignite/testsuites/IgniteBasicTestSuite.java |   3 +
 4 files changed, 150 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c7c44f/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 504ea6e..0420e18 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -27,6 +27,7 @@ import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
+import java.nio.channels.OverlappingFileLockException;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ThreadLocalRandom;
@@ -258,7 +259,7 @@ public class MarshallerContextImpl extends MarshallerContextAdapter {
 
     /**
      */
-    private static class ContinuousQueryListener implements CacheEntryUpdatedListener<Integer, String> {
+    public static class ContinuousQueryListener implements CacheEntryUpdatedListener<Integer, String> {
         /** */
         private final IgniteLogger log;
 
@@ -269,7 +270,7 @@ public class MarshallerContextImpl extends MarshallerContextAdapter {
          * @param log Logger.
          * @param workDir Work directory.
          */
-        private ContinuousQueryListener(IgniteLogger log, File workDir) {
+        public ContinuousQueryListener(IgniteLogger log, File workDir) {
             this.log = log;
             this.workDir = workDir;
         }
@@ -306,6 +307,10 @@ public class MarshallerContextImpl extends MarshallerContextAdapter {
                             U.error(log, "Failed to write class name to file [id=" + evt.getKey() +
                                 ", clsName=" + evt.getValue() + ", file=" + file.getAbsolutePath() + ']', e);
                         }
+                        catch(OverlappingFileLockException ignored) {
+                            if (log.isDebugEnabled())
+                                log.debug("File already locked (will ignore): " + file.getAbsolutePath());
+                        }
                         catch (IgniteInterruptedCheckedException e) {
                             U.error(log, "Interrupted while waiting for acquiring file lock: " + file, e);
                         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c7c44f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
index a8e5a6b..2863f3d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
@@ -1204,7 +1204,7 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
     /**
      *
      */
-    private static class CacheEntryEventImpl extends CacheQueryEntryEvent {
+    public static class CacheEntryEventImpl extends CacheQueryEntryEvent {
         /** */
         private static final long serialVersionUID = 0L;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c7c44f/modules/core/src/test/java/org/apache/ignite/internal/MarshallerContextLockingSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/MarshallerContextLockingSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/MarshallerContextLockingSelfTest.java
new file mode 100644
index 0000000..e549336
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/MarshallerContextLockingSelfTest.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.atomic.AtomicInteger;
+import javax.cache.event.CacheEntryEvent;
+import javax.cache.event.EventType;
+import org.apache.ignite.internal.processors.cache.IgniteCacheProxy;
+import org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.GridTestClassLoader;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.logger.GridTestLog4jLogger;
+
+/**
+ * Test marshaller context.
+ */
+public class MarshallerContextLockingSelfTest extends GridCommonAbstractTest {
+    /** Inner logger. */
+    private InnerLogger innerLog = null;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        innerLog = new InnerLogger();
+
+        log = innerLog;
+    }
+
+    /**
+     * Mumtithread test, used custom class loader
+     */
+    public void testMultithreadedUpdate() throws Exception {
+        multithreaded(new Callable<Object>() {
+            @Override public Object call() throws Exception {
+                GridTestClassLoader classLoader = new GridTestClassLoader(
+                    InternalExecutor.class.getName(),
+                    MarshallerContextImpl.class.getName(),
+                    MarshallerContextImpl.ContinuousQueryListener.class.getName()
+                );
+
+                Thread.currentThread().setContextClassLoader(classLoader);
+
+                Class clazz = classLoader.loadClass(InternalExecutor.class.getName());
+
+                Object internelExecutor = clazz.newInstance();
+
+                clazz.getMethod("executeTest", GridTestLog4jLogger.class).invoke(internelExecutor, log);
+
+                return null;
+            }
+        }, 4);
+
+        assertTrue(InternalExecutor.counter.get() == 0);
+
+        assertTrue(innerLog.contains("File already locked"));
+
+        assertTrue(!innerLog.contains("Exception"));
+    }
+
+    /**
+     * Internal test executor
+     */
+    public static class InternalExecutor {
+        /** Counter. */
+        public static AtomicInteger counter = new AtomicInteger();
+
+        /**
+        * Executes onUpdated
+        */
+        public void executeTest(GridTestLog4jLogger log) throws Exception {
+            counter.incrementAndGet();
+
+            File workDir = U.resolveWorkDirectory("marshaller", false);
+
+            final MarshallerContextImpl.ContinuousQueryListener queryListener = new MarshallerContextImpl.ContinuousQueryListener(log, workDir);
+
+            final ArrayList evts = new ArrayList<CacheEntryEvent<Integer, String>>();
+
+            IgniteCacheProxy cache = new IgniteCacheProxy();
+
+            evts.add(new CacheContinuousQueryManager.CacheEntryEventImpl(cache, EventType.CREATED, 1, String.class.getName()));
+
+            for (int i = 0; i < 100; i++)
+                queryListener.onUpdated(evts);
+        }
+    }
+
+    /**
+     * Internal logger
+     */
+    public static class InnerLogger extends GridTestLog4jLogger {
+        /** */
+        private Collection<String> logs = new ConcurrentLinkedDeque<>();
+
+        /**
+         * Returns true if and only if this string contains the specified
+         * sequence of char values.
+         *
+         * @param str String.
+         */
+        public boolean contains(String str) {
+            for (String text : logs)
+                if (text != null && text.contains(str))
+                    return true;
+
+            return false;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void debug(String msg) {
+            logs.add(msg);
+        }
+
+        /** {@inheritDoc} */
+        @Override public boolean isDebugEnabled() {
+            return true;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c7c44f/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
index 6611500..d56c29d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.GridSelfTest;
 import org.apache.ignite.internal.GridStartStopSelfTest;
 import org.apache.ignite.internal.GridStopWithCancelSelfTest;
 import org.apache.ignite.internal.IgniteSlowClientDetectionSelfTest;
+import org.apache.ignite.internal.MarshallerContextLockingSelfTest;
 import org.apache.ignite.internal.processors.affinity.GridAffinityProcessorRendezvousSelfTest;
 import org.apache.ignite.internal.processors.cache.GridProjectionForCachesOnDaemonNodeSelfTest;
 import org.apache.ignite.internal.processors.cache.IgniteDaemonNodeMarshallerCacheTest;
@@ -136,6 +137,8 @@ public class IgniteBasicTestSuite extends TestSuite {
         suite.addTestSuite(ConfigVariationsTestSuiteBuilderTest.class);
         suite.addTestSuite(NotStringSystemPropertyTest.class);
 
+        suite.addTestSuite(MarshallerContextLockingSelfTest.class);
+
         return suite;
     }
 }