Search code examples
springignite

IgniteException: NullPointerException


Im using Ignite Version 2.2 and I try to build a Cache using the following CacheConfiguration:

@Configuration
public class IgniteConfig {

    @Bean(name = Identifiers.STANDARD_IGNITE_ITEM)
    @Qualifier(Identifiers.STANDARD_IGNITE_ITEM)
    public CacheConfiguration<String, StandardItem> standardItemsCacheConfiguration() {
        return this.getItemsStandardCacheConfiguration();
    }

    private CacheConfiguration<String, StandardItem> getItemsStandardCacheConfiguration() {
        CacheConfiguration<String, StandardItem> config = new CacheConfiguration<>(Identifiers.STANDARD_IGNITE_ITEM_CACHE);

        config.setName(Identifiers.STANDARD_IGNITE_ITEM_CACHE);
        config.setIndexedTypes(String.class, StandardItem.class);
        config.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
        config.setCacheStoreFactory(FactoryBuilder.factoryOf(StandardItemCacheStore.class.getName()));
        config.setReadThrough(true);
        config.setWriteThrough(true);
        config.setCopyOnRead(false);
        config.setCacheMode(CacheMode.PARTITIONED);
        config.setOnheapCacheEnabled(true);

        return config;
    }
}

This is my CacheStoreAdapter:

public class StandardItemCacheStore extends CacheStoreAdapter<String, StandardItem> {
    private static final Logger logger = LoggerFactory.getLogger(StandardItemCacheStore.class.getName());

    @Override
    public void loadCache(IgniteBiInClosure<String, StandardItem> clo, Object... args) {
        super.loadCache(clo, args);

        logger.info("Load standard items into ingite cache");

        final AtomicInteger counter = new AtomicInteger();

        Flux<StandardItem> items = new StandardItemDAO().getAllItems();

        items.subscribe(item -> {
            if (item != null) {
                counter.incrementAndGet();

                logging.info("Load item into cache: " + item.toString());

                clo.apply(item.getItemId(), item);
            }
        });

        items.doOnComplete(() -> {
           logger.info("Loaded " + counter + " standard items into ignite cache");
        });
    }

    @Override
    public StandardItem load(String key) throws CacheLoaderException {
        return null;
    }

    @Override
    public void write(Cache.Entry<? extends String, ? extends StandardItem> entry) throws CacheWriterException {

    }

    @Override
    public void delete(Object key) throws CacheWriterException {

    }
}

Unfortunately im never able to build my cache since there are NullPointers which I dont understand where they are coming from. I load the cache like the following:

@Service
public class MyService {
    private static final Logger logger = LoggerFactory.getLogger(MyService.class.getName());

    private final IgniteCache<String, StandardItem> standardItemIgniteCache;

    public MyService(@Autowired @Qualifier(Identifiers.STANDARD_IGNITE_ITEM) CacheConfiguration<String, StandardItem> standardItemCacheConfiguration) {
        logger.info("Call service provider constructor");

        Ignite ignite = Ignition.getOrStart(new IgniteConfiguration());

        logger.info("Create standard items cache");

        this.standardItemIgniteCache = ignite.getOrCreateCache(standardItemCacheConfiguration);
        this.standardItemIgniteCache.loadCache(null);
    }
}

    // ....
}

When I start my service the loading of the cache starts (I see the logoutputs from the items in the loadCache function) but all of a sudden an Exception is thrown:

