|
|
@@ -157,6 +157,18 @@ type Node interface {
|
|
|
// in snapshots. Will never return nil; it returns a pointer only
|
|
|
// to match MemoryStorage.Compact.
|
|
|
ApplyConfChange(cc pb.ConfChange) *pb.ConfState
|
|
|
+
|
|
|
+ // ReadIndex request a read state. The read state will be set in the ready.
|
|
|
+ // Read state has a read index. Once the application advances further than the read
|
|
|
+ // index, any linearizable read requests issued before the read request can be
|
|
|
+ // processed safely. The read state will have the same rctx attached.
|
|
|
+ //
|
|
|
+ // Note: the current implementation depends on the leader lease. If the clock drift is unbounded,
|
|
|
+ // leader might keep the lease longer than it should (clock can move backward/pause without any bound).
|
|
|
+ // ReadIndex is not safe in that case.
|
|
|
+ // TODO: add clock drift bound into raft configuration.
|
|
|
+ ReadIndex(ctx context.Context, rctx []byte) error
|
|
|
+
|
|
|
// Status returns the current status of the raft state machine.
|
|
|
Status() Status
|
|
|
// ReportUnreachable reports the given node is not reachable for the last send.
|
|
|
@@ -487,8 +499,8 @@ func (n *node) ReportSnapshot(id uint64, status SnapshotStatus) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (n *node) ReadIndex(ctx context.Context, id uint64, rctx []byte) error {
|
|
|
- return n.step(ctx, pb.Message{Type: pb.MsgReadIndex, From: id, Entries: []pb.Entry{{Data: rctx}}})
|
|
|
+func (n *node) ReadIndex(ctx context.Context, rctx []byte) error {
|
|
|
+ return n.step(ctx, pb.Message{Type: pb.MsgReadIndex, Entries: []pb.Entry{{Data: rctx}}})
|
|
|
}
|
|
|
|
|
|
func newReady(r *raft, prevSoftSt *SoftState, prevHardSt pb.HardState) Ready {
|