You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2016/12/07 18:10:31 UTC

[3/3] activemq git commit: [AMQ-6441] add option to specify the hard limits on a usage such that spurious values from the file system can be overridden. this closes #202 thanks William Crowell for the patch with test

[AMQ-6441] add option to specify the hard limits on a usage such that spurious values from the file system can be overridden. this closes #202 thanks William Crowell for the patch with test


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

Branch: refs/heads/master
Commit: 8a28c065554750ea5063333e2ff479a84d689a51
Parents: 41bec0d
Author: gtully <ga...@gmail.com>
Authored: Wed Dec 7 18:09:34 2016 +0000
Committer: gtully <ga...@gmail.com>
Committed: Wed Dec 7 18:09:34 2016 +0000

----------------------------------------------------------------------
 .../apache/activemq/broker/BrokerService.java   | 16 +++++++-----
 .../activemq/usage/PercentLimitUsage.java       | 27 ++++++++++++++++++++
 .../org/apache/activemq/usage/StoreUsage.java   | 12 +--------
 .../org/apache/activemq/usage/TempUsage.java    | 12 ++-------
 .../activemq/broker/BrokerServiceTest.java      | 27 +++++++++++++-------
 .../org/apache/activemq/util/LargeFile.java     |  5 ++++
 6 files changed, 62 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java b/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java
index 00fd2fc..7f06bd9 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java
@@ -111,9 +111,9 @@ import org.apache.activemq.thread.TaskRunnerFactory;
 import org.apache.activemq.transport.TransportFactorySupport;
 import org.apache.activemq.transport.TransportServer;
 import org.apache.activemq.transport.vm.VMTransportFactory;
+import org.apache.activemq.usage.PercentLimitUsage;
 import org.apache.activemq.usage.StoreUsage;
 import org.apache.activemq.usage.SystemUsage;
-import org.apache.activemq.usage.Usage;
 import org.apache.activemq.util.BrokerSupport;
 import org.apache.activemq.util.DefaultIOExceptionHandler;
 import org.apache.activemq.util.IOExceptionHandler;
@@ -2048,18 +2048,19 @@ public class BrokerService implements Service {
         }
     }
 
