Проблема с выселением Hazelcast первых записей и небольшого размера в конфигурации
Этот простой тест 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\"\r\n" +
" xsi:schemaLocation=\"http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.9.xsd\"\r\n" +
" xmlns=\"http://www.hazelcast.com/schema/config\">\r\n" +
"\r\n" +
" <map name=\"MyTest\">\r\n" +
" <eviction-policy>LRU</eviction-policy>\r\n" +
" <max-size policy=\"PER_NODE\">200</max-size>\r\n" +
" </map>\r\n" +
"\r\n" +
" <map name=\"MyTest2\">\r\n" +
" <eviction-policy>LRU</eviction-policy>\r\n" +
" <max-size policy=\"PER_NODE\">6000</max-size>\r\n" +
" </map>\r\n" +
"\r\n" +
"</hazelcast>\r\n" +
"";
Я всегда не пытаюсь оставить первую запись, когда конфигурация карты содержит максимальный размер 200 записей.
У кого-то еще есть такая же ошибка?
Почему при настройке с размером 6000 он всегда идет хорошо, а при настройке с размером 200 всегда идет не так?
2 ответа
Упомянутая здесь проблема Github была решена в 3.10, но, похоже, они не связаны с тем, что вы делаете. Для кластера с 1 участником установка max_size ниже, чем число разделов, как ожидается, не будет работать - не разрешая операции put, причина - 1 член будет размещать все 271 разделы. Когда вы раскручиваете другой узел и разделы распределяются, вы можете установить более низкое значение max_size.
Начиная с 3.10, теперь вам разрешается максимум одна операция размещения на раздел в кластере с одним участником, если max_size установлено ниже, чем количество разделов.
Таким образом, чтобы решить эту проблему - либо измените конфигурацию max_size, либо уменьшите количество разделов, либо добавьте еще одного члена и сделайте его кластером.
Я нашел объяснение проблемы и решение для тестов.
Что происходит, так это то, что 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();
И тогда тест уже работает правильно.