/** * This implementation of initializeListener adds this instance of * ApplyTransformListener to the two RetryListener's in this QueryBatcher so * they will retry any batches that fail during the apply-transform request. */ @Override public void initializeListener(QueryBatcher queryBatcher) { HostAvailabilityListener hostAvailabilityListener = HostAvailabilityListener.getInstance(queryBatcher); if ( hostAvailabilityListener != null ) { BatchFailureListener<QueryBatch> retryListener = hostAvailabilityListener.initializeRetryListener(this); if( retryListener != null ) onFailure(retryListener); } }
protected boolean isHostUnavailableException(Throwable throwable, Set<Throwable> path) { for ( Class<?> type : hostUnavailableExceptions ) { if ( type.isInstance(throwable) ) { return true; } } // we need to check our recursion path to avoid infinite recursion if a // getCause() pointed to itself or an ancestor if ( throwable.getCause() != null && ! path.contains(throwable.getCause()) ) { path.add(throwable.getCause()); boolean isCauseHostUnavailableException = isHostUnavailableException(throwable.getCause(), path); if ( isCauseHostUnavailableException == true ) return true; } return false; }
private synchronized boolean processException(Batcher batcher, Throwable throwable, String host) { return (moveMgr.getConnectionType() == DatabaseClient.ConnectionType.GATEWAY) ? processGatewayException(batcher, throwable, host) : processForestHostException(batcher, throwable, host); }
HostAvailabilityListener ha = new HostAvailabilityListener(moveMgr) .withMinHosts(5); fail("should have thrown IllegalArgumentException since minHosts was " + "set to a number greater than the number of hosts in the cluster");
private QueryBatcher newQueryBatcher(QueryBatcherImpl batcher) { // add a default listener to handle host failover scenarios batcher.onQueryFailure(new HostAvailabilityListener(this)); QueryJobReportListener queryJobListener = new QueryJobReportListener(); batcher.onQueryFailure(queryJobListener); batcher.onQueryFailure(new NoResponseListener(this)); batcher.onUrisReady(queryJobListener); return batcher; }
/** * This implements the WriteFailureListener interface * * @param batch the batch of WriteEvents * @param throwable the exception */ public void processFailure(WriteBatch batch, Throwable throwable) { boolean isHostUnavailableException = processException(batch.getBatcher(), throwable, batch.getClient().getHost()); if ( isHostUnavailableException == true ) { try { logger.warn("Retrying failed batch: {}, results so far: {}, uris: {}", batch.getJobBatchNumber(), batch.getJobWritesSoFar(), Stream.of(batch.getItems()).map(event->event.getTargetUri()).collect(Collectors.toList())); batch.getBatcher().retryWithFailureListeners(batch); } catch (RuntimeException e) { logger.error("Exception during retry", e); processFailure(batch, e); } } }
private boolean processForestHostException(Batcher batcher, Throwable throwable, String host) { boolean isHostUnavailableException = isHostUnavailableException(throwable, new HashSet<>()); boolean shouldWeRetry = isHostUnavailableException; if ( isHostUnavailableException == true ) { scheduleForestResynch(batcher, host); } else {
@Override public WriteBatcher newWriteBatcher() { WriteBatcherImpl batcher = new WriteBatcherImpl(this, getForestConfig()); batcher.onBatchFailure(new HostAvailabilityListener(this)); WriteJobReportListener writeJobListener = new WriteJobReportListener(); batcher.onBatchFailure(writeJobListener); batcher.onBatchFailure(new NoResponseListener(this)); batcher.onBatchSuccess(writeJobListener); return batcher; }
/** * This implements the QueryFailureListener interface * * @param queryBatch the exception with information about the failed query attempt */ public void processFailure(QueryBatchException queryBatch) { boolean isHostUnavailableException = processException(queryBatch.getBatcher(), queryBatch, queryBatch.getClient().getHost()); if ( isHostUnavailableException == true ) { try { logger.warn("Retrying failed batch: {}, results so far: {}, forest: {}, forestBatch: {}, forest results so far: {}", queryBatch.getJobBatchNumber(), queryBatch.getJobResultsSoFar(), queryBatch.getForest().getForestName(), queryBatch.getForestBatchNumber(), queryBatch.getForestResultsSoFar()); queryBatch.getBatcher().retryWithFailureListeners(queryBatch); } catch (RuntimeException e) { logger.error("Exception during retry", e); processFailure(new QueryBatchException(queryBatch, e)); } } }
/** * This implementation of initializeListener adds this instance of * UrisToWriterListener to the two RetryListener's in this QueryBatcher so they * will retry any batches that fail during the uris request. */ @Override public void initializeListener(QueryBatcher queryBatcher) { HostAvailabilityListener hostAvailabilityListener = HostAvailabilityListener.getInstance(queryBatcher); if ( hostAvailabilityListener != null ) { BatchFailureListener<QueryBatch> retryListener = hostAvailabilityListener.initializeRetryListener(this); if ( retryListener != null ) onFailure(retryListener); } NoResponseListener noResponseListener = NoResponseListener.getInstance(queryBatcher); if ( noResponseListener != null ) { BatchFailureListener<QueryBatch> noResponseRetryListener = noResponseListener.initializeRetryListener(this); if ( noResponseRetryListener != null ) onFailure(noResponseRetryListener); } }
/** * This implementation of initializeListener adds this instance of * ExportToWriterListener to the two RetryListener's in this QueryBatcher so they * will retry any batches that fail during the read request. */ @Override public void initializeListener(QueryBatcher queryBatcher) { HostAvailabilityListener hostAvailabilityListener = HostAvailabilityListener.getInstance(queryBatcher); if ( hostAvailabilityListener != null ) { BatchFailureListener<QueryBatch> retryListener = hostAvailabilityListener.initializeRetryListener(this); if ( retryListener != null ) onFailure(retryListener); } NoResponseListener noResponseListener = NoResponseListener.getInstance(queryBatcher); if ( noResponseListener != null ) { BatchFailureListener<QueryBatch> noResponseRetryListener = noResponseListener.initializeRetryListener(this); if ( noResponseRetryListener != null ) onFailure(noResponseRetryListener); } }
/** * This implementation of initializeListener adds this instance of * ExportListener to the two RetryListener's in this QueryBatcher so they * will retry any batches that fail during the read request. */ @Override public void initializeListener(QueryBatcher queryBatcher) { HostAvailabilityListener hostAvailabilityListener = HostAvailabilityListener.getInstance(queryBatcher); if ( hostAvailabilityListener != null ) { BatchFailureListener<QueryBatch> retryListener = hostAvailabilityListener.initializeRetryListener(this); if ( retryListener != null ) onFailure(retryListener); } NoResponseListener noResponseListener = NoResponseListener.getInstance(queryBatcher); if ( noResponseListener != null ) { BatchFailureListener<QueryBatch> noResponseRetryListener = noResponseListener.initializeRetryListener(this); if ( noResponseRetryListener != null ) onFailure(noResponseRetryListener); } }
/** * This implementation of initializeListener adds this instance of * DeleteListener to the two RetryListener's in this QueryBatcher so they * will retry any batches that fail during the delete request. */ @Override public void initializeListener(QueryBatcher queryBatcher) { HostAvailabilityListener hostAvailabilityListener = HostAvailabilityListener.getInstance(queryBatcher); if ( hostAvailabilityListener != null ) { BatchFailureListener<QueryBatch> retryListener = hostAvailabilityListener.initializeRetryListener(this); if ( retryListener != null ) onFailure(retryListener); } NoResponseListener noResponseListener = NoResponseListener.getInstance(queryBatcher); if ( noResponseListener != null ) { BatchFailureListener<QueryBatch> noResponseRetryListener = noResponseListener.initializeRetryListener(this); if ( noResponseRetryListener != null ) onFailure(noResponseRetryListener); } }