From: Atanas Vladimirov Subject: Re: Update Prometheus to 2.53.5 To: Ports Cc: claudio@openbsd.org Date: Fri, 13 Mar 2026 09:54:16 +0200 Ping? On 2026-03-07 18:04, Atanas Vladimirov wrote: > Hi ports, > > This is a patch to update the Prometheus to the latest 2.x LTS version > 2.53.5 > I'm testing it the last few days and so far so good. > > Please add me in CC because I'm not subscribed to the ports list. > > Best wishes, > Atanas > > ########################### > > Index: Makefile > =================================================================== > RCS file: /cvs/ports/sysutils/prometheus/Makefile,v > diff -u -p -r1.23 Makefile > --- Makefile 25 Sep 2023 17:07:36 -0000 1.23 > +++ Makefile 7 Mar 2026 15:56:42 -0000 > @@ -1,6 +1,6 @@ > COMMENT = systems monitoring and alerting toolkit > > -V = 2.37.9 > +V = 2.53.5 > GH_ACCOUNT = prometheus > GH_PROJECT = prometheus > GH_TAGNAME = v${V} > Index: distinfo > =================================================================== > RCS file: /cvs/ports/sysutils/prometheus/distinfo,v > diff -u -p -r1.12 distinfo > --- distinfo 6 Sep 2023 10:28:49 -0000 1.12 > +++ distinfo 7 Mar 2026 15:56:42 -0000 > @@ -1,6 +1,6 @@ > -SHA256 (prometheus-2.37.9.tar.gz) = > gSoQplOidWqzAzS9TPBmH5TepeWUw3LTPRNwQHRgpGo= > -SHA256 (prometheus-vendor-2.37.9.tar.gz) = > ea+tEdN2yBEMBYY78U6tPOLI7uorbEhNL3o5/JTxaPI= > -SHA256 (prometheus-web-ui-2.37.9.tar.gz) = > 2z6Ohg/dUEwQ5NxTn1wfxwVrKOPJGAWgSXNxb2lX4MA= > -SIZE (prometheus-2.37.9.tar.gz) = 6048911 > -SIZE (prometheus-vendor-2.37.9.tar.gz) = 11758451 > -SIZE (prometheus-web-ui-2.37.9.tar.gz) = 2390133 > +SHA256 (prometheus-2.53.5.tar.gz) = > 3ulsQxSyfWLL9Cy6faJccx0+kagkEsIviLKICOC4qYc= > +SHA256 (prometheus-vendor-2.53.5.tar.gz) = > Ib7Qstt7Pk+9c2ypzmILnGiDUaamdFvijmqWTLLjfTk= > +SHA256 (prometheus-web-ui-2.53.5.tar.gz) = > QD0m3gyT3HAtI/mtYYiF6J+2RgAz4a7qLghC3VV33dM= > +SIZE (prometheus-2.53.5.tar.gz) = 6226039 > +SIZE (prometheus-vendor-2.53.5.tar.gz) = 15356568 > +SIZE (prometheus-web-ui-2.53.5.tar.gz) = 2438498 > Index: patches/patch-Makefile > =================================================================== > RCS file: /cvs/ports/sysutils/prometheus/patches/patch-Makefile,v > diff -u -p -r1.7 patch-Makefile > --- patches/patch-Makefile 28 Feb 2023 17:54:21 -0000 1.7 > +++ patches/patch-Makefile 7 Mar 2026 15:56:42 -0000 > @@ -3,7 +3,7 @@ The react build is provided via extra di > Index: Makefile > --- Makefile.orig > +++ Makefile > -@@ -83,7 +83,7 @@ ui-lint: > +@@ -67,7 +67,7 @@ ui-lint: > cd $(UI_PATH) && npm run lint > > .PHONY: assets > @@ -12,12 +12,12 @@ Index: Makefile > > .PHONY: assets-compress > assets-compress: assets > -@@ -124,7 +124,7 @@ plugins/plugins.go: plugins.yml > plugins/generate.go > +@@ -139,7 +139,7 @@ plugins/plugins.go: plugins.yml > plugins/generate.go > plugins: plugins/plugins.go > > .PHONY: build > --build: assets npm_licenses assets-compress common-build plugins > -+build: assets-compress common-build plugins > +-build: assets npm_licenses assets-compress plugins common-build > ++build: assets-compress plugins common-build > > .PHONY: bench_tsdb > bench_tsdb: $(PROMU) > Index: patches/patch-Makefile_common > =================================================================== > RCS file: > /cvs/ports/sysutils/prometheus/patches/patch-Makefile_common,v > diff -u -p -r1.7 patch-Makefile_common > --- patches/patch-Makefile_common 28 Feb 2023 17:54:21 -0000 1.7 > +++ patches/patch-Makefile_common 7 Mar 2026 15:56:42 -0000 > @@ -3,8 +3,7 @@ Don't fetch promu form internet. This is > Index: Makefile.common > --- Makefile.common.orig > +++ Makefile.common > -@@ -232,11 +232,7 @@ common-docker-manifest: > - promu: $(PROMU) > +@@ -243,11 +243,7 @@ promu: $(PROMU) > > $(PROMU): > - $(eval PROMU_TMP := $(shell mktemp -d)) > Index: patches/patch-_promu_yml > =================================================================== > RCS file: /cvs/ports/sysutils/prometheus/patches/patch-_promu_yml,v > diff -u -p -r1.6 patch-_promu_yml > --- patches/patch-_promu_yml 6 Sep 2023 10:28:49 -0000 1.6 > +++ patches/patch-_promu_yml 7 Mar 2026 15:56:42 -0000 > @@ -3,18 +3,18 @@ Don't include user and hostname into bui > Index: .promu.yml > --- .promu.yml.orig > +++ .promu.yml > -@@ -16,13 +16,13 @@ build: > - - builtinassets > +@@ -18,12 +18,13 @@ > windows: > - builtinassets > -- flags: -a > -+ flags: -v -a > - ldflags: | > + - stringlabels > +- ldflags: | > - -X github.com/prometheus/common/version.Version={{.Version}} > - -X > github.com/prometheus/common/version.Revision={{.Revision}} > - -X github.com/prometheus/common/version.Branch={{.Branch}} > - -X > github.com/prometheus/common/version.BuildUser={{user}}@{{host}} > - -X github.com/prometheus/common/version.BuildDate={{date > "20060102-15:04:05"}} > ++ flags: -v > ++ ldflags: | > + -X > github.com/prometheus/prometheus/vendor/github.com/prometheus/common/version.Version={{.Version}} > + -X > github.com/prometheus/prometheus/vendor/github.com/prometheus/common/version.Revision={{.Revision}} > + -X > github.com/prometheus/prometheus/vendor/github.com/prometheus/common/version.Branch={{.Branch}} > Index: patches/patch-mmap_openbsd > =================================================================== > RCS file: /cvs/ports/sysutils/prometheus/patches/patch-mmap_openbsd,v > diff -u -p -r1.3 patch-mmap_openbsd > --- patches/patch-mmap_openbsd 15 Jun 2023 08:52:07 -0000 1.3 > +++ patches/patch-mmap_openbsd 7 Mar 2026 15:56:42 -0000 > @@ -3,35 +3,42 @@ and https://github.com/prometheus/promet > to make tsdb only use mmap and work around missing UBC support. > > diff --git go.mod go.mod > -index 39c3fcb5b..760b39a8b 100644 > --- go.mod > +++ go.mod > -@@ -13,7 +13,6 @@ require ( > - github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 > - github.com/digitalocean/godo v1.81.0 > - github.com/docker/docker v20.10.24+incompatible > +@@ -17,7 +17,6 @@ > + github.com/dennwc/varint v1.0.0 > + github.com/digitalocean/godo v1.117.0 > + github.com/docker/docker v26.1.5+incompatible > - github.com/edsrzf/mmap-go v1.1.0 > - github.com/envoyproxy/go-control-plane v0.10.3 > - github.com/envoyproxy/protoc-gen-validate v0.6.7 > - github.com/fsnotify/fsnotify v1.5.4 > + github.com/envoyproxy/go-control-plane/envoy v1.32.4 > + github.com/envoyproxy/protoc-gen-validate v1.2.1 > + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb > + > diff --git go.sum go.sum > -index e7aee4a9b..6b323945d 100644 > --- go.sum > +++ go.sum > -@@ -202,8 +202,6 @@ github.com/eapache/go-resiliency v1.1.0/go.mod > h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m > +@@ -160,8 +160,6 @@ > github.com/eapache/go-xerial-snappy > v0.0.0-20180814174437-776d5712da21/go.mod > h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= > github.com/eapache/queue v1.1.0/go.mod > h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= > github.com/edsrzf/mmap-go v1.0.0/go.mod > h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= > -github.com/edsrzf/mmap-go v1.1.0 > h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= > -github.com/edsrzf/mmap-go v1.1.0/go.mod > h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= > - github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod > h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= > - github.com/emicklei/go-restful > v0.0.0-20170410110728-ff4f55a20633/go.mod > h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= > - github.com/emicklei/go-restful v2.9.5+incompatible/go.mod > h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= > + github.com/emicklei/go-restful/v3 v3.11.0 > h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= > + github.com/emicklei/go-restful/v3 v3.11.0/go.mod > h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= > + github.com/envoyproxy/go-control-plane v0.6.9/go.mod > h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= > + > diff --git promql/query_logger.go promql/query_logger.go > -index 716e7749b..8eb1afce0 100644 > --- promql/query_logger.go > +++ promql/query_logger.go > -@@ -22,13 +22,13 @@ import ( > +@@ -16,7 +16,6 @@ > + import ( > + "context" > + "encoding/json" > +- "errors" > + "fmt" > + "io" > + "os" > +@@ -25,16 +24,15 @@ > "time" > "unicode/utf8" > > @@ -46,43 +53,70 @@ index 716e7749b..8eb1afce0 100644 > + mw *fileutil.MmapWriter > getNextIndex chan int > logger log.Logger > +- closer io.Closer > maxConcurrent int > -@@ -81,7 +81,7 @@ func logUnfinishedQueries(filename string, filesize > int, logger log.Logger) { > + } > + > +@@ -87,24 +85,7 @@ > } > } > > --func getMMapedFile(filename string, filesize int, logger log.Logger) > ([]byte, error) { > +-type mmapedFile struct { > +- f io.Closer > +- m mmap.MMap > +-} > +- > +-func (f *mmapedFile) Close() error { > +- err := f.m.Unmap() > +- if err != nil { > +- err = fmt.Errorf("mmapedFile: unmapping: %w", err) > +- } > +- if fErr := f.f.Close(); fErr != nil { > +- return errors.Join(fmt.Errorf("close mmapedFile.f: %w", fErr), err) > +- } > +- > +- return err > +-} > +- > +-func getMMapedFile(filename string, filesize int, logger log.Logger) > ([]byte, io.Closer, error) { > +func getMMapedFile(filename string, filesize int, logger log.Logger) > (*fileutil.MmapWriter, error) { > file, err := os.OpenFile(filename, os.O_CREATE|os.O_RDWR|os.O_TRUNC, > 0o666) > if err != nil { > absPath, pathErr := filepath.Abs(filename) > -@@ -92,19 +92,13 @@ func getMMapedFile(filename string, filesize int, > logger log.Logger) ([]byte, er > - return nil, err > +@@ -112,24 +93,16 @@ > + absPath = filename > + } > + level.Error(logger).Log("msg", "Error opening query log file", > "file", absPath, "err", err) > +- return nil, nil, err > ++ return nil, err > } > > - err = file.Truncate(int64(filesize)) > -- if err != nil { > ++ mw, err := fileutil.NewMmapWriterWithSize(file, filesize) > + if err != nil { > +- file.Close() > - level.Error(logger).Log("msg", "Error setting filesize.", > "filesize", filesize, "err", err) > -- return nil, err > +- return nil, nil, err > - } > - > - fileAsBytes, err := mmap.Map(file, mmap.RDWR, 0) > -+ mw, err := fileutil.NewMmapWriterWithSize(file, filesize) > - if err != nil { > +- if err != nil { > +- file.Close() > level.Error(logger).Log("msg", "Failed to mmap", "file", filename, > "Attempted size", filesize, "err", err) > - return nil, err > +- return nil, nil, err > ++ return nil, err > } > > -- return fileAsBytes, err > +- return fileAsBytes, &mmapedFile{f: file, m: fileAsBytes}, err > + return mw, err > } > > func NewActiveQueryTracker(localStoragePath string, maxConcurrent > int, logger log.Logger) *ActiveQueryTracker { > -@@ -116,14 +110,17 @@ func NewActiveQueryTracker(localStoragePath > string, maxConcurrent int, logger lo > +@@ -141,15 +114,17 @@ > filename, filesize := filepath.Join(localStoragePath, > "queries.active"), 1+maxConcurrent*entrySize > logUnfinishedQueries(filename, filesize, logger) > > -- fileAsBytes, err := getMMapedFile(filename, filesize, logger) > +- fileAsBytes, closer, err := getMMapedFile(filename, filesize, > logger) > + mw, err := getMMapedFile(filename, filesize, logger) > if err != nil { > panic("Unable to create mmap-ed active query log") > @@ -95,11 +129,12 @@ index 716e7749b..8eb1afce0 100644 > + } > activeQueryTracker := ActiveQueryTracker{ > - mmapedFile: fileAsBytes, > +- closer: closer, > + mw: mw, > getNextIndex: make(chan int, maxConcurrent), > logger: logger, > maxConcurrent: maxConcurrent, > -@@ -180,19 +177,27 @@ func (tracker ActiveQueryTracker) > GetMaxConcurrent() int { > +@@ -206,19 +181,27 @@ > } > > func (tracker ActiveQueryTracker) Delete(insertIndex int) { > @@ -131,11 +166,26 @@ index 716e7749b..8eb1afce0 100644 > return i, nil > case <-ctx.Done(): > return 0, ctx.Err() > +@@ -227,11 +210,11 @@ > + > + // Close closes tracker. > + func (tracker *ActiveQueryTracker) Close() error { > +- if tracker == nil || tracker.closer == nil { > ++ if tracker == nil || tracker.mw == nil { > + return nil > + } > +- if err := tracker.closer.Close(); err != nil { > +- return fmt.Errorf("close ActiveQueryTracker.closer: %w", err) > ++ if err := tracker.mw.Close(); err != nil { > ++ return fmt.Errorf("close ActiveQueryTracker.mw: %w", err) > + } > + return nil > + } > + > diff --git promql/query_logger_test.go promql/query_logger_test.go > -index ad76fb992..bd92b81af 100644 > --- promql/query_logger_test.go > +++ promql/query_logger_test.go > -@@ -19,13 +19,22 @@ import ( > +@@ -20,13 +20,20 @@ > "testing" > > "github.com/grafana/regexp" > @@ -145,12 +195,10 @@ index ad76fb992..bd92b81af 100644 > > func TestQueryLogging(t *testing.T) { > - fileAsBytes := make([]byte, 4096) > -+ file, err := ioutil.TempFile("", "mmapedFile") > ++ dir := t.TempDir() > ++ file, err := os.CreateTemp(dir, "mmapedFile") > + require.NoError(t, err) > + > -+ filename := file.Name() > -+ defer os.Remove(filename) > -+ > + mw, err := fileutil.NewMmapWriterWithSize(file, 4096) > + require.NoError(t, err) > + > @@ -160,7 +208,7 @@ index ad76fb992..bd92b81af 100644 > logger: nil, > getNextIndex: make(chan int, 4), > } > -@@ -45,6 +54,7 @@ func TestQueryLogging(t *testing.T) { > +@@ -46,6 +53,7 @@ > `^{"query":"","timestamp_sec":\d+}\x00*,$`, > `^{"query":"SpecialCharQuery{host=\\"2132132\\", > id=123123}","timestamp_sec":\d+}\x00*,$`, > } > @@ -168,17 +216,15 @@ index ad76fb992..bd92b81af 100644 > > // Check for inserts of queries. > for i := 0; i < 4; i++ { > -@@ -67,9 +77,17 @@ func TestQueryLogging(t *testing.T) { > +@@ -68,9 +76,15 @@ > } > > func TestIndexReuse(t *testing.T) { > - queryBytes := make([]byte, 1+3*entrySize) > -+ file, err := ioutil.TempFile("", "mmapedFile") > ++ dir := t.TempDir() > ++ file, err := os.CreateTemp(dir, "mmapedFile") > + require.NoError(t, err) > + > -+ filename := file.Name() > -+ defer os.Remove(filename) > -+ > + mw, err := fileutil.NewMmapWriterWithSize(file, 1+3*entrySize) > + require.NoError(t, err) > + > @@ -188,7 +234,7 @@ index ad76fb992..bd92b81af 100644 > logger: nil, > getNextIndex: make(chan int, 3), > } > -@@ -91,6 +109,7 @@ func TestIndexReuse(t *testing.T) { > +@@ -92,6 +106,7 @@ > > `^{"query":"ThisShouldBeInsertedAtIndex2","timestamp_sec":\d+}\x00*,$`, > `^{"query":"TestQuery3","timestamp_sec":\d+}\x00*,$`, > } > @@ -196,26 +242,27 @@ index ad76fb992..bd92b81af 100644 > > // Check all bytes and verify new query was inserted at index 2 > for i := 0; i < 3; i++ { > -@@ -110,10 +129,12 @@ func TestMMapFile(t *testing.T) { > - filename := file.Name() > - defer os.Remove(filename) > +@@ -109,10 +124,12 @@ > + fpath := filepath.Join(dir, "mmapedFile") > + const data = "ab" > > -- fileAsBytes, err := getMMapedFile(filename, 2, nil) > -+ mw, err := getMMapedFile(filename, 2, nil) > +- fileAsBytes, closer, err := getMMapedFile(fpath, 2, nil) > ++ mw, err := getMMapedFile(fpath, 2, nil) > + require.NoError(t, err) > - > -+ fileAsBytes := mw.Bytes() > -+ _, err = mw.Write([]byte("ab")) > ++ > ++ _, err = mw.Write([]byte(data)) > require.NoError(t, err) > -- copy(fileAsBytes, "ab") > +- copy(fileAsBytes, data) > +- require.NoError(t, closer.Close()) > ++ require.NoError(t, mw.Close()) > > - f, err := os.Open(filename) > + f, err := os.Open(fpath) > require.NoError(t, err) > + > diff --git tsdb/fileutil/mmap.go tsdb/fileutil/mmap.go > -index 4dbca4f97..e1c522472 100644 > --- tsdb/fileutil/mmap.go > +++ tsdb/fileutil/mmap.go > -@@ -20,8 +20,31 @@ import ( > +@@ -19,8 +19,31 @@ > ) > > type MmapFile struct { > @@ -236,27 +283,27 @@ index 4dbca4f97..e1c522472 100644 > + if size <= 0 { > + info, err := f.Stat() > + if err != nil { > -+ return nil, errors.Wrap(err, "stat") > ++ return nil, fmt.Errorf("stat: %w", err) > + } > + size = int(info.Size()) > + } > + > + b, err := mmapRw(f, size) > + if err != nil { > -+ return nil, errors.Wrapf(err, "mmap, size %d", size) > ++ return nil, fmt.Errorf("mmap, size %d: %w", size, err) > + } > + return &MmapFile{f: f, b: b, rw: true}, nil > } > > func OpenMmapFile(path string) (*MmapFile, error) { > -@@ -46,22 +69,53 @@ func OpenMmapFileWithSize(path string, size int) > (mf *MmapFile, retErr error) { > +@@ -45,22 +68,53 @@ > size = int(info.Size()) > } > > - b, err := mmap(f, size) > + b, err := mmapRo(f, size) > if err != nil { > - return nil, errors.Wrapf(err, "mmap, size %d", size) > + return nil, fmt.Errorf("mmap, size %d: %w", size, err) > } > + return &MmapFile{f: f, b: b, closeFile: true}, nil > +} > @@ -265,11 +312,11 @@ index 4dbca4f97..e1c522472 100644 > +func (f *MmapFile) resize(size int) error { > + err := f.Sync() > + if err != nil { > -+ return errors.Wrap(err, "resize sync") > ++ return fmt.Errorf("resize sync: %w", err) > + } > + err = munmap(f.b) > + if err != nil { > -+ return errors.Wrap(err, "resize munmap") > ++ return fmt.Errorf("resize munmap: %w", err) > + } > + var b []byte > + if f.rw { > @@ -278,7 +325,7 @@ index 4dbca4f97..e1c522472 100644 > + b, err = mmapRo(f.f, size) > + } > + if err != nil { > -+ return errors.Wrap(err, "resize mmap") > ++ return fmt.Errorf("resize mmap: %w", err) > + } > + f.b = b > + return nil > @@ -296,22 +343,22 @@ index 4dbca4f97..e1c522472 100644 > > if err0 != nil { > - return err0 > -+ return errors.Wrap(err0, "close sync") > ++ return fmt.Errorf("close sync: %w", err0) > + } > + if err1 != nil { > -+ return errors.Wrap(err1, "close munmap") > ++ return fmt.Errorf("close munmap: %w", err1) > + } > + if err2 != nil { > -+ return errors.Wrap(err2, "close file") > ++ return fmt.Errorf("close file: %w", err2) > } > - return err1 > + return nil > } > > func (f *MmapFile) File() *os.File { > + > diff --git tsdb/fileutil/mmap_openbsd.go tsdb/fileutil/mmap_openbsd.go > new file mode 100644 > -index 000000000..39b590ee5 > --- /dev/null > +++ tsdb/fileutil/mmap_openbsd.go > @@ -0,0 +1,25 @@ > @@ -340,9 +387,9 @@ index 000000000..39b590ee5 > +func (f *MmapFile) Sync() error { > + return unix.Msync(f.b, unix.MS_SYNC) > +} > + > diff --git tsdb/fileutil/mmap_sync.go tsdb/fileutil/mmap_sync.go > new file mode 100644 > -index 000000000..31fd98e6d > --- /dev/null > +++ tsdb/fileutil/mmap_sync.go > @@ -0,0 +1,21 @@ > @@ -367,11 +414,20 @@ index 000000000..31fd98e6d > +func (f *MmapFile) Sync() error { > + return nil > +} > + > diff --git tsdb/fileutil/mmap_unix.go tsdb/fileutil/mmap_unix.go > -index 1fd7f48ff..c83a32011 100644 > --- tsdb/fileutil/mmap_unix.go > +++ tsdb/fileutil/mmap_unix.go > -@@ -22,10 +22,14 @@ import ( > +@@ -11,7 +11,7 @@ > + // See the License for the specific language governing permissions > and > + // limitations under the License. > + > +-//go:build !windows && !plan9 && !js > ++//go:build !windows && !plan9 && !js && !wasm > + > + package fileutil > + > +@@ -21,10 +21,14 @@ > "golang.org/x/sys/unix" > ) > > @@ -387,11 +443,11 @@ index 1fd7f48ff..c83a32011 100644 > func munmap(b []byte) (err error) { > return unix.Munmap(b) > } > + > diff --git tsdb/fileutil/mmap_windows.go tsdb/fileutil/mmap_windows.go > -index b94226412..9caf36622 100644 > --- tsdb/fileutil/mmap_windows.go > +++ tsdb/fileutil/mmap_windows.go > -@@ -19,7 +19,26 @@ import ( > +@@ -19,7 +19,26 @@ > "unsafe" > ) > > @@ -419,9 +475,9 @@ index b94226412..9caf36622 100644 > low, high := uint32(size), uint32(size>>32) > h, errno := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, > syscall.PAGE_READONLY, high, low, nil) > if h == 0 { > + > diff --git tsdb/fileutil/writer.go tsdb/fileutil/writer.go > new file mode 100644 > -index 000000000..86c1504e4 > --- /dev/null > +++ tsdb/fileutil/writer.go > @@ -0,0 +1,156 @@ > @@ -581,11 +637,11 @@ index 000000000..86c1504e4 > + err = mw.Sync() > + return > +} > + > diff --git tsdb/index/index.go tsdb/index/index.go > -index 29295c45f..451c80582 100644 > --- tsdb/index/index.go > +++ tsdb/index/index.go > -@@ -257,6 +257,7 @@ func (w *Writer) addPadding(size int) error { > +@@ -273,6 +273,7 @@ > type FileWriter struct { > f *os.File > fbuf *bufio.Writer > @@ -593,7 +649,7 @@ index 29295c45f..451c80582 100644 > pos uint64 > name string > } > -@@ -266,14 +267,20 @@ func NewFileWriter(name string) (*FileWriter, > error) { > +@@ -282,9 +283,11 @@ > if err != nil { > return nil, err > } > @@ -606,16 +662,18 @@ index 29295c45f..451c80582 100644 > pos: 0, > name: name, > }, nil > +@@ -294,6 +297,10 @@ > + return fw.pos > } > > +func (fw *FileWriter) Bytes() []byte { > + return fw.mw.Bytes() > +} > + > - func (fw *FileWriter) Pos() uint64 { > - return fw.pos > - } > -@@ -304,7 +311,7 @@ func (fw *FileWriter) WriteAt(buf []byte, pos > uint64) error { > + func (fw *FileWriter) Write(bufs ...[]byte) error { > + for _, b := range bufs { > + n, err := fw.fbuf.Write(b) > +@@ -320,7 +327,7 @@ > if err := fw.Flush(); err != nil { > return err > } > @@ -624,7 +682,7 @@ index 29295c45f..451c80582 100644 > return err > } > > -@@ -326,7 +333,7 @@ func (fw *FileWriter) Close() error { > +@@ -342,7 +349,7 @@ > if err := fw.Flush(); err != nil { > return err > } > @@ -633,7 +691,7 @@ index 29295c45f..451c80582 100644 > return err > } > return fw.f.Close() > -@@ -987,11 +994,11 @@ func (w *Writer) writePostings() error { > +@@ -1039,11 +1046,11 @@ > if err := w.fP.Flush(); err != nil { > return err > }