True, the ExecutorCompletionService queue is unbounded, but the persistence executor also has a bounded input queue, so the number of tasks in flight at any time is already limited. If you keep polling the completion service just like you poll the bucket ids queue now, I don't see how its queue size could be a problem.