package org.rhq.cassandra.schema; import java.util.concurrent.atomic.AtomicInteger; import com.datastax.driver.core.Query; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.ResultSetFuture; import com.google.common.util.concurrent.FutureFallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import org.rhq.cassandra.schema.migration.QueryExecutor; /** * @author John Sanda */ public class RetryWrite implements FutureFallback<ResultSet> { private QueryExecutor queryExecutor; private Query query; private RateMonitor rateMonitor; private AtomicInteger writeErrors; private ListeningExecutorService threadPool; public RetryWrite(QueryExecutor queryExecutor, Query query, RateMonitor rateMonitor, AtomicInteger writeErrors, ListeningExecutorService threadPool) { this.queryExecutor = queryExecutor; this.query = query; this.rateMonitor = rateMonitor; this.writeErrors = writeErrors; this.threadPool = threadPool; } @Override public ListenableFuture<ResultSet> create(Throwable t) throws Exception { rateMonitor.requestFailed(); writeErrors.incrementAndGet(); ResultSetFuture future = queryExecutor.executeWrite(query); return Futures.withFallback(future, this, threadPool); } }