Проблема с выселением Hazelcast первых записей и небольшого размера в конфигурации - PullRequest
0 голосов
/ 03 октября 2018

Этот простой тест 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 ]

0 голосов
/ 12 октября 2018

Проблема Github, упомянутая здесь, была рассмотрена в 3.10, но, похоже, они не связаны с тем, что вы делаете.Для кластера с 1 участником установка max_size ниже, чем число разделов, как ожидается, не будет работать - не разрешая операции put, причина - 1 член будет размещать все 271 раздел.Когда вы раскручиваете другой узел и разделы распределяются, вы можете установить меньшее значение max_size .

Начиная с 3.10, вам разрешено использовать не более одной операции размещения на раздел в кластере с одним участником, если max_size установлено ниже, чем количество разделов.

Итак, чтобы решить эту проблемупроблема - либо измените конфигурацию max_size, либо уменьшите количество разделов, либо добавьте еще одного члена и сделайте его кластером.

0 голосов
/ 03 октября 2018

Я нашел объяснение проблемы и решение для тестов.

В результате 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();

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

...