예제 #1
0
  /** @param page Page. */
  public final void addPage(GridResultPage page) {
    int pageRowsCnt = page.rowsInPage();

    if (pageRowsCnt != 0) addPage0(page);

    Counter cnt = remainingRows.get(page.source());

    int allRows = page.response().allRows();

    if (allRows
        != -1) { // Only the first page contains allRows count and is allowed to init counter.
      assert !cnt.initialized : "Counter is already initialized.";

      cnt.addAndGet(allRows);
      expRowsCnt.addAndGet(allRows);

      // We need this separate flag to handle case when the first source contains only one page
      // and it will signal that all remaining counters are zero and fetch is finished.
      cnt.initialized = true;
    }

    if (cnt.addAndGet(-pageRowsCnt)
        == 0) { // Result can be negative in case of race between messages, it is ok.
      boolean last = true;

      for (Counter c : remainingRows.values()) { // Check all the sources.
        if (c.get() != 0 || !c.initialized) {
          last = false;

          break;
        }
      }

      if (last && lastSubmitted.compareAndSet(false, true)) {
        addPage0(
            new GridResultPage(null, page.source(), null) {
              @Override
              public boolean isLast() {
                return true;
              }
            });
      }
    }
  }
예제 #2
0
 /** @param page Page. */
 protected void fetchNextPage(GridResultPage page) {
   if (remainingRows.get(page.source()).get() != 0) page.fetchNextPage();
 }
  /** {@inheritDoc} */
  @Override
  protected void addPage0(GridResultPage page) {
    assert page.rowsInPage() > 0 || page.isLast() || page.isFail();

    queue.add(page);
  }