public IncomingBuffers(PlanFragment fragment, FragmentContext context) { this.context = context; Map<Integer, DataCollector> collectors = Maps.newHashMap(); remainingRequired = new AtomicInteger(fragment.getCollectorCount()); for(int i =0; i < fragment.getCollectorCount(); i++){ Collector collector = fragment.getCollector(i); DataCollector newCollector = collector.getSupportsOutOfOrder() ? new MergingCollector(remainingRequired, collector, context) : new PartitionedCollector(remainingRequired, collector, context); collectors.put(collector.getOppositeMajorFragmentId(), newCollector); } logger.debug("Came up with a list of {} required fragments. Fragments {}", remainingRequired.get(), collectors); collectorMap = ImmutableMap.copyOf(collectors); // Determine the total number of incoming streams that will need to be completed before we are finished. int totalStreams = 0; for (DataCollector bc : collectorMap.values()) { totalStreams += bc.getTotalIncomingFragments(); } assert totalStreams >= remainingRequired.get() : String.format("Total Streams %d should be more than the minimum number of streams to commence (%d). It isn't.", totalStreams, remainingRequired.get()); streamsRemaining.set(totalStreams); }