Hello!

Event listener is invoked synchronously from internal threads. If partition
reset has to happen from the same thread, then obviously there will be a
deadlock.

Cache listeners have same property, i.e., you should avoid doing cache
operations from them.

This is tradeoff between performance and usability which was resolved in
favor of former.

Regards,
-- 
Ilya Kasnacheev


чт, 7 нояб. 2019 г. в 20:30, Prasad Bhalerao <[email protected]>:

> Do you mean to say, spawn a different thread from event listener and reset
> the lost partition in that thread?
>
> I tried this and it works.
>
> But wanted to understand the reason, why this call get blocked in event
> listener?
>
> Thanks,
> Prasad
>
> On Thu 7 Nov, 2019, 9:28 PM Ilya Kasnacheev <[email protected]
> wrote:
>
>> Hello!
>>
>> It is not advisable to call any blocking methods from event listeners.
>> Just fire resetLostPartitions from another thread.
>>
>> Regards,
>> --
>> Ilya Kasnacheev
>>
>>
>> чт, 7 нояб. 2019 г. в 15:17, Akash Shinde <[email protected]>:
>>
>>> Hi,
>>> I am trying to handle lost partition scenario.
>>> I have written event listener listening  to
>>> EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST event.
>>> I want to reset lost partition state of cache after cache loading  is
>>> done.
>>> *Issue:* ignite.resetLostPartitions(caheName) is getting blocked and
>>> not completing.
>>>
>>> Please find the code for Event Listener. Someone can help on this. *Why
>>> this resetLostPartitions getting blocked.*
>>>
>>> public class IgniteEventListner implements 
>>> IgnitePredicate<CacheRebalancingEvent> {
>>>    private static final Logger LOGGER = 
>>> LoggerFactory.getLogger(IgniteEventListner.class);
>>>
>>>   private final Ignite ignite;
>>>
>>>   public IgniteEventListner(Ignite ignite) {
>>>     this.ignite = ignite;
>>>   }
>>>
>>>   @Override
>>>   public boolean apply(CacheRebalancingEvent evt) {
>>>
>>>     IgniteCache<DefaultDataAffinityKey, AssetGroupData> cache = 
>>> ignite.getOrCreateCache(CacheName.ASSET_GROUP_CACHE.name());
>>>     Collection<Integer> lostPartitions = cache.lostPartitions();
>>>     reloadCache(lostPartitions); //perform partition based cache loading
>>>
>>>    * 
>>> ignite.resetLostPartitions(Arrays.asList(CacheName.ASSET_GROUP_CACHE.name()));
>>>   //Reset partitions*
>>>
>>>     System.out.println("Check-1, Partition lost event processed");
>>>
>>>     return true;
>>>   }
>>> }
>>>
>>> *Cache Configuration*
>>>
>>> private CacheConfiguration assetGroupCacheCfg() {
>>>     CacheConfiguration assetGroupCacheCfg = new 
>>> CacheConfiguration<>(CacheName.ASSET_GROUP_CACHE.name());
>>>     assetGroupCacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
>>>     assetGroupCacheCfg.setWriteThrough(false);
>>>     assetGroupCacheCfg.setReadThrough(false);
>>>     assetGroupCacheCfg.setRebalanceMode(CacheRebalanceMode.ASYNC);
>>>     assetGroupCacheCfg.setBackups(0);
>>>     assetGroupCacheCfg.setCacheMode(CacheMode.PARTITIONED);
>>>     assetGroupCacheCfg.setIndexedTypes(DefaultDataAffinityKey.class, 
>>> AssetGroupData.class);
>>>     assetGroupCacheCfg.setSqlIndexMaxInlineSize(100);
>>>     RendezvousAffinityFunction affinityFunction = new 
>>> RendezvousAffinityFunction();
>>>     assetGroupCacheCfg.setAffinity(affinityFunction);
>>>     assetGroupCacheCfg.setStatisticsEnabled(true);
>>>    
>>> assetGroupCacheCfg.setPartitionLossPolicy(PartitionLossPolicy.READ_WRITE_SAFE);
>>>     return assetGroupCacheCfg;
>>>   }
>>>
>>> *Ignite Configuration*
>>>
>>> private IgniteConfiguration getIgniteConfiguration() {
>>>
>>>   TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
>>>   String[] hosts = {"127.0.0.1:47500..47509"};
>>>   ipFinder.setAddresses(Arrays.asList(hosts));
>>>
>>>   TcpDiscoverySpi discoSpi = new TcpDiscoverySpi();
>>>   discoSpi.setIpFinder(ipFinder);
>>>
>>>   IgniteConfiguration cfg = new IgniteConfiguration();
>>>   cfg.setDiscoverySpi(discoSpi);
>>>   cfg.setIgniteInstanceName("springDataNode");
>>>   cfg.setPeerClassLoadingEnabled(false);
>>>   cfg.setRebalanceThreadPoolSize(4);
>>>   DataStorageConfiguration storageCfg = new DataStorageConfiguration();
>>>   DataRegionConfiguration regionConfiguration = new 
>>> DataRegionConfiguration();
>>>   regionConfiguration.setInitialSize(3L * 1024 * 1024 * 1024);
>>>   regionConfiguration.setMaxSize(3L * 1024 * 1024 * 1024);
>>>   regionConfiguration.setMetricsEnabled(true);
>>>
>>>   storageCfg.setDefaultDataRegionConfiguration(regionConfiguration);
>>>   storageCfg.setStoragePath("c:/ignite-storage/storage");
>>>   storageCfg.setWalPath("c:/ignite-storage/storage/wal");
>>>   storageCfg.setWalArchivePath("c:/ignite-storage/storage/wal-archive");
>>>   storageCfg.setMetricsEnabled(true);
>>>   cfg.setDataStorageConfiguration(storageCfg);
>>>   
>>> cfg.setIncludeEventTypes(EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST,EventType.EVT_NODE_FAILED);
>>>   cfg.setCacheConfiguration(getCacheConfigurations());
>>>   return cfg;
>>> }
>>>
>>>
>>> Thanks,
>>>
>>> Akash
>>>
>>>

Reply via email to