public static <D extends Data> CompletableFuture<DataList<D>> recursiveFuture(DataList<D> rootDataList) {
        List<CompletableFuture<DataList<D>>> futures = new ArrayList<>();
        collectCompletionFutures(rootDataList, futures);
        return new CompleteAllOnGetFuture<D>(futures);
    }
Returns a future in which the given data list and all lists nested within it are completed.
The only use of the returned future is to call a get() method on it to complete the given dataList and
all dataLists nested below it recursively.
<p>
Lists are completed in prefix, depth-first order. DataLists added after the point when this method is called
will not be completed.

@param rootDataList the list to complete recursively
@return the future in which all data in and below this list is complete, as the given root dataList for convenience
container-core/src/main/java/com/yahoo/processing/Response.java