mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #1049 from unihorn/120
raftLog: enhance check in compact
This commit is contained in:
commit
072a21782e
11
raft/log.go
11
raft/log.go
@ -152,8 +152,8 @@ func (l *raftLog) maybeCommit(maxIndex, term int64) bool {
|
||||
// and not greater than the index of the last entry.
|
||||
// the number of entries after compaction will be returned.
|
||||
func (l *raftLog) compact(i int64) int64 {
|
||||
if l.isOutOfBounds(i) {
|
||||
panic(fmt.Sprintf("compact %d out of bounds [%d:%d]", i, l.offset, l.lastIndex()))
|
||||
if l.isOutOfAppliedBounds(i) {
|
||||
panic(fmt.Sprintf("compact %d out of bounds [%d:%d]", i, l.offset, l.applied))
|
||||
}
|
||||
l.ents = l.slice(i, l.lastIndex()+1)
|
||||
l.unstable = max(i+1, l.unstable)
|
||||
@ -208,6 +208,13 @@ func (l *raftLog) isOutOfBounds(i int64) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (l *raftLog) isOutOfAppliedBounds(i int64) bool {
|
||||
if i < l.offset || i > l.applied {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func min(a, b int64) int64 {
|
||||
if a > b {
|
||||
return b
|
||||
|
@ -76,11 +76,14 @@ func TestAppend(t *testing.T) {
|
||||
func TestCompactionSideEffects(t *testing.T) {
|
||||
var i int64
|
||||
lastIndex := int64(1000)
|
||||
lastTerm := lastIndex
|
||||
raftLog := newLog()
|
||||
|
||||
for i = 0; i < lastIndex; i++ {
|
||||
raftLog.append(int64(i), pb.Entry{Term: int64(i + 1), Index: int64(i + 1)})
|
||||
}
|
||||
raftLog.maybeCommit(lastIndex, lastTerm)
|
||||
raftLog.resetNextEnts()
|
||||
|
||||
raftLog.compact(500)
|
||||
|
||||
@ -149,16 +152,18 @@ func TestUnstableEnts(t *testing.T) {
|
||||
//TestCompaction ensures that the number of log entreis is correct after compactions.
|
||||
func TestCompaction(t *testing.T) {
|
||||
tests := []struct {
|
||||
app int
|
||||
compact []int64
|
||||
wleft []int
|
||||
wallow bool
|
||||
applied int64
|
||||
lastIndex int64
|
||||
compact []int64
|
||||
wleft []int
|
||||
wallow bool
|
||||
}{
|
||||
// out of upper bound
|
||||
{1000, []int64{1001}, []int{-1}, false},
|
||||
{1000, []int64{300, 500, 800, 900}, []int{701, 501, 201, 101}, true},
|
||||
{1000, 1000, []int64{1001}, []int{-1}, false},
|
||||
{1000, 1000, []int64{300, 500, 800, 900}, []int{701, 501, 201, 101}, true},
|
||||
// out of lower bound
|
||||
{1000, []int64{300, 299}, []int{701, -1}, false},
|
||||
{1000, 1000, []int64{300, 299}, []int{701, -1}, false},
|
||||
{0, 1000, []int64{1}, []int{-1}, false},
|
||||
}
|
||||
|
||||
for i, tt := range tests {
|
||||
@ -172,9 +177,11 @@ func TestCompaction(t *testing.T) {
|
||||
}()
|
||||
|
||||
raftLog := newLog()
|
||||
for i := 0; i < tt.app; i++ {
|
||||
for i := int64(0); i < tt.lastIndex; i++ {
|
||||
raftLog.append(int64(i), pb.Entry{})
|
||||
}
|
||||
raftLog.maybeCommit(tt.applied, 0)
|
||||
raftLog.resetNextEnts()
|
||||
|
||||
for j := 0; j < len(tt.compact); j++ {
|
||||
raftLog.compact(tt.compact[j])
|
||||
|
Loading…
x
Reference in New Issue
Block a user