1919import java .util .Collections ;
2020import java .util .Iterator ;
2121import java .util .concurrent .Callable ;
22+ import java .util .concurrent .CompletableFuture ;
23+ import java .util .concurrent .ExecutorService ;
2224import java .util .concurrent .TimeUnit ;
2325
2426import com .google .common .collect .ImmutableList ;
2527import com .google .common .collect .ImmutableList .Builder ;
26- import com .google .common .util .concurrent .AsyncFunction ;
27- import com .google .common .util .concurrent .Futures ;
28- import com .google .common .util .concurrent .ListenableFuture ;
29- import com .google .common .util .concurrent .ListeningExecutorService ;
30- import com .google .common .util .concurrent .MoreExecutors ;
3128import org .apache .accumulo .core .client .ConditionalWriter ;
3229import org .apache .accumulo .core .client .ConditionalWriter .Result ;
3330import org .apache .accumulo .core .data .ConditionalMutation ;
3633import org .apache .fluo .core .util .FluoExecutors ;
3734import org .apache .fluo .core .util .Limit ;
3835
39- public class AsyncConditionalWriter
40- implements AsyncFunction <Collection <ConditionalMutation >, Iterator <Result >> {
36+ public class AsyncConditionalWriter {
4137
4238 private final ConditionalWriter cw ;
43- private final ListeningExecutorService les ;
39+ private final ExecutorService es ;
4440 private final Limit semaphore ;
4541
4642
@@ -50,55 +46,38 @@ public AsyncConditionalWriter(Environment env, ConditionalWriter cw) {
5046 FluoConfigurationImpl .ASYNC_CW_THREADS_DEFAULT );
5147 int permits = env .getConfiguration ().getInt (FluoConfigurationImpl .ASYNC_CW_LIMIT ,
5248 FluoConfigurationImpl .ASYNC_CW_LIMIT_DEFAULT );
53- this .les =
54- MoreExecutors .listeningDecorator (FluoExecutors .newFixedThreadPool (numThreads , "asyncCW" ));
49+ this .es = FluoExecutors .newFixedThreadPool (numThreads , "asyncCw" );
5550 // the conditional writer currently has not memory limits... give it too much and it blows out
5651 // memory.. need to fix this in conditional writer
5752 // for now this needs to be memory based
5853 this .semaphore = new Limit (permits );
5954 }
6055
61- private class IterTask implements Callable <Iterator <Result >> {
62-
63- private Iterator <Result > input ;
64- private int permitsAcquired ;
65-
66- public IterTask (Iterator <Result > iter , int permitsAcquired ) {
67- this .input = iter ;
68- this .permitsAcquired = permitsAcquired ;
56+ public CompletableFuture <Iterator <Result >> apply (Collection <ConditionalMutation > input ) {
57+ if (input .size () == 0 ) {
58+ return CompletableFuture .completedFuture (Collections .<Result >emptyList ().iterator ());
6959 }
7060
71- @ Override
72- public Iterator <Result > call () throws Exception {
61+ semaphore .acquire (input .size ());
62+ Iterator <Result > iter = cw .write (input .iterator ());
63+ return CompletableFuture .supplyAsync (() -> {
7364 try {
7465 Builder <Result > imlb = ImmutableList .builder ();
75- while (input .hasNext ()) {
76- Result result = input .next ();
66+ while (iter .hasNext ()) {
67+ Result result = iter .next ();
7768 imlb .add (result );
7869 }
7970 return imlb .build ().iterator ();
8071 } finally {
81- semaphore .release (permitsAcquired );
72+ semaphore .release (input . size () );
8273 }
83- }
84-
85- }
86-
87- @ Override
88- public ListenableFuture <Iterator <Result >> apply (Collection <ConditionalMutation > input ) {
89- if (input .size () == 0 ) {
90- return Futures .immediateFuture (Collections .<Result >emptyList ().iterator ());
91- }
92-
93- semaphore .acquire (input .size ());
94- Iterator <Result > iter = cw .write (input .iterator ());
95- return les .submit (new IterTask (iter , input .size ()));
74+ }, es );
9675 }
9776
9877 public void close () {
99- les .shutdownNow ();
78+ es .shutdownNow ();
10079 try {
101- les .awaitTermination (5 , TimeUnit .SECONDS );
80+ es .awaitTermination (5 , TimeUnit .SECONDS );
10281 } catch (InterruptedException e ) {
10382 throw new RuntimeException (e );
10483 }
0 commit comments