Hi,

I don't think that it should hang because there are no cache operations allowed when the cluster isn't activated. It should be some kind of CacheExcdption.

Is it possible to prepare some reproducer or unit test? Otherwise please provide some details:

1)What Ignite version was used?
2)Can you please share a server and cache configuration?

BR,
Andrei
7/15/2020 9:57 PM, John Smith пишет:
Hi, testing some failover scenarios etc...

When we call cache.getAsync() and the state of the cluster is not active. It seems to block.

I implemented a cache repository as follows and using Vertx.io. It seems to block at the cacheOperation.apply(cache)

So when I call myRepo.get(myKey) which underneath applies the cache.getAsync() function it blocks.

public class IgniteCacheRepository<K,V> implements CacheRepository<K,V> {
     public final long DEFAULT_OPERATION_TIMEOUT =1000; private final 
TimeUnitDEFAULT_TIMEOUT_UNIT = TimeUnit.MILLISECONDS; private Vertxvertx; private 
IgniteCache<K, V> cache; public IgniteCacheRepository(Vertx vertx, IgniteCache<K, 
V> cache) {
         this.vertx = vertx; this.cache = cache; }

     @Override public Future<Void>put(K key, V value) {
         return executeAsync(cache -> cache.putAsync(key, value), 
DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT); }

     @Override public Future<V> get(K key) {
         return executeAsync(cache -> cache.getAsync(key), 
DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT); }

     @Override public <T> Future<T> invoke(K key, EntryProcessor<K, V, T> 
processor, Object... arguments) {
         return executeAsync(cache -> cache.invokeAsync(key, processor, 
arguments), DEFAULT_OPERATION_TIMEOUT, DEFAULT_TIMEOUT_UNIT); }

     @Override public <T> T cache() {
         return (T)cache; }

/** * Adapt Ignite async operation to vertx futures. * * @param cacheOperation The ignite operation to execute async. * @return The value from the cache operation. */ private <T> Future<T> executeAsync(Function<IgniteCache<K, V>, IgniteFuture<T>> cacheOperation, long timeout, TimeUnit unit) {
         Future<T> future = Future.future(); try {
             IgniteFuture<T> value = cacheOperation.apply(cache); 
value.listenAsync(result -> {
                 try {
                     future.complete(result.get(timeout, unit)); 
}catch(Exception ex) {
                     future.fail(ex); }
             }, 
VertxIgniteExecutorAdapter.getOrCreate(vertx.getOrCreateContext())); 
}catch(Exception ex) {
             // Catch some RuntimeException that can be thrown by Ignite cache. 
future.fail(ex); }

         return future; }
}




Reply via email to