/*
   * (non-Javadoc)
   *
   * @see
   * org.apache.bookkeeper.client.AsyncCallback.OpenCallback#openComplete(int,
   * org.apache.bookkeeper.client.LedgerHandle, java.lang.Object)
   */
  @Override
  public void openComplete(int rc, LedgerHandle ledger, Object ctx) {
    OpReadEntry opReadEntry = (OpReadEntry) ctx;

    if (rc != BKException.Code.OK) {
      opReadEntry.failed(new ManagedLedgerException(BKException.create(rc)));
      return;
    }

    log.debug("[{}] Successfully opened ledger {} for reading", name, ledger.getId());
    internalReadFromLedger(ledger, opReadEntry);
  }
Beispiel #2
0
 public void force() throws IOException {
   SyncCounter counter = lastCounter.get();
   if (counter != null) {
     try {
       counter.block(0);
       if (counter.getrc() != BKException.Code.OK) {
         throw new IOException("Force append failed", BKException.create(counter.getrc()));
       }
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       throw new IOException(e);
     } finally {
       lastCounter.remove();
     }
   }
 }
  /*
   * (non-Javadoc)
   *
   * @see
   * org.apache.bookkeeper.client.AsyncCallback.ReadCallback#readComplete(int,
   * org.apache.bookkeeper.client.LedgerHandle, java.util.Enumeration,
   * java.lang.Object)
   */
  @Override
  public void readComplete(
      int rc, LedgerHandle lh, Enumeration<LedgerEntry> entriesEnum, Object ctx) {
    OpReadEntry opReadEntry = (OpReadEntry) ctx;

    if (rc != BKException.Code.OK) {
      log.warn(
          "[{}] read failed from ledger {} at position:{}",
          va(name, lh.getId(), opReadEntry.readPosition));
      opReadEntry.failed(new ManagedLedgerException(BKException.create(rc)));
      return;
    }

    List<Entry> entries = opReadEntry.entries;
    while (entriesEnum.hasMoreElements()) entries.add(new EntryImpl(entriesEnum.nextElement()));

    long lastEntry = entries.get(entries.size() - 1).getPosition().getEntryId();

    // Get the "next read position", we need to advance the position taking
    // care of ledgers boundaries
    Position nextReadPosition;
    if (lastEntry < lh.getLastAddConfirmed()) {
      nextReadPosition = new Position(lh.getId(), lastEntry + 1);
    } else {
      // Move to next ledger
      Long nextLedgerId = ledgers.ceilingKey(lh.getId() + 1);
      if (nextLedgerId == null) {
        // We are already in the last ledger
        nextReadPosition = new Position(lh.getId(), lastEntry + 1);
      } else {
        nextReadPosition = new Position(nextLedgerId, 0);
      }
    }

    opReadEntry.nextReadPosition = nextReadPosition;
    opReadEntry.succeeded();
  }
  /*
   * (non-Javadoc)
   *
   * @see
   * org.apache.bookkeeper.client.AsyncCallback.CreateCallback#createComplete
   * (int, org.apache.bookkeeper.client.LedgerHandle, java.lang.Object)
   */
  @Override
  public synchronized void createComplete(int rc, LedgerHandle lh, Object ctx) {
    log.debug("[{}] createComplete rc={} ledger={}", va(name, rc, lh != null ? lh.getId() : -1));

    if (rc != BKException.Code.OK) {
      state = State.ClosedLedger;
      log.error("[{}] Error creating ledger rc={} {}", va(name, rc, BKException.getMessage(rc)));
      ManagedLedgerException status = new ManagedLedgerException(BKException.create(rc));

      // Empty the list of pending requests and make all of them fail
      while (!pendingAddEntries.isEmpty()) {
        pendingAddEntries.poll().failed(status);
      }
    } else {
      log.debug("[{}] Successfully created new ledger {}", name, lh.getId());
      ledgers.put(lh.getId(), new LedgerStat(lh.getId(), 0, 0));
      currentLedger = lh;
      currentLedgerEntries = 0;
      currentLedgerSize = 0;

      MetaStoreCallback<Void> cb =
          new MetaStoreCallback<Void>() {
            public void operationComplete(Void v, Version version) {
              updateLedgersIdsComplete(version);
            }

            public void operationFailed(MetaStoreException e) {
              log.warn("Error updating meta data with the new list of ledgers");
              while (!pendingAddEntries.isEmpty()) {
                pendingAddEntries.poll().failed(e);
              }
            }
          };
      store.asyncUpdateLedgerIds(name, ledgers.values(), ledgersVersion, cb);
    }
  }