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
}