package org.apache.bookkeeper.meta; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.Closeable; import java.io.IOException; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.apache.zookeeper.AsyncCallback; import org.apache.bookkeeper.client.BKException; import org.apache.bookkeeper.client.LedgerMetadata; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.LedgerMetadataListener; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.Processor; import org.apache.bookkeeper.versioning.Version; /** * LedgerManager takes responsibility of ledger management in client side. * * <ul> * <li>How to store ledger meta (e.g. in ZooKeeper or other key/value store) * </ul> */ public interface LedgerManager extends Closeable { /** * Create a new ledger with provided ledger id and metadata * * @param ledgerId * Ledger id provided to be created * @param metadata * Metadata provided when creating the new ledger * @param cb * Callback when creating a new ledger. Return code:<ul> * <li>{@link BKException.Code.OK} if success</li> * <li>{@link BKException.Code.LedgerExistException} if given ledger id exist</li> * <li>{@link BKException.Code.ZKException}/{@link BKException.Code.MetaStoreException} * for other issue</li> * </ul> */ public void createLedgerMetadata(long ledgerId, LedgerMetadata metadata, GenericCallback<Void> cb); /** * Remove a specified ledger metadata by ledgerId and version. * * @param ledgerId * Ledger Id * @param version * Ledger metadata version * @param cb * Callback when remove ledger metadata. Return code:<ul> * <li>{@link BKException.Code.OK} if success</li> * <li>{@link BKException.Code.MetadataVersionException} if version doesn't match</li> * <li>{@link BKException.Code.NoSuchLedgerExistsException} if ledger not exist</li> * <li>{@link BKException.Code.ZKException} for other issue</li> * </ul> */ public void removeLedgerMetadata(long ledgerId, Version version, GenericCallback<Void> vb); /** * Read ledger metadata of a specified ledger. * * @param ledgerId * Ledger Id * @param readCb * Callback when read ledger metadata. Return code:<ul> * <li>{@link BKException.Code.OK} if success</li> * <li>{@link BKException.Code.NoSuchLedgerExistsException} if ledger not exist</li> * <li>{@link BKException.Code.ZKException} for other issue</li> * </ul> */ public void readLedgerMetadata(long ledgerId, GenericCallback<LedgerMetadata> readCb); /** * Write ledger metadata. * * @param ledgerId * Ledger Id * @param metadata * Ledger Metadata to write * @param cb * Callback when finished writing ledger metadata. Return code:<ul> * <li>{@link BKException.Code.OK} if success</li> * <li>{@link BKException.Code.MetadataVersionException} if version in metadata doesn't match</li> * <li>{@link BKException.Code.ZKException} for other issue</li> * </ul> */ public void writeLedgerMetadata(long ledgerId, LedgerMetadata metadata, GenericCallback<Void> cb); /** * Register the ledger metadata <i>listener</i> on <i>ledgerId</i>. * * @param ledgerId * ledger id. * @param listener * listener. */ public abstract void registerLedgerMetadataListener(long ledgerId, LedgerMetadataListener listener); /** * Unregister the ledger metadata <i>listener</i> on <i>ledgerId</i>. * * @param ledgerId * ledger id. * @param listener * ledger metadata listener. */ public abstract void unregisterLedgerMetadataListener(long ledgerId, LedgerMetadataListener listener); /** * Loop to process all ledgers. * <p> * <ul> * After all ledgers were processed, finalCb will be triggerred: * <li> if all ledgers are processed done with OK, success rc will be passed to finalCb. * <li> if some ledgers are prcoessed failed, failure rc will be passed to finalCb. * </ul> * </p> * * @param processor * Ledger Processor to process a specific ledger * @param finalCb * Callback triggered after all ledgers are processed * @param context * Context of final callback * @param successRc * Success RC code passed to finalCb when callback * @param failureRc * Failure RC code passed to finalCb when exceptions occured. */ public void asyncProcessLedgers(Processor<Long> processor, AsyncCallback.VoidCallback finalCb, Object context, int successRc, int failureRc); /** * Loop to scan a range of metadata from metadata storage * * @return will return a iterator of the Ranges */ public LedgerRangeIterator getLedgerRanges(); /* * Used to represent the Ledgers range returned from the * current scan. */ public static class LedgerRange { // returned ledgers private final SortedSet<Long> ledgers; public LedgerRange(Set<Long> ledgers) { this.ledgers = new TreeSet<Long>(ledgers); } public int size() { return this.ledgers.size(); } public Long start() { return ledgers.first(); } public Long end() { return ledgers.last(); } public Set<Long> getLedgers() { return this.ledgers; } } /** * Interface of the ledger meta range iterator from * storage (e.g. in ZooKeeper or other key/value store) */ interface LedgerRangeIterator { /** * @return true if there are records in the ledger metadata store. false * only when there are indeed no records in ledger metadata store. * @throws IOException thrown when there is any problem accessing the ledger * metadata store. It is critical that it doesn't return false in the case * in the case it fails to access the ledger metadata store. Otherwise it * will end up deleting all ledgers by accident. */ public boolean hasNext() throws IOException; /** * Get the next element. * * @return the next element. * @throws IOException thrown when there is a problem accessing the ledger * metadata store. It is critical that it doesn't return false in the case * in the case it fails to access the ledger metadata store. Otherwise it * will end up deleting all ledgers by accident. */ public LedgerRange next() throws IOException; } }