Author: orudyy
Date: Mon May 11 16:09:03 2015
New Revision: 1678772
URL: http://svn.apache.org/r1678772
Log:
QPID-6539: Fix ConcurrentModificationException sporadically thrown on creation
of StandardEnvironmentFacadeFactory
Added:
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
(original)
+++
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBUtils.java
Mon May 11 16:09:03 2015
@@ -19,12 +19,18 @@
package org.apache.qpid.server.store.berkeleydb;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
import com.sleepycat.je.CheckpointConfig;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.DatabaseConfig;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.Transaction;
+import org.apache.qpid.server.model.ConfiguredObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -109,4 +115,19 @@ public class BDBUtils
}
}
+
+ public static Map<String, String>
getContextSettingsWithNameMatchingRegExpPattern(ConfiguredObject<?> object,
Pattern pattern)
+ {
+ Map<String, String> targetMap = new HashMap<>();
+ for (String name : object.getContextKeys(false))
+ {
+ if (pattern.matcher(name).matches())
+ {
+ String contextValue =
object.getContextValue(String.class,name);
+ targetMap.put(name, contextValue);
+ }
+ }
+
+ return Collections.unmodifiableMap(targetMap);
+ }
}
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
(original)
+++
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/EnvironmentFacadeFactory.java
Mon May 11 16:09:03 2015
@@ -21,11 +21,14 @@
package org.apache.qpid.server.store.berkeleydb;
import java.util.Map;
+import java.util.regex.Pattern;
import org.apache.qpid.server.model.ConfiguredObject;
public interface EnvironmentFacadeFactory
{
+ Pattern NON_REP_JE_PARAM_PATTERN = Pattern.compile("^je\\.(?!rep\\.).*");
+
EnvironmentFacade createEnvironmentFacade(final ConfiguredObject<?>
parent);
}
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
(original)
+++
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactory.java
Mon May 11 16:09:03 2015
@@ -20,13 +20,7 @@
*/
package org.apache.qpid.server.store.berkeleydb;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
-
-import com.sleepycat.je.config.ConfigParam;
-import com.sleepycat.je.config.EnvironmentParams;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.store.FileBasedSettings;
@@ -57,26 +51,10 @@ public class StandardEnvironmentFacadeFa
@Override
public Map<String, String> getParameters()
{
- return buildEnvironmentConfiguration(parent);
+ return
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent,
NON_REP_JE_PARAM_PATTERN);
}
};
return new StandardEnvironmentFacade(sec);
}
-
- private Map<String, String>
buildEnvironmentConfiguration(ConfiguredObject<?> parent)
- {
- Map<String, String> envConfigMap = new HashMap<>();
-
- for (ConfigParam cp : EnvironmentParams.SUPPORTED_PARAMS.values())
- {
- final String parameterName = cp.getName();
- Set<String> contextKeys = parent.getContextKeys(false);
- if (!cp.isForReplication() && contextKeys.contains(parameterName))
- {
- envConfigMap.put(parameterName,
parent.getContextValue(String.class, parameterName));
- }
- }
- return Collections.unmodifiableMap(envConfigMap);
- }
}
Modified:
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java?rev=1678772&r1=1678771&r2=1678772&view=diff
==============================================================================
---
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
(original)
+++
qpid/java/trunk/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacadeFactory.java
Mon May 11 16:09:03 2015
@@ -20,19 +20,17 @@
*/
package org.apache.qpid.server.store.berkeleydb.replication;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.store.berkeleydb.BDBUtils;
import org.apache.qpid.server.store.berkeleydb.EnvironmentFacade;
import org.apache.qpid.server.store.berkeleydb.EnvironmentFacadeFactory;
import org.apache.qpid.server.store.berkeleydb.HASettings;
public class ReplicatedEnvironmentFacadeFactory implements
EnvironmentFacadeFactory
{
- public static final Pattern NON_REP_JE_PARAM_PATTERN =
Pattern.compile("^je\\.(?!rep\\.).*");
public static final Pattern REP_JE_PARAM_PATTERN =
Pattern.compile("^je\\.rep\\..*");
@Override
@@ -128,28 +126,13 @@ public class ReplicatedEnvironmentFacade
private Map<String, String>
buildEnvironmentConfigParameters(ConfiguredObject<?> parent)
{
- return buildConfig(parent, NON_REP_JE_PARAM_PATTERN);
+ return
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent,
NON_REP_JE_PARAM_PATTERN);
}
private Map<String, String>
buildReplicationConfigParameters(ConfiguredObject<?> parent)
{
- return buildConfig(parent, REP_JE_PARAM_PATTERN);
- }
-
- private Map<String, String> buildConfig(ConfiguredObject<?> parent,
Pattern paramName)
- {
- Map<String, String> targetMap = new HashMap<>();
- for (String name : parent.getContextKeys(false))
- {
- if (paramName.matcher(name).matches())
- {
- String contextValue =
parent.getContextValue(String.class,name);
- targetMap.put(name, contextValue);
- }
- }
-
- return Collections.unmodifiableMap(targetMap);
+ return
BDBUtils.getContextSettingsWithNameMatchingRegExpPattern(parent,
REP_JE_PARAM_PATTERN);
}
Added:
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java?rev=1678772&view=auto
==============================================================================
---
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
(added)
+++
qpid/java/trunk/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/StandardEnvironmentFacadeFactoryTest.java
Mon May 11 16:09:03 2015
@@ -0,0 +1,112 @@
+/*
+ *
+ * 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 static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+
+import java.io.File;
+import java.util.HashMap;
+
+
+import com.sleepycat.je.Environment;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.store.FileBasedSettings;
+import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.test.utils.TestFileUtils;
+import org.apache.qpid.util.FileUtils;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class StandardEnvironmentFacadeFactoryTest extends QpidTestCase
+{
+ private HashMap<String, String> _jeProperties;
+ private File _path;
+ private ConfiguredObject<?> _parent;
+
+ @Override
+ public void setUp()throws Exception
+ {
+ super.setUp();
+ _jeProperties= new HashMap<>();
+ _jeProperties.put("je.log.memOnly", "true");
+ _jeProperties.put("je.maxMemoryPercent", "5");
+ _path = TestFileUtils.createTestDirectory(".je.test", true);
+
+ // make mock object implementing FileBasedSettings
+ _parent = mock(ConfiguredObject.class,
withSettings().extraInterfaces(FileBasedSettings.class).defaultAnswer(new
Answer()
+ {
+ public Object answer(InvocationOnMock invocation)
+ {
+ if (invocation.getMethod().getName().equals("getStorePath"))
+ {
+ return _path.getAbsolutePath();
+ }
+ return null;
+ }
+ }));
+
+ }
+ @Override
+ public void tearDown()throws Exception
+ {
+ try
+ {
+ EnvHomeRegistry.getInstance().deregisterHome(_path);
+ FileUtils.delete(_path, true);
+ }
+ finally
+ {
+ super.tearDown();
+ }
+ }
+
+ public void testCreateEnvironmentFacade()
+ {
+ when(_parent.getName()).thenReturn(getTestName());
+
when(_parent.getContextKeys(any(boolean.class))).thenReturn(_jeProperties.keySet());
+ for (String key : _jeProperties.keySet())
+ {
+ when(_parent.getContextValue(String.class,
key)).thenReturn(_jeProperties.get(key));
+ }
+
+ StandardEnvironmentFacadeFactory factory = new
StandardEnvironmentFacadeFactory();
+ EnvironmentFacade facade = factory.createEnvironmentFacade(_parent);
+ try
+ {
+ assertNotNull("Facade should not be null", facade);
+ Environment environment = facade.getEnvironment();
+ for (String key : _jeProperties.keySet())
+ {
+ when(_parent.getContextValue(String.class,
key)).thenReturn(_jeProperties.get(key));
+ assertEquals("Unexpected environment setting",
_jeProperties.get(key), environment.getConfig().getConfigParam(key));
+ }
+ }
+ finally
+ {
+ facade.getEnvironment().close();
+ }
+ }
+
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]