-    protected void checkUsageLimit(File dir, Usage<?> storeUsage, int percentLimit) throws ConfigurationException {
+    protected void checkUsageLimit(File dir, PercentLimitUsage<?> storeUsage, int percentLimit) throws ConfigurationException {
         if (dir != null) {
             dir = StoreUtil.findParentDirectory(dir);
             String storeName = storeUsage instanceof StoreUsage ? "Store" : "Temporary Store";
             long storeLimit = storeUsage.getLimit();
             long storeCurrent = storeUsage.getUsage();
-            long totalSpace = dir.getTotalSpace();
-            if (totalSpace < 0) {
-                totalSpace = Long.MAX_VALUE;
-                LOG.info("Total space was negative.  Setting to " + totalSpace);
+            long totalSpace = storeUsage.getTotal() > 0 ? storeUsage.getTotal() : dir.getTotalSpace();
+            long totalUsableSpace = (storeUsage.getTotal() > 0 ? storeUsage.getTotal() : dir.getUsableSpace()) + storeCurrent;
+            if (totalUsableSpace < 0 || totalSpace < 0) {
+                final String message = "File system space reported by: " + dir + " was negative, possibly a huge file system, set a sane usage.total to provide some guidance";
+                LOG.error(message);
+                throw new ConfigurationException(message);
             }
-            long totalUsableSpace = dir.getUsableSpace() + storeCurrent;
             //compute byte value of the percent limit
             long bytePercentLimit = totalSpace * percentLimit / 100;
             int oneMeg = 1024 * 1024;
@@ -2069,6 +2070,7 @@ public class BrokerService implements Service {
             //Changes in partition size (total space) as well as changes in usable space should
             //be detected here
             if (diskUsageCheckRegrowThreshold > -1 && percentLimit > 0
+                    && storeUsage.getTotal() == 0
                     && storeLimit < bytePercentLimit && storeLimit < totalUsableSpace){
 
                 // set the limit to be bytePercentLimit or usableSpace if

http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-broker/src/main/java/org/apache/activemq/usage/PercentLimitUsage.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/usage/PercentLimitUsage.java b/activemq-broker/src/main/java/org/apache/activemq/usage/PercentLimitUsage.java
index c08fa00..a72dece 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/usage/PercentLimitUsage.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/usage/PercentLimitUsage.java
@@ -17,9 +17,14 @@
 package org.apache.activemq.usage;
 
 
+import org.apache.activemq.util.StoreUtil;
+
+import java.io.File;
+
 public abstract class PercentLimitUsage <T extends Usage> extends Usage<T> {
 
     protected int percentLimit = 0;
+    protected long total = 0;
 
     /**
      * @param parent
@@ -49,5 +54,27 @@ public abstract class PercentLimitUsage <T extends Usage> extends Usage<T> {
         }
     }
 
+    public void setTotal(long max) {
+        this.total = max;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+
+    protected void percentLimitFromFile(File directory) {
+        if (percentLimit > 0) {
+            if (total > 0) {
+                this.setLimit(total * percentLimit / 100);
+            } else if (directory != null) {
+                File dir = StoreUtil.findParentDirectory(directory);
+                if (dir != null) {
+                    this.setLimit(dir.getTotalSpace() * percentLimit / 100);
+                }
+            }
+        }
+    }
+
     protected abstract void updateLimitBasedOnPercent();
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-broker/src/main/java/org/apache/activemq/usage/StoreUsage.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/usage/StoreUsage.java b/activemq-broker/src/main/java/org/apache/activemq/usage/StoreUsage.java
index 4646551..a2cd0fd 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/usage/StoreUsage.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/usage/StoreUsage.java
@@ -16,10 +16,7 @@
  */
 package org.apache.activemq.usage;
 
-import java.io.File;
-
 import org.apache.activemq.store.PersistenceAdapter;
-import org.apache.activemq.util.StoreUtil;
 
 /**
  * Used to keep track of how much of something is being used so that a
@@ -96,14 +93,7 @@ public class StoreUsage extends PercentLimitUsage<StoreUsage> {
     protected void updateLimitBasedOnPercent() {
         usageLock.writeLock().lock();
         try {
-
-            if (percentLimit > 0 && store != null) {
-                File dir = StoreUtil.findParentDirectory(store.getDirectory());
-
-                if (dir != null) {
-                    this.setLimit(dir.getTotalSpace() * percentLimit / 100);
-                }
-            }
+            percentLimitFromFile(store != null ? store.getDirectory() : null);
         } finally {
             usageLock.writeLock().unlock();
         }

http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-broker/src/main/java/org/apache/activemq/usage/TempUsage.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/usage/TempUsage.java b/activemq-broker/src/main/java/org/apache/activemq/usage/TempUsage.java
index 885afbe..4f75d35 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/usage/TempUsage.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/usage/TempUsage.java
@@ -17,10 +17,7 @@
 package org.apache.activemq.usage;
 
 
-import java.io.File;
-
 import org.apache.activemq.store.PListStore;
-import org.apache.activemq.util.StoreUtil;
 
 /**
  * Used to keep track of how much of something is being used so that a
@@ -89,15 +86,10 @@ public class TempUsage extends PercentLimitUsage<TempUsage> {
     protected void updateLimitBasedOnPercent() {
         usageLock.writeLock().lock();
         try {
-            if (percentLimit > 0 && store != null) {
-                File dir = StoreUtil.findParentDirectory(store.getDirectory());
-
-                if (dir != null) {
-                    this.setLimit(dir.getTotalSpace() * percentLimit / 100);
-                }
-            }
+            percentLimitFromFile(store != null ? store.getDirectory() : null);
         } finally {
             usageLock.writeLock().unlock();
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-unit-tests/src/test/java/org/apache/activemq/broker/BrokerServiceTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/BrokerServiceTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/BrokerServiceTest.java
index 8822f9d..810a6ea 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/broker/BrokerServiceTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/broker/BrokerServiceTest.java
@@ -103,20 +103,29 @@ public class BrokerServiceTest extends TestCase {
         PersistenceAdapter persistenceAdapter = service.createPersistenceAdapter();
         persistenceAdapter.setDirectory(dataDirectory);
         service.setPersistenceAdapter(persistenceAdapter);
+        service.setUseJmx(false);
 
         mockStatic(StoreUtil.class);
 
         // Return a simulated handle to a very large file system that will return a negative totalSpace.
         when(StoreUtil.findParentDirectory(dataDirectory)).thenReturn(new LargeFile(dataDirectory.getParentFile(), "KahaDB"));
-        when(StoreUtil.findParentDirectory(tmpDataDirectory)).thenReturn(tmpDataDirectory);
-
-        service.setPersistent(false);
-        service.setUseJmx(false);
-        TransportConnector connector = service.addConnector("tcp://localhost:0");
-        service.start();
-
-        service.removeConnector(connector);
-        connector.stop();
+        when(StoreUtil.findParentDirectory(tmpDataDirectory)).thenReturn(tmpDataDirectory.getParentFile());
+
+        try {
+            service.start();
+            fail("Expect error on negative totalspace");
+        } catch (Exception expected) {
+            // verify message
+            assertTrue(expected.getLocalizedMessage().contains("negative"));
+        }
+        finally {
+            service.stop();
+        }
+
+        // configure a 2x value for the fs limit so it can start
+        service.getSystemUsage().getStoreUsage().setTotal( service.getSystemUsage().getStoreUsage().getLimit() * 2);
+
+        service.start(true);
         service.stop();
 
         verifyStatic();

http://git-wip-us.apache.org/repos/asf/activemq/blob/8a28c065/activemq-unit-tests/src/test/java/org/apache/activemq/util/LargeFile.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/util/LargeFile.java b/activemq-unit-tests/src/test/java/org/apache/activemq/util/LargeFile.java
index a050608..5328f1d 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/util/LargeFile.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/util/LargeFile.java
@@ -22,4 +22,9 @@ public class LargeFile extends File {
 	public long getTotalSpace() {
 		return Long.MAX_VALUE + 4193L;
 	}
+
+	@Override
+	public long getUsableSpace() {
+		return getTotalSpace() - 1024L;
+	}
 }