You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2015/04/07 23:37:10 UTC
activemq git commit: AMQ-5709 Reworking Logging on Locker
Repository: activemq
Updated Branches:
refs/heads/master c705523cd -> 89c75ca28
AMQ-5709 Reworking Logging on Locker
https://issues.apache.org/jira/browse/AMQ-5709
This is about changing how the Log is done in case of not being able to lock (log only once)
Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/89c75ca2
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/89c75ca2
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/89c75ca2
Branch: refs/heads/master
Commit: 89c75ca28aae1e6a5b62f159350d29a5f7782e71
Parents: c705523
Author: Clebert Suconic <cl...@apache.org>
Authored: Tue Apr 7 15:48:42 2015 -0400
Committer: Clebert Suconic <cl...@apache.org>
Committed: Tue Apr 7 17:24:48 2015 -0400
----------------------------------------------------------------------
.../apache/activemq/store/SharedFileLocker.java | 29 +++--
.../activemq/store/SharedFileLockerTest.java | 109 +++++++++++++++++++
2 files changed, 129 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq/blob/89c75ca2/activemq-broker/src/main/java/org/apache/activemq/store/SharedFileLocker.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/store/SharedFileLocker.java b/activemq-broker/src/main/java/org/apache/activemq/store/SharedFileLocker.java
index e14eb03..a5432aa 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/store/SharedFileLocker.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/store/SharedFileLocker.java
@@ -16,15 +16,15 @@
*/
package org.apache.activemq.store;
+import java.io.File;
+import java.io.IOException;
+
import org.apache.activemq.broker.AbstractLocker;
import org.apache.activemq.util.LockFile;
import org.apache.activemq.util.ServiceStopper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.IOException;
-
/**
* Represents an exclusive lock on a database to avoid multiple brokers running
* against the same logical database.
@@ -48,19 +48,30 @@ public class SharedFileLocker extends AbstractLocker {
if (failIfLocked) {
lockFile.lock();
} else {
+ // Print a warning only once
+ boolean warned = false;
boolean locked = false;
while ((!isStopped()) && (!isStopping())) {
try {
lockFile.lock();
locked = keepAlive();
+ LOG.info("locked " + locked);
break;
} catch (IOException e) {
- LOG.info("Database "
- + lockFileName
- + " is locked... waiting "
- + (lockAcquireSleepInterval / 1000)
- + " seconds for the database to be unlocked. Reason: "
- + e);
+ if (!warned)
+ {
+ LOG.info("Database "
+ + lockFileName
+ + " is locked by another server. This broker is now in slave mode waiting a lock to be acquired");
+ warned = true;
+ }
+
+ LOG.debug("Database "
+ + lockFileName
+ + " is locked... waiting "
+ + (lockAcquireSleepInterval / 1000)
+ + " seconds for the database to be unlocked. Reason: "
+ + e);
try {
Thread.sleep(lockAcquireSleepInterval);
} catch (InterruptedException e1) {
http://git-wip-us.apache.org/repos/asf/activemq/blob/89c75ca2/activemq-unit-tests/src/test/java/org/apache/activemq/store/SharedFileLockerTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/store/SharedFileLockerTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/store/SharedFileLockerTest.java
new file mode 100644
index 0000000..d8700c0
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/store/SharedFileLockerTest.java
@@ -0,0 +1,109 @@
+/**
+ * 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.activemq.store;
+
+import java.io.File;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class SharedFileLockerTest
+{
+ @Rule
+ public TemporaryFolder testFolder = new TemporaryFolder();
+
+ @Test
+ public void testLock() throws Exception
+ {
+ final AtomicInteger errors = new AtomicInteger(0);
+
+ Thread thread = null;
+
+ SharedFileLocker locker1 = new SharedFileLocker();
+ locker1.setDirectory(testFolder.getRoot());
+
+ final SharedFileLocker locker2 = new SharedFileLocker();
+ locker2.setLockAcquireSleepInterval(1);
+ locker2.setDirectory(testFolder.getRoot());
+
+
+ try
+ {
+ locker1.doStart();
+
+ Assert.assertTrue(locker1.keepAlive());
+
+ Thread.sleep(10);
+
+ thread = new Thread("Locker Thread")
+ {
+ public void run()
+ {
+ try
+ {
+ locker2.doStart();
+ }
+ catch (Throwable e)
+ {
+ errors.incrementAndGet();
+ }
+ }
+ };
+
+ thread.start();
+
+ // Waiting some small time here, you shouldn't see many messages
+ Thread.sleep(100);
+
+ Assert.assertTrue(thread.isAlive());
+
+ locker1.stop();
+
+ // 10 seconds here is an eternity, but it should only take milliseconds
+ thread.join(5000);
+
+ long timeout = System.currentTimeMillis() + 5000;
+
+ while (timeout > System.currentTimeMillis() && !locker2.keepAlive())
+ {
+ Thread.sleep(1);
+ }
+
+ Assert.assertTrue(locker2.keepAlive());
+
+ locker2.stop();
+
+ }
+ finally
+ {
+ // to make sure we won't leak threads if the test ever failed for any reason
+ thread.join(1000);
+ if (thread.isAlive())
+ {
+ thread.interrupt();
+ }
+
+ File lockFile = new File(testFolder.getRoot(), "lock");
+ lockFile.delete();
+ }
+
+ }
+}