blob: d006895e9e4eb7b7afb4fded35e7325d47e18783 [file] [log] [blame]
/**
* 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;
}