这个简单的JUnit测试总是失败(Hazelcast 3.9.1(:
测试类为:
public class TestHZ {
@Test
public void testEviction() {
Config config = new XmlConfigBuilder(getXml()).build();
config.setInstanceName("myTestInstance");
HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);
IMap<Integer, Integer> cache2 = hz.getMap("MyTest2");
cache2.put(123, 456);
assertNotNull(cache2.get(123)); // <--- ALWAYS OK: conf LRU and 6000 entries
IMap<Integer, Integer> cache = hz.getMap("MyTest");
cache.put(123, 456);
assertNotNull(cache.get(123)); // <--- ALWAYS ERROR: conf LRU and 200 entries
}
private InputStream getXml() {
System.out.println(MY_CONF_XML);
return new ByteArrayInputStream(MY_CONF_XML.getBytes());
}
以及具有此值的配置常量:
private static final String MY_CONF_XML =
"<hazelcast xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"rn" +
" xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.9.xsd"rn" +
" xmlns="http://www.hazelcast.com/schema/config">rn" +
"rn" +
" <map name="MyTest">rn" +
" <eviction-policy>LRU</eviction-policy>rn" +
" <max-size policy="PER_NODE">200</max-size>rn" +
" </map>rn" +
"rn" +
" <map name="MyTest2">rn" +
" <eviction-policy>LRU</eviction-policy>rn" +
" <max-size policy="PER_NODE">6000</max-size>rn" +
" </map>rn" +
"rn" +
"</hazelcast>rn" +
"";
当映射配置包含最大大小为 200 个条目时,我总是无法尝试保留第一个条目。
其他人有同样的错误吗?
为什么,当配置大小为 6000 时,它总是运行良好,而使用大小 200 进行配置总是出错?
我找到了问题的解释和测试的解决方案。
发生的情况是,Hazelcast将每张地图默认为271个部分。请参阅:为什么 hazelcast 的默认分区计数为 271,选择一个参数是什么?
对于低于 271 的地图大小,它将失败。
要测试 (JUnit(,那么最好将分区数设置为较小的数字。例如 11:
@Test
public void testEviction() {
// Only for tests
System.setProperty("hazelcast.partition.count", "11");
Config config = new XmlConfigBuilder(getXml()).build();
然后测试已经正常工作。
这里提到的 Github 问题已在 3.10 中得到解决,但它们似乎与您正在做的事情无关。对于 1 个成员集群,将max_size设置为低于分区计数预计不起作用 - 不允许放置操作,原因 - 1 个成员将托管所有 271 个分区。当您启动另一个节点并且分区被分发时,您可以设置较低的max_size。
从 3.10 开始,如果max_size设置为低于分区计数,则现在允许在具有单个成员的集群中每个分区最多执行一次放置操作。
因此,要解决此问题 - 要么更改max_size配置或减少分区计数,要么再添加一个成员并使其成为集群。