Index | Thread | Search

From:
Atanas Vladimirov <vlado@bsdbg.net>
Subject:
Re: Update Prometheus to 2.53.5
To:
Ports <ports@openbsd.org>
Cc:
claudio@openbsd.org
Date:
Fri, 13 Mar 2026 09:54:16 +0200

Download raw body.

Thread
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
>   	}