Author: rgodfrey
Date: Fri Jan 22 11:21:10 2016
New Revision: 1726176

URL: http://svn.apache.org/viewvc?rev=1726176&view=rev
Log:
QPID-7006 , QPID-7007 : Add operations to update BDB configuration, retrieve 
statistics, clean log and perform checkpoint

Added:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java
   (with props)
Modified:
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBEnvironmentContainer.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacade.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHost.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHostImpl.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java
    
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBEnvironmentContainer.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBEnvironmentContainer.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBEnvironmentContainer.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBEnvironmentContainer.java
 Fri Jan 22 11:21:10 2016
@@ -19,7 +19,31 @@
 
 package org.apache.qpid.server.store.berkeleydb;
 
-public interface BDBEnvironmentContainer
+import java.util.Map;
+
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ManagedOperation;
+import org.apache.qpid.server.model.Param;
+
+public interface BDBEnvironmentContainer<X extends ConfiguredObject<X>> 
extends ConfiguredObject<X>
 {
     void setBDBCacheSize(long cacheSize);
+
+    @ManagedOperation(description = "Update BDB mutable configuration from 
settings in context variables")
+    void updateMutableConfig();
+
+    @ManagedOperation(description = "Instruct BDB to attempt to clean up its 
log files")
+    int cleanLog();
+
+    @ManagedOperation(description = "Instruct BDB to perform a checkpoint 
operation")
+    void checkpoint(@Param(name = "force", defaultValue = "false") boolean 
force);
+
+    @ManagedOperation(description = "Get the BDB environment statistics", 
nonModifying = true)
+    Map<String,Map<String,Object>> environmentStatistics(@Param(name="reset", 
defaultValue = "false", description = "If true, reset the statistics") boolean 
reset);
+
+    @ManagedOperation(description = "Get the BDB transaction statistics", 
nonModifying = true)
+    Map<String, Object> transactionStatistics(@Param(name="reset", 
defaultValue = "false", description = "If true, reset the statistics")boolean 
reset);
+
+    @ManagedOperation(description = "Get the BDB database statistics", 
nonModifying = true)
+    Map<String, Object> databaseStatistics(@Param(name="database", description 
= "database table for which to retrieve statistics")String database, 
@Param(name="reset", defaultValue = "false", description = "If true, reset the 
statistics") boolean reset);
 }

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacade.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacade.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacade.java
 Fri Jan 22 11:21:10 2016
@@ -72,4 +72,16 @@ public interface EnvironmentFacade
     void setCacheSize(long cacheSize);
 
     void flushLogFailed(RuntimeException failure);
+
+    void updateMutableConfig(ConfiguredObject<?> object);
+
+    int cleanLog();
+
+    void checkpoint(final boolean force);
+
+    Map<String,Map<String,Object>> getEnvironmentStatistics(boolean reset);
+
+    Map<String, Object> getTransactionStatistics(boolean reset);
+
+    Map<String,Object> getDatabaseStatistics(String database, boolean reset);
 }

Added: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java?rev=1726176&view=auto
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java
 (added)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java
 Fri Jan 22 11:21:10 2016
@@ -0,0 +1,213 @@
+/*
+ *
+ * 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.qpid.server.store.berkeleydb;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import com.sleepycat.je.BtreeStats;
+import com.sleepycat.je.Database;
+import com.sleepycat.je.DatabaseConfig;
+import com.sleepycat.je.DatabaseStats;
+import com.sleepycat.je.DbInternal;
+import com.sleepycat.je.Environment;
+import com.sleepycat.je.EnvironmentMutableConfig;
+import com.sleepycat.je.EnvironmentStats;
+import com.sleepycat.je.StatsConfig;
+import com.sleepycat.je.TransactionStats;
+import com.sleepycat.je.config.ConfigParam;
+import com.sleepycat.je.config.EnvironmentParams;
+import com.sleepycat.je.utilint.IntegralLongAvg;
+import com.sleepycat.je.utilint.Stat;
+import com.sleepycat.je.utilint.StatDefinition;
+import com.sleepycat.je.utilint.StatGroup;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.qpid.server.model.ConfiguredObject;
+
+
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_BINS_BYLEVEL;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_BIN_COUNT;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_DELETED_LN_COUNT;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.GROUP_NAME;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.GROUP_DESC;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_INS_BYLEVEL;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_IN_COUNT;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_LN_COUNT;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_MAINTREE_MAXDEPTH;
+import static 
com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_RELATCHES_REQUIRED;
+import static com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_ROOT_SPLITS;
+import static 
com.sleepycat.je.dbi.BTreeStatDefinition.BTREE_BIN_ENTRIES_HISTOGRAM;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_ABORTS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_ACTIVE;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_ACTIVE_TXNS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_BEGINS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_COMMITS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_XAABORTS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_XACOMMITS;
+import static com.sleepycat.je.dbi.TxnStatDefinition.TXN_XAPREPARES;
+
+
+final public class EnvironmentUtils
+{
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(EnvironmentUtils.class);
+
+    private EnvironmentUtils()
+    {
+    }
+
+    public static Map<String,Object> getTransactionStatistics(Environment 
environment, boolean reset)
+    {
+        StatsConfig config = new StatsConfig();
+        config.setClear(reset);
+        config.setFast(false);
+        final TransactionStats stats = environment.getTransactionStats(config);
+        Map<String,Object> results = new LinkedHashMap<>();
+
+        results.put(TXN_ACTIVE.getName(), stats.getNActive());
+        results.put(TXN_BEGINS.getName(), stats.getNBegins());
+        results.put(TXN_COMMITS.getName(), stats.getNCommits());
+        results.put(TXN_ABORTS.getName(), stats.getNAborts());
+        results.put(TXN_XAPREPARES.getName(), stats.getNXAPrepares());
+        results.put(TXN_XACOMMITS.getName(), stats.getNXACommits());
+        results.put(TXN_XAABORTS.getName(), stats.getNXAAborts());
+
+        return results;
+    }
+
+
+    public static Map<String,Map<String,Object>> 
getEnvironmentStatistics(Environment environment, boolean reset)
+    {
+        StatsConfig config = new StatsConfig();
+        config.setClear(reset);
+        config.setFast(false);
+        EnvironmentStats stats = environment.getStats(config);
+        Collection<StatGroup> statGroups = stats.getStatGroups();
+        return getStatsFromStatGroup(statGroups);
+    }
+
+    public static Map<String,Object> getDatabaseStatistics(Environment 
environment, String database, boolean reset)
+    {
+        DatabaseConfig dbConfig = new DatabaseConfig();
+        dbConfig.setReadOnly(true);
+        DbInternal.setUseExistingConfig(dbConfig, true);
+        try (Database db = environment.openDatabase(null, database, dbConfig))
+        {
+            StatsConfig config = new StatsConfig();
+            config.setClear(reset);
+            config.setFast(false);
+
+            BtreeStats stats = (BtreeStats) db.getStats(config);
+
+            Map<String, Object> results = new TreeMap<>();
+            results.put(BTREE_BIN_COUNT.getName(), 
stats.getBottomInternalNodeCount());
+            results.put(BTREE_DELETED_LN_COUNT.getName(), 
stats.getDeletedLeafNodeCount());
+            results.put(BTREE_IN_COUNT.getName(), 
stats.getInternalNodeCount());
+            results.put(BTREE_LN_COUNT.getName(), stats.getLeafNodeCount());
+            results.put(BTREE_MAINTREE_MAXDEPTH.getName(), 
stats.getMainTreeMaxDepth());
+            results.put(BTREE_INS_BYLEVEL.getName(), 
Arrays.asList(stats.getINsByLevel()));
+            results.put(BTREE_BINS_BYLEVEL.getName(), 
Arrays.asList(stats.getBINsByLevel()));
+            results.put(BTREE_BIN_ENTRIES_HISTOGRAM.getName(), 
Arrays.asList(stats.getBINEntriesHistogram()));
+            results.put(BTREE_RELATCHES_REQUIRED.getName(), 
stats.getRelatches());
+            results.put(BTREE_ROOT_SPLITS.getName(), stats.getRootSplits());
+
+            return results;
+        }
+
+    }
+
+    private static Map<String, Map<String, Object>> 
getStatsFromStatGroup(final Collection<StatGroup> statGroups)
+    {
+        Map<String,Map<String,Object>> results = new LinkedHashMap<>();
+        for(StatGroup group : statGroups)
+        {
+            Map<String,Object> groupResults = new TreeMap<>();
+            for(Map.Entry<StatDefinition, Stat<?>> entry : 
group.getStats().entrySet())
+            {
+                if(!entry.getValue().isNotSet())
+                {
+                    Object value = entry.getValue().get();
+                    if(value instanceof IntegralLongAvg)
+                    {
+                        value = ((Number) value).doubleValue();
+                    }
+                    groupResults.put(entry.getKey().getName(), value);
+
+                }
+            }
+            if(!groupResults.isEmpty())
+            {
+                results.put(group.getName(), groupResults);
+            }
+        }
+        return results;
+    }
+
+    public static void updateMutableConfig(Environment environment, 
Set<String> paramsSetByDefault, boolean includeHA, final ConfiguredObject<?> 
object)
+    {
+        EnvironmentMutableConfig mutableConfig = 
environment.getMutableConfig();
+
+        final Set<String> contextVariables = object.getContextKeys(false);
+
+        for(Map.Entry<String, ConfigParam> entry : 
EnvironmentParams.SUPPORTED_PARAMS.entrySet())
+        {
+            String paramName = entry.getKey();
+            ConfigParam param = entry.getValue();
+
+            if(param.isMutable() && (includeHA || !param.isForReplication()))
+            {
+                boolean contextValueSet = contextVariables.contains(paramName);
+                boolean currentlySetInEnv = 
mutableConfig.isConfigParamSet(paramName);
+                String contextValue = contextValueSet ? 
object.getContextValue(String.class, paramName) : null;
+                contextValueSet = (contextValue != null);
+
+                try
+                {
+                    if(contextValueSet)
+                    {
+                        if(!currentlySetInEnv || 
!contextValue.equals(mutableConfig.getConfigParam(paramName)))
+                        {
+                            mutableConfig.setConfigParam(paramName, 
contextValue);
+                            LOGGER.debug("Setting BDB configuration parameter 
'%1' to value '%2'.", param, contextValue);
+                        }
+                    }
+                    else if(currentlySetInEnv && 
!paramsSetByDefault.contains(paramName))
+                    {
+                        mutableConfig.setConfigParam(paramName, 
param.getDefault());
+                        LOGGER.debug("Setting BDB configuration parameter '%1' 
to its default value.", param);
+                    }
+                }
+                catch (IllegalArgumentException e)
+                {
+                    LOGGER.warn("Unable to set BDB configuration parameter 
'%1' to value '%2'.", param, contextValue, e);
+                }
+
+            }
+        }
+    }
+
+}

Propchange: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacade.java
 Fri Jan 22 11:21:10 2016
@@ -21,14 +21,19 @@
 package org.apache.qpid.server.store.berkeleydb;
 
 import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicReference;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.sleepycat.je.CacheMode;
+import com.sleepycat.je.CheckpointConfig;
 import com.sleepycat.je.Database;
 import com.sleepycat.je.DatabaseConfig;
 import com.sleepycat.je.DatabaseEntry;
@@ -42,6 +47,7 @@ import com.sleepycat.je.Transaction;
 import com.sleepycat.je.TransactionConfig;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,6 +67,20 @@ public class StandardEnvironmentFacade i
     private final Committer _committer;
     private final File _environmentPath;
 
+    private static final Set<String> PARAMS_SET_BY_DEFAULT;
+
+    static
+    {
+        Set<String> excludes = new HashSet<>(ENVCONFIG_DEFAULTS.keySet());
+        excludes.addAll(Arrays.asList(EnvironmentConfig.FILE_LOGGING_LEVEL,
+                                      EnvironmentConfig.CONSOLE_LOGGING_LEVEL,
+                                      EnvironmentConfig.MAX_MEMORY,
+                                      EnvironmentConfig.MAX_MEMORY_PERCENT
+                                      ));
+        PARAMS_SET_BY_DEFAULT = Collections.unmodifiableSet(excludes);
+    }
+
+
     public StandardEnvironmentFacade(StandardEnvironmentConfiguration 
configuration)
     {
         _storePath = configuration.getStorePath();
@@ -240,6 +260,45 @@ public class StandardEnvironmentFacade i
         }
     }
 
+    @Override
+    public void updateMutableConfig(final ConfiguredObject<?> object)
+    {
+        EnvironmentUtils.updateMutableConfig(getEnvironment(), 
PARAMS_SET_BY_DEFAULT, false, object);
+    }
+
+    @Override
+    public int cleanLog()
+    {
+        return getEnvironment().cleanLog();
+    }
+
+    @Override
+    public void checkpoint(final boolean force)
+    {
+        CheckpointConfig ckptConfig = new CheckpointConfig();
+        ckptConfig.setForce(force);
+        getEnvironment().checkpoint(ckptConfig);
+    }
+
+    @Override
+    public Map<String,Map<String,Object>> getEnvironmentStatistics(boolean 
reset)
+    {
+        return EnvironmentUtils.getEnvironmentStatistics(getEnvironment(), 
reset);
+    }
+
+
+    @Override
+    public Map<String,Object> getDatabaseStatistics(String database, boolean 
reset)
+    {
+        return EnvironmentUtils.getDatabaseStatistics(getEnvironment(), 
database, reset);
+    }
+
+    @Override
+    public Map<String, Object> getTransactionStatistics(boolean reset)
+    {
+        return EnvironmentUtils.getTransactionStatistics(getEnvironment(), 
reset);
+    }
+
     private void closeSequences()
     {
         RuntimeException firstThrownException = null;

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 Fri Jan 22 11:21:10 2016
@@ -24,6 +24,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetSocketAddress;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -47,23 +48,9 @@ import java.util.concurrent.atomic.Atomi
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.sleepycat.je.CacheMode;
-import com.sleepycat.je.Database;
-import com.sleepycat.je.DatabaseConfig;
-import com.sleepycat.je.DatabaseEntry;
-import com.sleepycat.je.DatabaseException;
-import com.sleepycat.je.Durability;
+import com.sleepycat.je.*;
 import com.sleepycat.je.Durability.ReplicaAckPolicy;
 import com.sleepycat.je.Durability.SyncPolicy;
-import com.sleepycat.je.EnvironmentConfig;
-import com.sleepycat.je.EnvironmentFailureException;
-import com.sleepycat.je.EnvironmentMutableConfig;
-import com.sleepycat.je.ExceptionEvent;
-import com.sleepycat.je.LogWriteException;
-import com.sleepycat.je.Sequence;
-import com.sleepycat.je.SequenceConfig;
-import com.sleepycat.je.Transaction;
-import com.sleepycat.je.TransactionConfig;
 import com.sleepycat.je.rep.*;
 import com.sleepycat.je.rep.impl.node.NameIdPair;
 import com.sleepycat.je.rep.util.DbPing;
@@ -74,6 +61,7 @@ import com.sleepycat.je.rep.vlsn.VLSNRan
 import com.sleepycat.je.utilint.PropUtil;
 import com.sleepycat.je.utilint.VLSN;
 import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.store.berkeleydb.EnvironmentUtils;
 import org.apache.qpid.server.store.berkeleydb.upgrade.Upgrader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -180,6 +168,23 @@ public class ReplicatedEnvironmentFacade
         put(ReplicationConfig.CONSISTENCY_POLICY, 
NoConsistencyRequiredPolicy.NAME);
     }});
 
+    private static final Set<String> PARAMS_SET_BY_DEFAULT;
+
+    static
+    {
+        Set<String> excludes = new HashSet<>(ENVCONFIG_DEFAULTS.keySet());
+
+        excludes.addAll(REPCONFIG_DEFAULTS.keySet());
+
+        excludes.addAll(Arrays.asList(EnvironmentConfig.FILE_LOGGING_LEVEL,
+                                      EnvironmentConfig.CONSOLE_LOGGING_LEVEL,
+                                      EnvironmentConfig.MAX_MEMORY,
+                                      EnvironmentConfig.MAX_MEMORY_PERCENT
+                                     ));
+        PARAMS_SET_BY_DEFAULT = Collections.unmodifiableSet(excludes);
+    }
+
+
     public static final String PERMITTED_NODE_LIST = "permittedNodes";
 
     private final ReplicatedEnvironmentConfiguration _configuration;
@@ -681,7 +686,7 @@ public class ReplicatedEnvironmentFacade
     {
         LOGGER.debug("Submitting a job to set cache size on {} to {}", 
_prettyGroupNodeName, cacheSize);
 
-        Future<Void> future = _environmentJobExecutor.submit(new 
Callable<Void>()
+        Callable<Void> task = new Callable<Void>()
         {
             @Override
             public Void call()
@@ -689,11 +694,134 @@ public class ReplicatedEnvironmentFacade
                 setCacheSizeInternal(cacheSize);
                 return null;
             }
-        });
-        int timeout = 1;
+        };
+        submitEnvironmentTask(1, task, "setting cache size");
+    }
+
+    @Override
+    public void updateMutableConfig(final ConfiguredObject<?> object)
+    {
+        LOGGER.debug("Submitting a job to set update mutable config on {}", 
_prettyGroupNodeName);
+
+        Callable<Void> task = new Callable<Void>()
+        {
+            @Override
+            public Void call()
+            {
+                EnvironmentUtils.updateMutableConfig(getEnvironment(), 
PARAMS_SET_BY_DEFAULT, true, object);
+                return null;
+            }
+        };
+        submitEnvironmentTask(5, task, "updating mutable config");
+
+    }
+
+
+    @Override
+    public int cleanLog()
+    {
+        LOGGER.debug("Submitting a job to clean log files on {} ", 
_prettyGroupNodeName);
+        int timeout = 5;
+
+        Callable<Integer> task = new Callable<Integer>()
+        {
+            @Override
+            public Integer call()
+            {
+                return getEnvironment().cleanLog();
+            }
+        };
+
+
+        Integer fileCount = submitEnvironmentTask(timeout, task, "cleaning log 
files");
+        return fileCount == null ? 0 : fileCount;
+    }
+
+    @Override
+    public void checkpoint(final boolean force)
+    {
+        LOGGER.debug("Submitting a job to perform checkpoint on {} ", 
_prettyGroupNodeName);
+        int timeout = 5;
+
+        Callable<Void> task = new Callable<Void>()
+        {
+            @Override
+            public Void call()
+            {
+                CheckpointConfig checkpointConfig = new CheckpointConfig();
+                checkpointConfig.setForce(force);
+                getEnvironment().checkpoint(checkpointConfig);
+                return null;
+            }
+        };
+
+        submitEnvironmentTask(timeout, task, "perform checkpoint");
+    }
+
+    @Override
+    public Map<String, Map<String, Object>> getEnvironmentStatistics(final 
boolean reset)
+    {
+        LOGGER.debug("Submitting a job to get environment statistics on {} ", 
_prettyGroupNodeName);
+        int timeout = 5;
+
+        Callable<Map<String,Map<String,Object>>> task = new 
Callable<Map<String,Map<String,Object>>>()
+        {
+            @Override
+            public Map<String,Map<String,Object>> call()
+            {
+                return 
EnvironmentUtils.getEnvironmentStatistics(getEnvironment(), reset);
+
+            }
+        };
+
+        return submitEnvironmentTask(timeout, task, "get environment 
statistics");
+    }
+
+    @Override
+    public Map<String, Object> getTransactionStatistics(final boolean reset)
+    {
+        LOGGER.debug("Submitting a job to get transaction statistics on {} ", 
_prettyGroupNodeName);
+        int timeout = 5;
+
+        Callable<Map<String,Object>> task = new Callable<Map<String,Object>>()
+        {
+            @Override
+            public Map<String,Object> call()
+            {
+                return 
EnvironmentUtils.getTransactionStatistics(getEnvironment(), reset);
+            }
+        };
+
+        return submitEnvironmentTask(timeout, task, "get transaction 
statistics");
+    }
+
+    @Override
+    public Map<String,Object> getDatabaseStatistics(final String database, 
final boolean reset)
+    {
+        LOGGER.debug("Submitting a job to get database statistics for {} on {} 
", database, _prettyGroupNodeName);
+        int timeout = 5;
+
+        Callable<Map<String,Object>> task = new Callable<Map<String,Object>>()
+        {
+            @Override
+            public Map<String, Object> call()
+            {
+
+                return 
EnvironmentUtils.getDatabaseStatistics(getEnvironment(), database, reset);
+            }
+        };
+
+        return submitEnvironmentTask(timeout, task, "get database statistics 
for '" + database + "'");
+
+    }
+
+
+    private <T> T submitEnvironmentTask(final int timeout, final Callable<T> 
task, String action)
+    {
+        Future<T> future = _environmentJobExecutor.submit(task);
         try
         {
-            future.get(timeout, TimeUnit.SECONDS);
+            return future.get(timeout, TimeUnit.SECONDS);
         }
         catch (InterruptedException e)
         {
@@ -705,20 +833,25 @@ public class ReplicatedEnvironmentFacade
             if (cause instanceof Error)
             {
                 throw (Error) cause;
-            } else if (cause instanceof RuntimeException)
+            }
+            else if (cause instanceof RuntimeException)
             {
                 throw (RuntimeException) cause;
-            } else
+            }
+            else
             {
-                throw new ConnectionScopedRuntimeException("Unexpected 
exception while setting cache size", e);
+                throw new ConnectionScopedRuntimeException("Unexpected 
exception while " + action, e);
             }
         }
         catch (TimeoutException e)
         {
-            LOGGER.info("setting of cache size on {} timed out after {} 
seconds", _prettyGroupNodeName, timeout);
+            LOGGER.info("{}  on {} timed out after {} seconds", action, 
_prettyGroupNodeName, timeout);
         }
+
+        return null;
     }
 
+
     @Override
     public void flushLogFailed(final RuntimeException e)
     {

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHost.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHost.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHost.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHost.java
 Fri Jan 22 11:21:10 2016
@@ -26,7 +26,7 @@ import org.apache.qpid.server.model.Virt
 import org.apache.qpid.server.store.SizeMonitoringSettings;
 import org.apache.qpid.server.store.berkeleydb.BDBEnvironmentContainer;
 
-public interface BDBVirtualHost<X extends BDBVirtualHost<X>> extends 
VirtualHost<X>, org.apache.qpid.server.store.FileBasedSettings, 
SizeMonitoringSettings, BDBEnvironmentContainer
+public interface BDBVirtualHost<X extends BDBVirtualHost<X>> extends 
VirtualHost<X>, org.apache.qpid.server.store.FileBasedSettings, 
SizeMonitoringSettings, BDBEnvironmentContainer<X>
 {
 
     String STORE_PATH = "storePath";

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHostImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHostImpl.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHostImpl.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhost/berkeleydb/BDBVirtualHostImpl.java
 Fri Jan 22 11:21:10 2016
@@ -20,6 +20,7 @@
  */
 package org.apache.qpid.server.virtualhost.berkeleydb;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -30,6 +31,7 @@ import org.apache.qpid.server.store.Mess
 import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade;
 import org.apache.qpid.server.store.berkeleydb.BDBCacheSizeSetter;
+import 
org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
 import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
 
 @ManagedObject(category = false, type = BDBVirtualHostImpl.VIRTUAL_HOST_TYPE)
@@ -92,4 +94,96 @@ public class BDBVirtualHostImpl extends
             }
         }
     }
+
+    @Override
+    public void updateMutableConfig()
+    {
+        getSecurityManager().authoriseUpdate(this);
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                environmentFacade.updateMutableConfig(this);
+            }
+        }
+    }
+
+    @Override
+    public int cleanLog()
+    {
+        getSecurityManager().authoriseUpdate(this);
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.cleanLog();
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public void checkpoint(final boolean force)
+    {
+        getSecurityManager().authoriseUpdate(this);
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                environmentFacade.checkpoint(force);
+            }
+        }
+    }
+
+    @Override
+    public Map<String, Map<String, Object>> environmentStatistics(final 
boolean reset)
+    {
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getEnvironmentStatistics(reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
+
+
+    @Override
+    public Map<String, Object> transactionStatistics(final boolean reset)
+    {
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getTransactionStatistics(reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public Map<String, Object> databaseStatistics(String database, final 
boolean reset)
+    {
+        BDBMessageStore bdbMessageStore = (BDBMessageStore) getMessageStore();
+        if (bdbMessageStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbMessageStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getDatabaseStatistics(database, 
reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
 }

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNode.java
 Fri Jan 22 11:21:10 2016
@@ -28,7 +28,7 @@ import org.apache.qpid.server.store.berk
 import org.apache.qpid.server.store.berkeleydb.BDBEnvironmentContainer;
 
 
-public interface BDBHAVirtualHostNode<X extends BDBHAVirtualHostNode<X>> 
extends BDBVirtualHostNode<X>, HASettings, BDBEnvironmentContainer
+public interface BDBHAVirtualHostNode<X extends BDBHAVirtualHostNode<X>> 
extends BDBVirtualHostNode<X>, HASettings
 {
     public static final String GROUP_NAME = "groupName";
     public static final String ADDRESS = "address";

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 Fri Jan 22 11:21:10 2016
@@ -73,6 +73,7 @@ import org.apache.qpid.server.model.Conf
 import org.apache.qpid.server.model.ManagedAttributeField;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
+import org.apache.qpid.server.model.Param;
 import org.apache.qpid.server.model.RemoteReplicationNode;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
@@ -1376,6 +1377,80 @@ public class BDBHAVirtualHostNodeImpl ex
         abstract void perform();
     }
 
+    @Override
+    public void updateMutableConfig()
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            environmentFacade.updateMutableConfig(this);
+        }
+    }
+
+    @Override
+    public int cleanLog()
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            return environmentFacade.cleanLog();
+        }
+        return 0;
+    }
+
+    @Override
+    public void checkpoint(final boolean force)
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            environmentFacade.checkpoint(force);
+        }
+    }
+
+    @Override
+    public Map<String, Map<String, Object>> environmentStatistics(final 
boolean reset)
+    {
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            return environmentFacade.getEnvironmentStatistics(reset);
+        }
+        else
+        {
+            return Collections.emptyMap();
+        }
+    }
+
+    @Override
+    public Map<String, Object> transactionStatistics(final boolean reset)
+    {
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            return environmentFacade.getTransactionStatistics(reset);
+        }
+        else
+        {
+            return Collections.emptyMap();
+        }
+    }
+    @Override
+    public Map<String, Object> databaseStatistics(String database, final 
boolean reset)
+    {
+        ReplicatedEnvironmentFacade environmentFacade = 
getReplicatedEnvironmentFacade();
+        if (environmentFacade != null)
+        {
+            return environmentFacade.getDatabaseStatistics(database, reset);
+        }
+        else
+        {
+            return Collections.emptyMap();
+        }
+    }
     public static Map<String, Collection<String>> getSupportedChildTypes()
     {
         return Collections.singletonMap(VirtualHost.class.getSimpleName(), 
(Collection<String>) 
Collections.singleton(BDBHAVirtualHostImpl.VIRTUAL_HOST_TYPE));

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNode.java
 Fri Jan 22 11:21:10 2016
@@ -23,7 +23,7 @@ package org.apache.qpid.server.virtualho
 import org.apache.qpid.server.model.ManagedAttribute;
 import org.apache.qpid.server.store.berkeleydb.BDBEnvironmentContainer;
 
-public interface BDBVirtualHostNode<X extends BDBVirtualHostNode<X>> extends 
org.apache.qpid.server.model.VirtualHostNode<X>, 
org.apache.qpid.server.store.FileBasedSettings, BDBEnvironmentContainer
+public interface BDBVirtualHostNode<X extends BDBVirtualHostNode<X>> extends 
org.apache.qpid.server.model.VirtualHostNode<X>, 
org.apache.qpid.server.store.FileBasedSettings, BDBEnvironmentContainer<X>
 {
     String STORE_PATH = "storePath";
 

Modified: 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java?rev=1726176&r1=1726175&r2=1726176&view=diff
==============================================================================
--- 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
 (original)
+++ 
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBVirtualHostNodeImpl.java
 Fri Jan 22 11:21:10 2016
@@ -32,6 +32,7 @@ import org.apache.qpid.server.model.Mana
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.berkeleydb.BDBConfigurationStore;
+import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
 import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade;
 import org.apache.qpid.server.store.berkeleydb.BDBCacheSizeSetter;
 import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
@@ -94,4 +95,95 @@ public class BDBVirtualHostNodeImpl exte
             }
         }
     }
