Parcourir la source

Merge pull request #11004 from tbg/interaction/unused-type

raft/tracker: visit Progress in stable order
Tobias Grieger il y a 6 ans
Parent
commit
7948f39790
3 fichiers modifiés avec 33 ajouts et 17 suppressions
  1. 5 7
      raft/quorum/majority.go
  2. 28 3
      raft/tracker/tracker.go
  3. 0 7
      raft/util.go

+ 5 - 7
raft/quorum/majority.go

@@ -112,9 +112,7 @@ func (c MajorityConfig) Slice() []uint64 {
 	return sl
 	return sl
 }
 }
 
 
-type uint64Slice []uint64
-
-func insertionSort(sl uint64Slice) {
+func insertionSort(sl []uint64) {
 	a, b := 0, len(sl)
 	a, b := 0, len(sl)
 	for i := a + 1; i < b; i++ {
 	for i := a + 1; i < b; i++ {
 		for j := i; j > a && sl[j] < sl[j-1]; j-- {
 		for j := i; j > a && sl[j] < sl[j-1]; j-- {
@@ -141,12 +139,12 @@ func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index {
 	// performance is a lesser concern (additionally the performance
 	// performance is a lesser concern (additionally the performance
 	// implications of an allocation here are far from drastic).
 	// implications of an allocation here are far from drastic).
 	var stk [7]uint64
 	var stk [7]uint64
-	srt := uint64Slice(stk[:])
-
-	if cap(srt) < n {
+	var srt []uint64
+	if len(stk) >= n {
+		srt = stk[:n]
+	} else {
 		srt = make([]uint64, n)
 		srt = make([]uint64, n)
 	}
 	}
-	srt = srt[:n]
 
 
 	{
 	{
 		// Fill the slice with the indexes observed. Any unused slots will be
 		// Fill the slice with the indexes observed. Any unused slots will be

+ 28 - 3
raft/tracker/tracker.go

@@ -166,10 +166,35 @@ func (p *ProgressTracker) Committed() uint64 {
 	return uint64(p.Voters.CommittedIndex(matchAckIndexer(p.Progress)))
 	return uint64(p.Voters.CommittedIndex(matchAckIndexer(p.Progress)))
 }
 }
 
 
-// Visit invokes the supplied closure for all tracked progresses.
+func insertionSort(sl []uint64) {
+	a, b := 0, len(sl)
+	for i := a + 1; i < b; i++ {
+		for j := i; j > a && sl[j] < sl[j-1]; j-- {
+			sl[j], sl[j-1] = sl[j-1], sl[j]
+		}
+	}
+}
+
+// Visit invokes the supplied closure for all tracked progresses in stable order.
 func (p *ProgressTracker) Visit(f func(id uint64, pr *Progress)) {
 func (p *ProgressTracker) Visit(f func(id uint64, pr *Progress)) {
-	for id, pr := range p.Progress {
-		f(id, pr)
+	n := len(p.Progress)
+	// We need to sort the IDs and don't want to allocate since this is hot code.
+	// The optimization here mirrors that in `(MajorityConfig).CommittedIndex`,
+	// see there for details.
+	var sl [7]uint64
+	ids := sl[:]
+	if len(sl) >= n {
+		ids = sl[:n]
+	} else {
+		ids = make([]uint64, n)
+	}
+	for id := range p.Progress {
+		n--
+		ids[n] = id
+	}
+	insertionSort(ids)
+	for _, id := range ids {
+		f(id, p.Progress[id])
 	}
 	}
 }
 }
 
 

+ 0 - 7
raft/util.go

@@ -25,13 +25,6 @@ func (st StateType) MarshalJSON() ([]byte, error) {
 	return []byte(fmt.Sprintf("%q", st.String())), nil
 	return []byte(fmt.Sprintf("%q", st.String())), nil
 }
 }
 
 
-// uint64Slice implements sort interface
-type uint64Slice []uint64
-
-func (p uint64Slice) Len() int           { return len(p) }
-func (p uint64Slice) Less(i, j int) bool { return p[i] < p[j] }
-func (p uint64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
-
 func min(a, b uint64) uint64 {
 func min(a, b uint64) uint64 {
 	if a > b {
 	if a > b {
 		return b
 		return b