Проблема с выселением 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();

И тогда тест уже работает правильно.

Другие вопросы по тегам