Repository: brooklyn-server
Updated Branches:
  refs/heads/master 880f842e6 -> f22da254e


Increase persistence timeout

File access locks for exactly 30 seconds in Virtualbox.


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

Branch: refs/heads/master
Commit: c56e203d9b838eef34b03bfd0c3dbe29f6fdbbd5
Parents: a569463
Author: Svetoslav Neykov <svetoslav.ney...@cloudsoftcorp.com>
Authored: Mon Nov 21 09:08:39 2016 +0200
Committer: Svetoslav Neykov <svetoslav.ney...@cloudsoftcorp.com>
Committed: Tue Nov 22 14:53:32 2016 +0200

----------------------------------------------------------------------
 .../FileBasedStoreObjectAccessorWriterTest.java | 42 +++++++++++++++++++-
 .../core/mgmt/rebind/RebindTestUtils.java       |  4 +-
 2 files changed, 44 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c56e203d/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
index d131128..eb480e8 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/FileBasedStoreObjectAccessorWriterTest.java
@@ -21,10 +21,16 @@ package org.apache.brooklyn.core.mgmt.persist;
 import static org.testng.Assert.assertEquals;
 
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Writer;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 
 import 
org.apache.brooklyn.core.mgmt.persist.PersistenceObjectStore.StoreObjectAccessorWithLock;
 import org.apache.brooklyn.util.os.Os;
+import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
 import org.testng.annotations.Test;
 
@@ -35,8 +41,17 @@ import com.google.common.io.Files;
 @Test
 public class FileBasedStoreObjectAccessorWriterTest extends 
PersistenceStoreObjectAccessorWriterTestFixture {
 
+    private static final Duration FILE_OPERATION_TIMEOUT = 
Duration.seconds(20);
+    private static final String TEST_FILE_CONTENT = generateContent();
+
     private File file;
-    
+
+    private static String generateContent() {
+        final char[] charArray = new char[4096];
+        java.util.Arrays.fill(charArray, ' ');
+        return new String(charArray);
+    }
+
     protected StoreObjectAccessorWithLock newPersistenceStoreObjectAccessor() 
throws IOException {
         file = Os.newTempFile(getClass(), "txt");
         return new StoreObjectAccessorLocking(new 
FileBasedStoreObjectAccessor(file, ".tmp"));
@@ -61,6 +76,31 @@ public class FileBasedStoreObjectAccessorWriterTest extends 
PersistenceStoreObje
         FileBasedObjectStoreTest.assertFilePermission600(file);
     }
 
+    // Fails ~3 times on 5000 runs in Virtualbox (Ubuntu Xenial).
+    // Fails only with multiple threads.
+    // Illustrates the problem which led to the increase of {@link 
RebindTestUtils#TIMEOUT} from 20 to 40 seconds.
+    @Test(groups={"Integration", "Broken"}, invocationCount=5000)
+    public void testSimpleOperationsDelay() throws Exception {
+        Callable<Void> r = new Callable<Void>() {
+            @Override
+            public Void call() throws Exception {
+                File tmp = Os.newTempFile(getClass(), "txt");
+                try(Writer out = new FileWriter(tmp)) {
+                    out.write(TEST_FILE_CONTENT);
+                }
+                tmp.delete();
+                return null;
+            }
+        };
+
+        final Future<Void> f1 = executor.submit(r);
+        final Future<Void> f2 = executor.submit(r);
+
+        CountdownTimer time = 
CountdownTimer.newInstanceStarted(FILE_OPERATION_TIMEOUT);
+        f1.get(time.getDurationRemaining().toMilliseconds(), 
TimeUnit.MILLISECONDS);
+        f2.get(time.getDurationRemaining().toMilliseconds(), 
TimeUnit.MILLISECONDS);
+    }
+    
     @Test(groups="Integration")
     public void testPutCreatesNewFile() throws Exception {
         File nonExistantFile = Os.newTempFile(getClass(), "txt");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/c56e203d/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
index 1d0f236..f274ad5 100644
--- 
a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
+++ 
b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java
@@ -68,7 +68,9 @@ public class RebindTestUtils {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RebindTestUtils.class);
 
-    private static final Duration TIMEOUT = Duration.seconds(20);
+    // Virtualbox sometimes hangs for exactly 30 seconds on rename(3) or 
delete(3), confirmed by strace.
+    // See FileBasedStoreObjectAccessorWriterTest.testSimpleOperationsDelay() 
for a simple test to reproduce it.
+    private static final Duration TIMEOUT = Duration.seconds(40);
 
     public static <T> T serializeAndDeserialize(T memento) throws Exception {
         ObjectReplacer replacer = new ObjectReplacer() {

Reply via email to