public void run()

in evcache-core/src/main/java/com/netflix/evcache/operation/EVCacheLatchImpl.java [383:446]


    public void run() {
        if(evcacheEvent != null) {
            int failCount = 0, completeCount = 0;
            for (Future<Boolean> future : futures) {
                boolean fail = false;
                try {
                    if(future.isDone()) {
                        fail = future.get(0, TimeUnit.MILLISECONDS).equals(Boolean.FALSE);
                    } else {
                        long delayms = 0;
                        if(scheduledFuture != null) {
                            delayms = scheduledFuture.getDelay(TimeUnit.MILLISECONDS);
                        }
                        if(delayms < 0 ) delayms = 0;//making sure wait is not negative. It might be ok but as this is implementation dependent let us stick with 0
                        fail = future.get(delayms, TimeUnit.MILLISECONDS).equals(Boolean.FALSE);
                    }
                } catch (Exception e) {
                    fail = true;
                    if(log.isDebugEnabled()) log.debug(e.getMessage(), e);
                }

                if (fail) {
                    if(future instanceof EVCacheOperationFuture) {
                        final EVCacheOperationFuture<Boolean> evcFuture = (EVCacheOperationFuture<Boolean>)future;
                        final StatusCode code = evcFuture.getStatus().getStatusCode();
                        if(code != StatusCode.SUCCESS && code != StatusCode.ERR_NOT_FOUND && code != StatusCode.ERR_EXISTS) {
                            List<ServerGroup> listOfFailedServerGroups = (List<ServerGroup>) evcacheEvent.getAttribute("FailedServerGroups");
                            if(listOfFailedServerGroups == null) {
                                listOfFailedServerGroups = new ArrayList<ServerGroup>(failCount);
                                evcacheEvent.setAttribute("FailedServerGroups", listOfFailedServerGroups);
                            }
                            listOfFailedServerGroups.add(evcFuture.getServerGroup());
                            failCount++;
                        }
                    } else {
                        failCount++;
                    }
                } else {
                    completeCount++;
                }
            }
            if(log.isDebugEnabled()) log.debug("Fail Count : " + failCount);

            if(failCount > 0) {
                if(evcacheEvent.getClients().size() > 0) {
                    for(EVCacheClient client : evcacheEvent.getClients()) {
                        final List<EVCacheEventListener> evcacheEventListenerList = client.getPool().getEVCacheClientPoolManager().getEVCacheEventListeners();
                        if(log.isDebugEnabled()) log.debug("\nClient : " + client +"\nEvcacheEventListenerList : " + evcacheEventListenerList);
                        for (EVCacheEventListener evcacheEventListener : evcacheEventListenerList) {
                            evcacheEventListener.onError(evcacheEvent, null);
                        }
                        break;
                    }
                }
            }
            final List<Tag> tags = new ArrayList<Tag>(5);
            EVCacheMetricsFactory.getInstance().addAppNameTags(tags, appName);
            if(evcacheEvent != null) tags.add(new BasicTag(EVCacheMetricsFactory.CALL_TAG, evcacheEvent.getCall().name()));
            //tags.add(new BasicTag(EVCacheMetricsFactory.OPERATION, EVCacheMetricsFactory.VERIFY));
            tags.add(new BasicTag(EVCacheMetricsFactory.FAIL_COUNT, String.valueOf(failCount)));
            tags.add(new BasicTag(EVCacheMetricsFactory.COMPLETE_COUNT, String.valueOf(completeCount)));
            EVCacheMetricsFactory.getInstance().increment(EVCacheMetricsFactory.INTERNAL_LATCH_VERIFY, tags);
        }
    }