blob: 64548fbd1318ef0b01b3df1de3f6a85a8051bf65 [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 com.google.common.collect.Lists;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Predicate;
import org.apache.bookkeeper.common.concurrent.FutureUtils;
import org.apache.bookkeeper.proto.BookkeeperInternalCallbacks.GenericCallback;
import org.apache.bookkeeper.replication.ReplicationException;
/**
* Interface for marking ledgers which need to be rereplicated.
*/
public interface LedgerUnderreplicationManager extends AutoCloseable {
/**
* Mark a ledger as underreplicated. The replication should
* then check which fragments are underreplicated and rereplicate them
*/
default void markLedgerUnderreplicated(long ledgerId, String missingReplica) throws ReplicationException {
FutureUtils.result(
markLedgerUnderreplicatedAsync(
ledgerId, Lists.newArrayList(missingReplica)), ReplicationException.EXCEPTION_HANDLER);
}
/**
* Check whether the ledger is being replicated by any bookie.
*/
boolean isLedgerBeingReplicated(long ledgerId) throws ReplicationException;
/**
* Mark a ledger as underreplicated with missing bookies. The replication should then
* check which fragments are underreplicated and rereplicate them.
*
* @param ledgerId ledger id
* @param missingReplicas missing replicas
* @return a future presents the mark result.
*/
CompletableFuture<Void> markLedgerUnderreplicatedAsync(long ledgerId, Collection<String> missingReplicas);
/**
* 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 the UnderreplicatedLedger info if this ledger is marked
* underreplicated otherwise it returns null.
*
* @param ledgerId
* ledger id
* @return the UnderreplicatedLedger info instance if this ledger is marked
* underreplicated otherwise it returns null.
* @throws ReplicationException.UnavailableException
*/
UnderreplicatedLedger getLedgerUnreplicationInfo(long ledgerId) throws ReplicationException.UnavailableException;
/**
* Get a list of all the underreplicated ledgers which have been
* marked for rereplication, filtered by the predicate on the missing replicas list.
*
* <p>Missing replicas list of an underreplicated ledger is the list of the bookies which are part of
* the ensemble of this ledger and are currently unavailable/down.
*
* @param predicate filter to use while listing under replicated ledgers. 'null' if filtering is not required
* @return an iterator which returns underreplicated ledgers.
*/
Iterator<UnderreplicatedLedger> listLedgersToRereplicate(Predicate<List<String>> predicate);
/**
* 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;
void acquireUnderreplicatedLedger(long ledgerId) throws ReplicationException;
/**
* 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.
*/
@Override
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;
/**
* Creates the zNode for lostBookieRecoveryDelay with the specified value and returns true.
* If the node is already existing, then it returns false.
*
* @param lostBookieRecoveryDelay
* @return
* true if it succeeds in creating zNode for lostBookieRecoveryDelay, false if it is already existing
* @throws ReplicationException.UnavailableException
*/
boolean initializeLostBookieRecoveryDelay(int lostBookieRecoveryDelay)
throws ReplicationException.UnavailableException;
/**
* Setter for the lostBookieRecoveryDelay znode.
*
* @param lostBookieRecoveryDelay
* @throws ReplicationException.UnavailableException
*/
void setLostBookieRecoveryDelay(int lostBookieRecoveryDelay) throws ReplicationException.UnavailableException;
/**
* Getter for the lostBookieRecoveryDelay.
*
* @return the int value of lostBookieRecoveryDelay
* @throws ReplicationException.UnavailableException
*/
int getLostBookieRecoveryDelay() throws ReplicationException.UnavailableException;
/**
* Setter for the CheckAllLedgers last executed ctime.
*
* @param checkAllLedgersCTime
* @throws ReplicationException.UnavailableException
*/
void setCheckAllLedgersCTime(long checkAllLedgersCTime) throws ReplicationException.UnavailableException;
/**
* Getter for the CheckAllLedgers last executed ctime.
*
* @return the long value of checkAllLedgersCTime
* @throws ReplicationException.UnavailableException
*/
long getCheckAllLedgersCTime() throws ReplicationException.UnavailableException;
/**
* Setter for the PlacementPolicyCheck last executed ctime.
*
* @param placementPolicyCheckCTime
* @throws ReplicationException.UnavailableException
*/
void setPlacementPolicyCheckCTime(long placementPolicyCheckCTime) throws ReplicationException.UnavailableException;
/**
* Getter for the PlacementPolicyCheck last executed ctime.
*
* @return the long value of placementPolicyCheckCTime
* @throws ReplicationException.UnavailableException
*/
long getPlacementPolicyCheckCTime() throws ReplicationException.UnavailableException;
/**
* Setter for the ReplicasCheck last executed ctime.
*
* @param replicasCheckCTime
* @throws ReplicationException.UnavailableException
*/
void setReplicasCheckCTime(long replicasCheckCTime) throws ReplicationException.UnavailableException;
/**
* Getter for the ReplicasCheck last executed ctime.
*
* @return the long value of replicasCheckCTime
* @throws ReplicationException.UnavailableException
*/
long getReplicasCheckCTime() throws ReplicationException.UnavailableException;
/**
* Receive notification asynchronously when the num of under-replicated ledgers Changed.
*
* @param cb
* @throws ReplicationException.UnavailableException
*/
@Deprecated
default void notifyUnderReplicationLedgerChanged(GenericCallback<Void> cb)
throws ReplicationException.UnavailableException {}
/**
* Receive notification asynchronously when the lostBookieRecoveryDelay value is Changed.
*
* @param cb
* @throws ReplicationException.UnavailableException
*/
void notifyLostBookieRecoveryDelayChanged(GenericCallback<Void> cb)
throws ReplicationException.UnavailableException;
/**
* If a replicationworker has acquired lock on an underreplicated ledger,
* then getReplicationWorkerIdRereplicatingLedger should return
* ReplicationWorkerId (BookieId) of the ReplicationWorker that is holding
* lock. If lock for the underreplicated ledger is not yet acquired or if it
* is released then it is supposed to return null.
*
* @param ledgerId
* @return
* @throws ReplicationException.UnavailableException
*/
String getReplicationWorkerIdRereplicatingLedger(long ledgerId) throws ReplicationException.UnavailableException;
}