[concurrency-interest] Composing multiple tasks into a single Future/FutureTask

Ariel Weisberg ariel at weisberg.ws
Tue Apr 17 11:39:56 EDT 2012


Hi all,

I have been looking for the right way to build an API that returns a
Future that is composed of tasks that will be performed in multiple
stages, potentially from more than one thread.

My use cases is a disk based persistence store. The initial put API
call creates a task that compresses and checksums the payload. The
resulting Future is bound in a Runnable and submitted to a single
thread ExecutorService that timestamps the entry and appends it to a
file and it is the Future of the second task that is currently returned
by the API.

 The trick is that the Future that is returned by the put call should
 not complete until the write is durable. Writes are made durable by
 periodically invoking fsync from a dedicated thread or by rotating
 write threads as each blocks on fsync/force. This allows for group
 commit at an interval the IO device can handle without killing
 throughput.

Ideally I could create a FutureTask that is composed of several other
Futures, some of which will not exist when the FutureTask is initially
created and returned by the API. I do know how many dependencies there
will be
expected up front.

If I had such a thing I would create a task to do the fsync and add it
as the last dependency to every Future read by the put API call.

This would be a lot easier if I were willing to have many threads
standing around blocking on Futures, but that rubs me the wrong way. It
isn't fun to jstack and see all the noise.

I suspect that there is something in Guava
com.google.common.util.concurrent.Futures to handle this case, but it
isn't jumping out at me.

Thanks,
Ariel Weisberg


More information about the Concurrency-interest mailing list