+
+    @Override
+    public void updateMutableConfig()
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                environmentFacade.updateMutableConfig(this);
+            }
+        }
+    }
+
+    @Override
+    public int cleanLog()
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.cleanLog();
+            }
+        }
+        return 0;
+    }
+
+    @Override
+    public void checkpoint(final boolean force)
+    {
+        getSecurityManager().authoriseUpdate(getBroker());
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                environmentFacade.checkpoint(force);
+            }
+        }
+    }
+
+    @Override
+    public Map<String, Map<String, Object>> environmentStatistics(final 
boolean reset)
+    {
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getEnvironmentStatistics(reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public Map<String, Object> transactionStatistics(final boolean reset)
+    {
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getTransactionStatistics(reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public Map<String, Object> databaseStatistics(String database, final 
boolean reset)
+    {
+        BDBConfigurationStore bdbConfigurationStore = (BDBConfigurationStore) 
getConfigurationStore();
+        if (bdbConfigurationStore != null)
+        {
+            EnvironmentFacade environmentFacade = 
bdbConfigurationStore.getEnvironmentFacade();
+            if (environmentFacade != null)
+            {
+                return environmentFacade.getDatabaseStatistics(database, 
reset);
+            }
+        }
+        return Collections.emptyMap();
+    }
 }




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to