Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Commit

Permalink
Refactor time buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
jveski committed Jul 25, 2022
1 parent b5af21d commit 9cafd96
Show file tree
Hide file tree
Showing 9 changed files with 291 additions and 230 deletions.
12 changes: 2 additions & 10 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ go 1.18
require (
github.com/coreos/etcd v3.3.27+incompatible
github.com/google/uuid v1.1.2
github.com/prometheus/client_golang v1.12.2
github.com/stretchr/testify v1.7.2
go.etcd.io/etcd/pkg/v3 v3.5.4
go.uber.org/zap v1.21.0
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f
google.golang.org/grpc v1.47.0
Expand All @@ -14,32 +16,24 @@ require (
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/coreos/bbolt v1.3.2 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/dustin/go-humanize v1.0.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/btree v1.1.2 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
github.com/jonboulle/clockwork v0.3.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.12.2 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/soheilhy/cmux v0.1.5 // indirect
github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 // indirect
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
go.etcd.io/etcd/pkg/v3 v3.5.4 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect
Expand All @@ -48,8 +42,6 @@ require (
golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
Expand Down
1 change: 0 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
Expand Down
4 changes: 2 additions & 2 deletions internal/testutil/testutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ func EventKeys(events []*mvccpb.Event) []string {
}

type TimestampedEvent interface {
GetModRev() int64
GetRevision() int64
}

func EventModRevs[T TimestampedEvent](events []T) []int64 {
ret := make([]int64, len(events))
for i, event := range events {
ret[i] = event.GetModRev()
ret[i] = event.GetRevision()
}
return ret
}
Expand Down
96 changes: 96 additions & 0 deletions internal/util/list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package util

// List was adopted from https://gist.github.com/pje/90e727f80685c78a6c1cfff35f62155a.
// Replaec with container/list once it's generic.
type List[T any] struct {
root Element[T]
Len int
}

func (l *List[T]) First() *Element[T] {
if l.Len == 0 {
return nil
}
return l.root.next
}

func (l *List[T]) Last() *Element[T] {
if l.Len == 0 {
return nil
}
return l.root.prev
}

func (l *List[T]) PushFront(v T) *Element[T] {
if l.root.next == nil {
l.init()
}
return l.InsertAfter(v, &l.root)
}

func (l *List[T]) PushBack(v T) *Element[T] {
if l.root.next == nil {
l.init()
}
return l.InsertAfter(v, l.root.prev)
}

func (l *List[T]) Remove(e *Element[T]) T {
if e.list == l {
l.remove(e)
}
return e.Value
}

func (l *List[T]) init() {
l.root = *new(Element[T])
l.root.next = &l.root
l.root.prev = &l.root
}

func (l *List[T]) insertAfter(e *Element[T], at *Element[T]) *Element[T] {
e.prev = at
e.next = at.next
e.prev.next = e
e.next.prev = e
e.list = l
l.Len++
return e
}

func (l *List[T]) InsertAfter(v T, at *Element[T]) *Element[T] {
e := Element[T]{Value: v}
return l.insertAfter(&e, at)
}

func (l *List[T]) remove(e *Element[T]) {
e.prev.next = e.next
e.next.prev = e.prev
e.next = nil
e.prev = nil
e.list = nil
l.Len--
}

type Element[T any] struct {
prev *Element[T]
next *Element[T]
list *List[T]
Value T
}

func (e *Element[T]) Next() *Element[T] {
n := e.next
if e.list == nil || n == &e.list.root {
return nil
}
return n
}

func (e *Element[T]) Prev() *Element[T] {
p := e.prev
if e.list == nil || p == &e.list.root {
return nil
}
return p
}
38 changes: 12 additions & 26 deletions internal/util/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,27 @@ package util
import "github.com/prometheus/client_golang/prometheus"

var (
currentWatchRev = prometheus.NewGauge(
timeBufferVisibleMax = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "metaetcd_current_watch_rev",
Help: "The last meta cluster revision observed.",
Name: "metaetcd_time_buffer_visible_max",
Help: "Max revision visible from the time buffer",
})

watchBufferLength = prometheus.NewGauge(
timeBufferLength = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "metaetcd_watch_buffer_len",
Help: "The length of the watch buffer.",
Name: "metaetcd_time_buffer_len",
Help: "The length of the time buffer.",
})

watchEventCount = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "metaetcd_watch_event_count",
Help: "The total watch events that have been pushed into the buffer.",
})

watchGapTimeoutCount = prometheus.NewCounter(
timeBufferTimeoutCount = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "metaetcd_watch_gap_timeout_count",
Help: "The number of watch event gaps that were never filled.",
})

watchLatency = prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "metaetcd_watch_latency_seconds",
Help: "The time between a watch event being received and exposed.",
Name: "metaetcd_time_buffer_timeouts_count",
Help: "The number of buffer event gaps that were never filled.",
})
)

func init() {
prometheus.MustRegister(currentWatchRev)
prometheus.MustRegister(watchBufferLength)
prometheus.MustRegister(watchEventCount)
prometheus.MustRegister(watchGapTimeoutCount)
prometheus.MustRegister(watchLatency)
prometheus.MustRegister(timeBufferVisibleMax)
prometheus.MustRegister(timeBufferLength)
prometheus.MustRegister(timeBufferTimeoutCount)
}
Loading

0 comments on commit 9cafd96

Please sign in to comment.