com.sleepycat.je.rep.impl.node
Class LocalCBVLSNTracker
java.lang.Object
com.sleepycat.je.rep.impl.node.LocalCBVLSNTracker
public class LocalCBVLSNTracker
- extends Object
The LocalCBVLSNTracker tracks this node's local CBVLSN. Each node has a
single tracker instance.
The GlobalCBVLSN must be durable for both HA and data sync reasons. Since
the GlobalCBVLSN is derived from the LocalCBVLSN, we need to make the
LocalCBVLSN durable too. [#18728]
1. For HA, the GlobalCBVLSN is supposed to ensure that the replication
stream is always available for replay, across failovers.
2. For data sync, the GlobalCBVLSN is supposed to ensure that exported
log entries are never the subject of hard recovery.
The local CBVLSN is maintained by each node. Replicas periodically update
the Master with their current CBVLSN via a response to a heartbeat message
from the Master, where it is managed by the LocalCBVLSNUpdater and
flushed out to RepGroup database, whenever the updater notices that it
has changed. The change is then effectively broadcast to all the Replicas
including the originating Replica, via the replication stream. For this
reason, the CBVLSN for the node as represented in the RepGroup database
will generally lag the value contained in the tracker.
Note that track() api is invoked in critical code with locks being held and
must be lightweight.
Local CBVLSNs are used only to contribute to the calculation of the global
CBVLSN. The global CBVLSN acts as the cleaner throttle. Any invariants, such
as the rule that the cleaner throttle cannot regress, are applied when doing
the global calculation. In addition, we enforce the rule against
regressing local CBVLSNs here.
Method Summary |
VLSN |
getBroadcastCBVLSN()
|
void |
registerMatchpoint(VLSN matchpoint)
Initialize the local CBVLSN with the syncup matchpoint, so that the
heartbeat responses sent before the node has replayed any log entries
are still valid for saving a place in the replication stream. |
void |
setAllowUpdate(boolean allowUpdate)
|
void |
track(VLSN newVLSN,
long lsn)
Tracks barrier VLSNs, updating the local CBVLSN if the associated log
file has changed. |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
LocalCBVLSNTracker
LocalCBVLSNTracker(RepNode repNode)
setAllowUpdate
public void setAllowUpdate(boolean allowUpdate)
track
public void track(VLSN newVLSN,
long lsn)
- Tracks barrier VLSNs, updating the local CBVLSN if the associated log
file has changed. When tracking is done on a replica, the
currentLocalCBVLSN value is ultimately sent via heartbeat response to
the master, which updates the RepGroupDb. When tracking is done on a
master, the update is done on this node.
The update is only done once per file in order to decrease the cost of
tracking. Since we want the local cbvlsn to be durable, we use the last
vlsn in the penultimate log file as the local cbvlsn value. We know the
penultimate log file has been fsynced, and therefore the last vlsn
within that file has also been fsynced.
Tracking can be called quite often, and should be lightweight.
- Parameters:
newVLSN
- lsn
-
registerMatchpoint
public void registerMatchpoint(VLSN matchpoint)
- Initialize the local CBVLSN with the syncup matchpoint, so that the
heartbeat responses sent before the node has replayed any log entries
are still valid for saving a place in the replication stream.
- Parameters:
matchpoint
-
getBroadcastCBVLSN
public VLSN getBroadcastCBVLSN()
- Returns:
- the local CBVLSN for broadcast from replica to master on the
heartbeat response. Adjustments are made here, so the value
broadcast is not literally the current local CBVLSN.
Copyright (c) 2004-2010 Oracle. All rights reserved.