Размер удаленного кэша GridGain всегда равен нулю

У меня есть конфигурация, в которой кеш хранится на одном узле, а доступ к нему осуществляется с другого. Хотя я могу получить () и положить () отлично, некоторые операции, такие как size (), keySet () и т. д., не возвращают мне правильные результаты.

Конфигурация кеша клиентского узла Test1

<bean id="test-cache" class="org.gridgain.grid.cache.GridCacheConfiguration">
    <property name="name" value="testCache"/>
     <property name="cacheMode" value="PARTITIONED"/>
    <property name="distributionMode" value="CLIENT_ONLY" />
    <property name="swapEnabled" value="true"/>

</bean>

Класс клиентского узла Test1

public class GridGainTest1
{
    public static void main(String[] args) throws Exception
    {
        //Client Mode
        Grid g = GridGain.start("etc/config/grid-test1.xml");
        //Put in Remote Cache
        g.cache("testCache").put(1, "ABC");
        g.cache("testCache").put(2, "XYZ");

        System.out.println("Size of Cache :- " + g.cache("testCache").size());
        System.out.println("Value for 1 :- " + g.cache("testCache").get(1));
        System.out.println("Value for 2 :- " + g.cache("testCache").get(2));
    }

Конфигурация кэша узла данных Test2

 <bean id="test-cache" class="org.gridgain.grid.cache.GridCacheConfiguration">
    <property name="name" value="testCache"/>
     <property name="cacheMode" value="PARTITIONED"/>
    <property name="swapEnabled" value="true"/>

</bean>

Класс узла данных Test2

    public class GridGainTest2
{
    public static void main(String[] args) throws Exception
    {
        Grid g = GridGain.start("etc/config/grid-test2.xml");
    }
}

Выход из узла 1 выглядит следующим образом, где размер принимает значение 0, даже если на карте есть записи. Я не уверен, что это связано с какой-то неправильной настройкой.

Size of Cache :- 0
Value for 1 :- ABC
Value for 2 :- XYZ

person GDS    schedule 18.06.2014    source источник


Ответы (1)


В GridGain cache API методы size(), primarySize(), nearSize(), keySet(), primaryKeySet(), values(), primaryValues(), entrySet(), primaryEntrySet() являются локальными, они будут возвращать размеры или коллекции только для ключей, хранящихся на локальном узле.

В вашем случае вы запустили кеш на Test1 в режиме CLIENT_ONLY, поэтому этот узел не хранит никаких ключей. Вот почему вы всегда видите 0 в качестве размера кеша.

Если вам нужен глобальный размер кеша, вы можете использовать следующий код:

    GridCallable<Integer> sizeCallable = new GridCallable<Integer>() {
        @Override public Integer call() throws Exception {
            return g.cache("testCache").size();
        }
    };

    Collection<Integer> sizes = g.forCache("testCache").compute()
        .broadcast(sizeCallable).get();

    int globalSize = 0;

    for (Integer s : sizes)
        globalSize += s;

Удобный метод GridCache.globalSize() будет добавлен в следующем выпуске GridGain 6.2.

person Alexey    schedule 18.06.2014
comment
ваше решение работает. Однако, когда я пытаюсь получить размер в локальном кеше вне кучи (cacheMode=LOCAL и memoryMode=OFFHEAP_TIERED), я получаю ту же проблему, когда я получаю значение, но не размер. Даже приведенный выше код не работает. Любые идеи ? - person GDS; 20.06.2014
comment
Метод size() возвращает количество записей в куче. Когда используется режим памяти OFFHEAP_TIERED, записи кэша сразу сохраняются вне кучи. Чтобы получить количество записей вне кучи в кеше, используйте GridCache.offheapEntriesCount() - person Alexey; 29.06.2014