/** * 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. */ package org.apache.bookkeeper.meta; import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback; import org.apache.bookkeeper.replication.ReplicationException; import java.util.Iterator; /** * Interface for marking ledgers which need to be rereplicated */ public interface LedgerUnderreplicationManager { /** * Mark a ledger as underreplicated. The replication should * then check which fragments are underreplicated and rereplicate them */ void markLedgerUnderreplicated(long ledgerId, String missingReplica) throws ReplicationException.UnavailableException; /** * Mark a ledger as fully replicated. If the ledger is not * already marked as underreplicated, this is a noop. */ void markLedgerReplicated(long ledgerId) throws ReplicationException.UnavailableException; /** * Get a list of all the ledgers which have been * marked for rereplication. * * @return an iterator which returns ledger ids */ Iterator<Long> listLedgersToRereplicate(); /** * Acquire a underreplicated ledger for rereplication. The ledger * should be locked, so that no other agent will receive the ledger * from this call. * The ledger should remain locked until either #markLedgerComplete * or #releaseLedger are called. * This call is blocking, so will not return until a ledger is * available for rereplication. */ long getLedgerToRereplicate() throws ReplicationException.UnavailableException; /** * Poll for a underreplicated ledger to rereplicate. * @see #getLedgerToRereplicate * @return the ledgerId, or -1 if none are available */ long pollLedgerToRereplicate() throws ReplicationException.UnavailableException; /** * Release a previously acquired ledger. This allows others to acquire * the ledger */ void releaseUnderreplicatedLedger(long ledgerId) throws ReplicationException.UnavailableException; /** * Release all resources held by the ledger underreplication manager */ void close() throws ReplicationException.UnavailableException; /** * Stop ledger replication. Currently running ledger rereplication tasks * will be continued and will be stopped from next task. This will block * ledger replication {@link #Auditor} and {@link #getLedgerToRereplicate()} * tasks */ void disableLedgerReplication() throws ReplicationException.UnavailableException; /** * Resuming ledger replication. This will allow ledger replication * {@link #Auditor} and {@link #getLedgerToRereplicate()} tasks to continue */ void enableLedgerReplication() throws ReplicationException.UnavailableException; /** * Check whether the ledger replication is enabled or not. This will return * true if the ledger replication is enabled, otherwise return false * * @return - return true if it is enabled otherwise return false */ boolean isLedgerReplicationEnabled() throws ReplicationException.UnavailableException; /** * Receive notification asynchronously when the ledger replication process * is enabled * * @param cb * - callback implementation to receive the notification */ void notifyLedgerReplicationEnabled(GenericCallback<Void> cb) throws ReplicationException.UnavailableException; }