2017-11-28 21:23:36.462  INFO 6 --- [           main] i.s.p.p.d.cache.StandardItemCacheStore   : Loaded 35219 standard items into ignite cache
2017-11-28 21:23:36.510 ERROR 6 --- [           main] o.a.i.i.processors.task.GridTaskWorker   : Failed to obtain remote job result policy for result from ComputeTask.result(..) method (will fail the whole task): GridJobResultImpl [job=C2 [c=LoadCacheJobV2 [keepBinary=false]], sib=GridJobSiblingImpl [sesId=26703840061-6c03522c-008e-41f5-b144-a5a08d8c60d2, jobId=36703840061-6c03522c-008e-41f5-b144-a5a08d8c60d2, nodeId=048a70e3-8197-48e0-865f-213828842787, isJobDone=false], jobCtx=GridJobContextImpl [jobId=36703840061-6c03522c-008e-41f5-b144-a5a08d8c60d2, timeoutObj=null, attrs={}], node=TcpDiscoveryNode [id=048a70e3-8197-48e0-865f-213828842787, addrs=[127.0.0.1, 172.19.0.9], sockAddrs=[/127.0.0.1:47500, 7b9717decf77/172.19.0.9:47500], discPort=47500, order=4, intOrder=4, lastExchangeTime=1511904205042, loc=false, ver=2.2.0#20170915-sha1:5747ce6b, isClient=false], ex=class o.a.i.IgniteException: null, hasRes=true, isCancelled=false, isOccupied=true]

org.apache.ignite.IgniteException: Remote job threw user exception (override or implement ComputeTask.result(..) method if you would like to have automatic failover for this exception).
        at org.apache.ignite.compute.ComputeTaskAdapter.result(ComputeTaskAdapter.java:101) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskWorker$5.apply(GridTaskWorker.java:1027) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskWorker$5.apply(GridTaskWorker.java:1020) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6640) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskWorker.result(GridTaskWorker.java:1020) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskWorker.onResponse(GridTaskWorker.java:838) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskProcessor.processJobExecuteResponse(GridTaskProcessor.java:1066) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.task.GridTaskProcessor$JobMessageListener.onMessage(GridTaskProcessor.java:1301) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1556) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1184) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.access$4200(GridIoManager.java:126) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1097) [ignite-core-2.2.0.jar!/:2.2.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
Caused by: org.apache.ignite.IgniteException: null
        at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1850) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.job.GridJobWorker$2.call(GridJobWorker.java:566) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6608) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:560) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:489) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1115) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:1908) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1556) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1184) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager.access$4200(GridIoManager.java:126) [ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1097) [ignite-core-2.2.0.jar!/:2.2.0]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_111]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_111]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_111]
Caused by: java.lang.NullPointerException: null
        at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJob.localExecute(GridCacheAdapter.java:5456) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJobV2.localExecute(GridCacheAdapter.java:5505) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.cache.GridCacheAdapter$TopologyVersionAwareJob.execute(GridCacheAdapter.java:6120) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.compute.ComputeJobAdapter.call(ComputeJobAdapter.java:132) ~[ignite-core-2.2.0.jar!/:2.2.0]
        at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1847) ~[ignite-core-2.2.0.jar!/:2.2.0]
        ... 14 common frames omitted
2017-11-24 16:13:57.319  INFO 6 --- [           main] o.a.i.i.p.r.p.tcp.GridTcpRestProtocol    : Command protocol successfully stopped: TCP binary
2017-11-24 16:13:57.467  INFO 6 --- [           main] o.a.i.i.p.cache.GridCacheProcessor       : Stopped cache [cacheName=ignite-sys-cache]
2017-11-24 16:13:57.468  INFO 6 --- [           main] o.a.i.i.p.cache.GridCacheProcessor       : Stopped cache [cacheName=standard_item_cache]
2017-11-24 16:13:57.469  INFO 6 --- [           main] o.a.i.i.p.cache.GridCacheProcessor       : Stopped cache [cacheName=backend_cache]
[16:13:57] Ignite node stopped OK [uptime=00:00:04:404]
2017-11-24 16:13:57.513  INFO 6 --- [           main] org.apache.ignite.internal.IgniteKernal  :
>>> +---------------------------------------------------------------------------------+
>>> Ignite ver. 2.2.0#20170915-sha1:5747ce6b36f10b30d2142b9d90dad8e3049e8f74 stopped OK
>>> +---------------------------------------------------------------------------------+
>>> Grid uptime: 00:00:04:404

Why is this happening?


Solution

  • There is a combination of problems, that leads to such behaviour:

    1. Your loadCache method is asynchronous. So, when you call IgniteCache#loadCache(), then execution is not blocked, and it returns almost immediately.
    2. You start Ignite as a resource in a try block. So, when construction of MyService finishes, Ignite instance is closed. It means, that the whole node is destructed. This is why you see, that your caches are stopped.

    So, if you move Ignite creation out of the try block, the problem should go away.