Merge pull request #3692 from mposolda/l1-bug
RHSSO-377 Added reproducer unit test L1SerializationIssueTest
This commit is contained in:
commit
bf58511d81
1 changed files with 162 additions and 0 deletions
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Red Hat, Inc. and/or its affiliates
|
||||||
|
* and other contributors as indicated by the @author tags.
|
||||||
|
*
|
||||||
|
* Licensed 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.keycloak.models.sessions.infinispan.initializer;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import org.infinispan.Cache;
|
||||||
|
import org.infinispan.configuration.cache.CacheMode;
|
||||||
|
import org.infinispan.configuration.cache.ClusteringConfigurationBuilder;
|
||||||
|
import org.infinispan.configuration.cache.Configuration;
|
||||||
|
import org.infinispan.configuration.cache.ConfigurationBuilder;
|
||||||
|
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
|
||||||
|
import org.infinispan.manager.DefaultCacheManager;
|
||||||
|
import org.infinispan.manager.EmbeddedCacheManager;
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
import org.junit.Ignore;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reproducer for RHSSO-377 / ISPN-6806
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
|
||||||
|
*/
|
||||||
|
@Ignore
|
||||||
|
public class L1SerializationIssueTest {
|
||||||
|
|
||||||
|
protected static final Logger logger = Logger.getLogger(L1SerializationIssueTest.class);
|
||||||
|
|
||||||
|
// Conf
|
||||||
|
private static final boolean L1_ENABLED = true; // Workaround 1 : If it's disabled, the exception won't happen
|
||||||
|
private static final int L1_LIFESPAN_MS = 6000;
|
||||||
|
private static final int L1_CLEANER_MS = 60000; // Seems that this value doesn't matter to anything...
|
||||||
|
private static final int NUM_OWNERS = 1; // Workaround 2 : If it's 2, the exception won't happen
|
||||||
|
|
||||||
|
private static final int TIME_BEFORE_RESTORE_NODE = 5000; // Workaroud 3 : If it's bigger than L1_LIFESPAN_MS, the exception won't happen
|
||||||
|
private static final int ITEMS_COUNT = 1000;
|
||||||
|
|
||||||
|
private static final String CACHE_NAME = "my-dist";
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testL1Bug() throws Exception {
|
||||||
|
EmbeddedCacheManager node1 = null;
|
||||||
|
EmbeddedCacheManager node2 = null;
|
||||||
|
EmbeddedCacheManager node3 = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
node1 = createManager();
|
||||||
|
Cache<String, Object> node1Cache = node1.getCache(CACHE_NAME);
|
||||||
|
logger.info("Node1Cache started");
|
||||||
|
|
||||||
|
node2 = createManager();
|
||||||
|
Cache<String, Object> node2Cache = node2.getCache(CACHE_NAME);
|
||||||
|
logger.info("Node2Cache started");
|
||||||
|
|
||||||
|
node3 = createManager();
|
||||||
|
Cache<String, Object> node3Cache = node3.getCache(CACHE_NAME);
|
||||||
|
logger.info("Node3Cache started");
|
||||||
|
|
||||||
|
// Put some items on node1
|
||||||
|
writeItems(node1Cache);
|
||||||
|
|
||||||
|
// Get all items on node2. This will save them to L1 cache on node2
|
||||||
|
readItems(node2Cache);
|
||||||
|
|
||||||
|
// See the great performance with L1 enabled as everything read from L1 cache and there are no remote calls at all
|
||||||
|
//readItems(node2Cache);
|
||||||
|
|
||||||
|
// Write and see worse performance with L1 enabled as every write needs to invalidate L1 cache on node2 too
|
||||||
|
//writeItems(node1Cache);
|
||||||
|
|
||||||
|
// Kill node3
|
||||||
|
node3.stop();
|
||||||
|
|
||||||
|
// Wait
|
||||||
|
logger.infof("Stopped node3. Will wait %d milliseconds", TIME_BEFORE_RESTORE_NODE);
|
||||||
|
Thread.sleep(TIME_BEFORE_RESTORE_NODE);
|
||||||
|
|
||||||
|
// Start node3 again
|
||||||
|
logger.info("Going to start node3 again");
|
||||||
|
|
||||||
|
node3 = createManager();
|
||||||
|
node3Cache = node3.getCache(CACHE_NAME);
|
||||||
|
logger.info("Node3Cache started again");
|
||||||
|
|
||||||
|
logger.info("Test finished successfuly");
|
||||||
|
} finally {
|
||||||
|
if (node1 != null) node1.stop();
|
||||||
|
if (node2 != null) node2.stop();
|
||||||
|
if (node3 != null) node3.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void writeItems(Cache<String, Object> cache) {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
for (int i=0 ; i < ITEMS_COUNT ; i++) {
|
||||||
|
String key = "key-" + i;
|
||||||
|
cache.put(key, new MySerializable());
|
||||||
|
}
|
||||||
|
logger.infof("Write %d items in %d ms", ITEMS_COUNT, System.currentTimeMillis() - start);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void readItems(Cache<String, Object> cache) {
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
for (int i=0 ; i < ITEMS_COUNT ; i++) {
|
||||||
|
String key = "key-" + i;
|
||||||
|
cache.get(key);
|
||||||
|
}
|
||||||
|
logger.infof("Read %d items in %d ms", ITEMS_COUNT, System.currentTimeMillis() - start);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private EmbeddedCacheManager createManager() {
|
||||||
|
System.setProperty("java.net.preferIPv4Stack", "true");
|
||||||
|
System.setProperty("jgroups.tcp.port", "53715");
|
||||||
|
GlobalConfigurationBuilder gcb = new GlobalConfigurationBuilder();
|
||||||
|
|
||||||
|
gcb = gcb.clusteredDefault();
|
||||||
|
gcb.transport().clusterName("test-clustering");
|
||||||
|
|
||||||
|
gcb.globalJmxStatistics().allowDuplicateDomains(true);
|
||||||
|
|
||||||
|
EmbeddedCacheManager cacheManager = new DefaultCacheManager(gcb.build());
|
||||||
|
|
||||||
|
|
||||||
|
ConfigurationBuilder distConfigBuilder = new ConfigurationBuilder();
|
||||||
|
ClusteringConfigurationBuilder clusterConfBuilder = distConfigBuilder.clustering();
|
||||||
|
clusterConfBuilder.cacheMode(CacheMode.DIST_SYNC);
|
||||||
|
clusterConfBuilder.hash().numOwners(NUM_OWNERS);
|
||||||
|
clusterConfBuilder.l1().enabled(L1_ENABLED)
|
||||||
|
.lifespan(L1_LIFESPAN_MS)
|
||||||
|
.cleanupTaskFrequency(L1_CLEANER_MS);
|
||||||
|
|
||||||
|
Configuration distCacheConfiguration = distConfigBuilder.build();
|
||||||
|
|
||||||
|
cacheManager.defineConfiguration(CACHE_NAME, distCacheConfiguration);
|
||||||
|
return cacheManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class MySerializable implements Serializable {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue