diff --git a/go.mod b/go.mod index e62d230858f..6c87b871c4b 100644 --- a/go.mod +++ b/go.mod @@ -34,9 +34,9 @@ require ( github.com/stretchr/testify v1.9.0 // includes ErrorContains github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 github.com/tedsuo/ifrit v0.0.0-20220120221754-dd274de71113 - go.etcd.io/etcd/client/pkg/v3 v3.5.9 - go.etcd.io/etcd/raft/v3 v3.5.9 - go.etcd.io/etcd/server/v3 v3.5.9 + go.etcd.io/etcd/client/pkg/v3 v3.5.14 + go.etcd.io/etcd/raft/v3 v3.5.14 + go.etcd.io/etcd/server/v3 v3.5.14 go.uber.org/zap v1.27.0 google.golang.org/grpc v1.61.0 google.golang.org/protobuf v1.34.2 @@ -106,7 +106,7 @@ require ( github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/sykesm/zap-logfmt v0.0.4 // indirect - go.etcd.io/etcd/pkg/v3 v3.5.9 // indirect + go.etcd.io/etcd/pkg/v3 v3.5.14 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.14.0 // indirect diff --git a/go.sum b/go.sum index 181d28f1f58..fc54258b2e7 100644 --- a/go.sum +++ b/go.sum @@ -595,14 +595,14 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/pkg/v3 v3.5.9 h1:6R2jg/aWd/zB9+9JxmijDKStGJAPFsX3e6BeJkMi6eQ= -go.etcd.io/etcd/pkg/v3 v3.5.9/go.mod h1:BZl0SAShQFk0IpLWR78T/+pyt8AruMHhTNNX73hkNVY= -go.etcd.io/etcd/raft/v3 v3.5.9 h1:ZZ1GIHoUlHsn0QVqiRysAm3/81Xx7+i2d7nSdWxlOiI= -go.etcd.io/etcd/raft/v3 v3.5.9/go.mod h1:WnFkqzFdZua4LVlVXQEGhmooLeyS7mqzS4Pf4BCVqXg= -go.etcd.io/etcd/server/v3 v3.5.9 h1:vomEmmxeztLtS5OEH7d0hBAg4cjVIu9wXuNzUZx2ZA0= -go.etcd.io/etcd/server/v3 v3.5.9/go.mod h1:GgI1fQClQCFIzuVjlvdbMxNbnISt90gdfYyqiAIt65g= +go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= +go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= +go.etcd.io/etcd/pkg/v3 v3.5.14 h1:keuxhJiDCPjTKpW77GxJnnVVD5n4IsfvkDaqiqUMNEQ= +go.etcd.io/etcd/pkg/v3 v3.5.14/go.mod h1:7o+DL6a7DYz9KSjWByX+NGmQPYinoH3D36VAu/B3JqA= +go.etcd.io/etcd/raft/v3 v3.5.14 h1:mHnpbljpBBftmK+YUfp+49ivaCc126aBPLAnwDw0DnE= +go.etcd.io/etcd/raft/v3 v3.5.14/go.mod h1:WnIK5blyJGRKsHA3efovdNoLv9QELTZHzpDOVIAuL2s= +go.etcd.io/etcd/server/v3 v3.5.14 h1:l/3gdiSSoGU6MyKAYiL+8WSOMq9ySG+NqQ04euLtZfY= +go.etcd.io/etcd/server/v3 v3.5.14/go.mod h1:SPh0rUtGNDgOZd/aTbkAUYZV+5FFHw5sdbGnO2/byw0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= diff --git a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go index f4492009d6c..b314e068fea 100644 --- a/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go +++ b/vendor/go.etcd.io/etcd/client/pkg/v3/fileutil/purge.go @@ -25,18 +25,24 @@ import ( ) func PurgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}) <-chan error { - return purgeFile(lg, dirname, suffix, max, interval, stop, nil, nil) + return purgeFile(lg, dirname, suffix, max, interval, stop, nil, nil, true) } func PurgeFileWithDoneNotify(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}) (<-chan struct{}, <-chan error) { doneC := make(chan struct{}) - errC := purgeFile(lg, dirname, suffix, max, interval, stop, nil, doneC) + errC := purgeFile(lg, dirname, suffix, max, interval, stop, nil, doneC, true) + return doneC, errC +} + +func PurgeFileWithoutFlock(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}) (<-chan struct{}, <-chan error) { + doneC := make(chan struct{}) + errC := purgeFile(lg, dirname, suffix, max, interval, stop, nil, doneC, false) return doneC, errC } // purgeFile is the internal implementation for PurgeFile which can post purged files to purgec if non-nil. // if donec is non-nil, the function closes it to notify its exit. -func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}, purgec chan<- string, donec chan<- struct{}) <-chan error { +func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval time.Duration, stop <-chan struct{}, purgec chan<- string, donec chan<- struct{}, flock bool) <-chan error { if lg == nil { lg = zap.NewNop() } @@ -67,20 +73,25 @@ func purgeFile(lg *zap.Logger, dirname string, suffix string, max uint, interval fnames = newfnames for len(newfnames) > int(max) { f := filepath.Join(dirname, newfnames[0]) - l, err := TryLockFile(f, os.O_WRONLY, PrivateFileMode) - if err != nil { - lg.Warn("failed to lock file", zap.String("path", f), zap.Error(err)) - break + var l *LockedFile + if flock { + l, err = TryLockFile(f, os.O_WRONLY, PrivateFileMode) + if err != nil { + lg.Warn("failed to lock file", zap.String("path", f), zap.Error(err)) + break + } } if err = os.Remove(f); err != nil { lg.Error("failed to remove file", zap.String("path", f), zap.Error(err)) errC <- err return } - if err = l.Close(); err != nil { - lg.Error("failed to unlock/close", zap.String("path", l.Name()), zap.Error(err)) - errC <- err - return + if flock { + if err = l.Close(); err != nil { + lg.Error("failed to unlock/close", zap.String("path", l.Name()), zap.Error(err)) + errC <- err + return + } } lg.Info("purged", zap.String("path", f)) newfnames = newfnames[1:] diff --git a/vendor/go.etcd.io/etcd/pkg/v3/ioutil/pagewriter.go b/vendor/go.etcd.io/etcd/pkg/v3/ioutil/pagewriter.go index cf9a8dc664d..62eb5cd43e5 100644 --- a/vendor/go.etcd.io/etcd/pkg/v3/ioutil/pagewriter.go +++ b/vendor/go.etcd.io/etcd/pkg/v3/ioutil/pagewriter.go @@ -15,6 +15,7 @@ package ioutil import ( + "fmt" "io" ) @@ -41,6 +42,9 @@ type PageWriter struct { // NewPageWriter creates a new PageWriter. pageBytes is the number of bytes // to write per page. pageOffset is the starting offset of io.Writer. func NewPageWriter(w io.Writer, pageBytes, pageOffset int) *PageWriter { + if pageBytes <= 0 { + panic(fmt.Sprintf("assertion failed: invalid pageBytes (%d) value, it must be greater than 0", pageBytes)) + } return &PageWriter{ w: w, pageOffset: pageOffset, diff --git a/vendor/go.etcd.io/etcd/server/v3/wal/encoder.go b/vendor/go.etcd.io/etcd/server/v3/wal/encoder.go index 61b4c20efb1..2642e156c88 100644 --- a/vendor/go.etcd.io/etcd/server/v3/wal/encoder.go +++ b/vendor/go.etcd.io/etcd/server/v3/wal/encoder.go @@ -20,6 +20,7 @@ import ( "io" "os" "sync" + "time" "go.etcd.io/etcd/pkg/v3/crc" "go.etcd.io/etcd/pkg/v3/ioutil" @@ -84,17 +85,9 @@ func (e *encoder) encode(rec *walpb.Record) error { data = e.buf[:n] } - lenField, padBytes := encodeFrameSize(len(data)) - if err = writeUint64(e.bw, lenField, e.uint64buf); err != nil { - return err - } + data, lenField := prepareDataWithPadding(data) - if padBytes != 0 { - data = append(data, make([]byte, padBytes)...) - } - n, err = e.bw.Write(data) - walWriteBytes.Add(float64(n)) - return err + return write(e.bw, e.uint64buf, data, lenField) } func encodeFrameSize(dataBytes int) (lenField uint64, padBytes int) { @@ -115,10 +108,28 @@ func (e *encoder) flush() error { return err } -func writeUint64(w io.Writer, n uint64, buf []byte) error { - // http://golang.org/src/encoding/binary/binary.go - binary.LittleEndian.PutUint64(buf, n) - nv, err := w.Write(buf) +func prepareDataWithPadding(data []byte) ([]byte, uint64) { + lenField, padBytes := encodeFrameSize(len(data)) + if padBytes != 0 { + data = append(data, make([]byte, padBytes)...) + } + return data, lenField +} + +func write(w io.Writer, uint64buf, data []byte, lenField uint64) error { + // write padding info + binary.LittleEndian.PutUint64(uint64buf, lenField) + + start := time.Now() + nv, err := w.Write(uint64buf) walWriteBytes.Add(float64(nv)) + if err != nil { + return err + } + + // write the record with padding + n, err := w.Write(data) + walWriteSec.Observe(time.Since(start).Seconds()) + walWriteBytes.Add(float64(n)) return err } diff --git a/vendor/go.etcd.io/etcd/server/v3/wal/metrics.go b/vendor/go.etcd.io/etcd/server/v3/wal/metrics.go index 814d654cdd3..65e3c34a7bd 100644 --- a/vendor/go.etcd.io/etcd/server/v3/wal/metrics.go +++ b/vendor/go.etcd.io/etcd/server/v3/wal/metrics.go @@ -28,6 +28,15 @@ var ( Buckets: prometheus.ExponentialBuckets(0.001, 2, 14), }) + walWriteSec = prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: "etcd", + Subsystem: "disk", + Name: "wal_write_duration_seconds", + Help: "The latency distributions of write called by WAL.", + + Buckets: prometheus.ExponentialBuckets(0.001, 2, 14), + }) + walWriteBytes = prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: "etcd", Subsystem: "disk", diff --git a/vendor/modules.txt b/vendor/modules.txt index 30f9c2eeb52..81c44741288 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -497,23 +497,23 @@ github.com/syndtr/goleveldb/leveldb/util github.com/tedsuo/ifrit github.com/tedsuo/ifrit/ginkgomon_v2 github.com/tedsuo/ifrit/grouper -# go.etcd.io/etcd/client/pkg/v3 v3.5.9 -## explicit; go 1.19 +# go.etcd.io/etcd/client/pkg/v3 v3.5.14 +## explicit; go 1.21 go.etcd.io/etcd/client/pkg/v3/fileutil -# go.etcd.io/etcd/pkg/v3 v3.5.9 -## explicit; go 1.19 +# go.etcd.io/etcd/pkg/v3 v3.5.14 +## explicit; go 1.21 go.etcd.io/etcd/pkg/v3/crc go.etcd.io/etcd/pkg/v3/ioutil go.etcd.io/etcd/pkg/v3/pbutil -# go.etcd.io/etcd/raft/v3 v3.5.9 -## explicit; go 1.19 +# go.etcd.io/etcd/raft/v3 v3.5.14 +## explicit; go 1.21 go.etcd.io/etcd/raft/v3 go.etcd.io/etcd/raft/v3/confchange go.etcd.io/etcd/raft/v3/quorum go.etcd.io/etcd/raft/v3/raftpb go.etcd.io/etcd/raft/v3/tracker -# go.etcd.io/etcd/server/v3 v3.5.9 -## explicit; go 1.19 +# go.etcd.io/etcd/server/v3 v3.5.14 +## explicit; go 1.21 go.etcd.io/etcd/server/v3/etcdserver/api/snap go.etcd.io/etcd/server/v3/etcdserver/api/snap/snappb go.etcd.io/etcd/server/v3/wal