@@ -8,14 +8,12 @@ import (
88 "os"
99
1010 "github.com/cespare/xxhash/v2"
11- "golang.org/x/sys/unix"
1211)
1312
14- // indexWriter handles writing index data to disk using pwrite-based writes .
13+ // indexWriter writes index data to disk via positional *os.File.WriteAt calls .
1514// File layout: [Header 64B][UserMetaLen 4B][UserMeta][AlgoConfigLen 4B][AlgoConfig][RAM Index (N+1)×10B][Payload Region][Metadata Region][Footer 32B]
1615type indexWriter struct {
1716 file * os.File
18- fd int // cached file descriptor for pwrite syscalls
1917
2018 // Region offsets (computed upfront for separated layout)
2119 payloadRegionOffset uint64
@@ -84,14 +82,13 @@ func newIndexWriter(path string, cfg *buildConfig, numBlocks uint32, algo blockB
8482 metadataRegionOffset := payloadRegionOffset + payloadRegionSize
8583
8684 // Pre-allocate disk blocks for space reservation
87- if err := preallocFile (int ( file . Fd ()) , int64 (estimatedSize )); err != nil {
85+ if err := preallocFile (file , int64 (estimatedSize )); err != nil {
8886 primaryErr := fmt .Errorf ("failed to allocate disk space: %w" , err )
8987 return nil , errors .Join (primaryErr , file .Close ())
9088 }
9189
9290 iw := & indexWriter {
9391 file : file ,
94- fd : int (file .Fd ()),
9592 payloadRegionOffset : payloadRegionOffset ,
9693 metadataRegionOffset : metadataRegionOffset ,
9794 userMetadataOffset : userMetadataOffset ,
@@ -136,7 +133,7 @@ func (iw *indexWriter) writePayloadsDirect(data []byte, offset uint64) error {
136133 if absoluteOffset + uint64 (len (data )) > iw .metadataRegionOffset {
137134 return fmt .Errorf ("writePayloadsDirect: write exceeds payload region boundary" )
138135 }
139- _ , err := unix . Pwrite ( iw .fd , data , int64 (absoluteOffset ))
136+ _ , err := iw .file . WriteAt ( data , int64 (absoluteOffset ))
140137 return err
141138}
142139
@@ -165,7 +162,7 @@ func (iw *indexWriter) recordAndWriteMetadata(metadata []byte) error {
165162 })
166163
167164 if len (metadata ) > 0 {
168- if _ , err := unix . Pwrite ( iw .fd , metadata , int64 (iw .metadataWriteOffset )); err != nil {
165+ if _ , err := iw .file . WriteAt ( metadata , int64 (iw .metadataWriteOffset )); err != nil {
169166 return err
170167 }
171168 if _ , err := iw .metadataHasher .Write (metadata ); err != nil {
@@ -202,7 +199,7 @@ func (iw *indexWriter) commitBlockWithData(metadata []byte, payloads []byte, num
202199 entrySize := iw .cfg .payloadSize + iw .cfg .fingerprintSize
203200 if entrySize > 0 && numKeys > 0 {
204201 payloadOffset := iw .payloadRegionOffset + iw .keyCount * uint64 (entrySize )
205- if _ , err := unix . Pwrite ( iw .fd , payloads , int64 (payloadOffset )); err != nil {
202+ if _ , err := iw .file . WriteAt ( payloads , int64 (payloadOffset )); err != nil {
206203 return err
207204 }
208205 iw .foldPayloadHash (xxhash .Sum64 (payloads ))
@@ -245,7 +242,7 @@ func (iw *indexWriter) finalize() error {
245242 // Write header at offset 0
246243 var headerBuf [headerSize ]byte
247244 iw .header .encodeTo (headerBuf [:])
248- if _ , err := unix . Pwrite ( iw .fd , headerBuf [:], 0 ); err != nil {
245+ if _ , err := iw .file . WriteAt ( headerBuf [:], 0 ); err != nil {
249246 primaryErr := fmt .Errorf ("write header failed: %w" , err )
250247 return errors .Join (primaryErr , iw .close ())
251248 }
@@ -255,7 +252,7 @@ func (iw *indexWriter) finalize() error {
255252 userMetaBuf := make ([]byte , 4 + len (iw .userMetadata ))
256253 binary .LittleEndian .PutUint32 (userMetaBuf , uint32 (len (iw .userMetadata )))
257254 copy (userMetaBuf [4 :], iw .userMetadata )
258- if _ , err := unix . Pwrite ( iw .fd , userMetaBuf , int64 (iw .userMetadataOffset )); err != nil {
255+ if _ , err := iw .file . WriteAt ( userMetaBuf , int64 (iw .userMetadataOffset )); err != nil {
259256 primaryErr := fmt .Errorf ("write user metadata failed: %w" , err )
260257 return errors .Join (primaryErr , iw .close ())
261258 }
@@ -267,7 +264,7 @@ func (iw *indexWriter) finalize() error {
267264 if algoConfigLen > 0 {
268265 iw .algo .EncodeGlobalConfigInto (algoConfigBuf [4 :])
269266 }
270- if _ , err := unix . Pwrite ( iw .fd , algoConfigBuf , int64 (iw .algoConfigOffset )); err != nil {
267+ if _ , err := iw .file . WriteAt ( algoConfigBuf , int64 (iw .algoConfigOffset )); err != nil {
271268 primaryErr := fmt .Errorf ("write algo config failed: %w" , err )
272269 return errors .Join (primaryErr , iw .close ())
273270 }
@@ -278,7 +275,7 @@ func (iw *indexWriter) finalize() error {
278275 offset := i * int (ramIndexEntrySize )
279276 encodeRAMIndexEntryTo (entry , ramIndexBuf [offset :])
280277 }
281- if _ , err := unix . Pwrite ( iw .fd , ramIndexBuf , int64 (iw .ramIndexOffset )); err != nil {
278+ if _ , err := iw .file . WriteAt ( ramIndexBuf , int64 (iw .ramIndexOffset )); err != nil {
282279 primaryErr := fmt .Errorf ("write RAM index failed: %w" , err )
283280 return errors .Join (primaryErr , iw .close ())
284281 }
@@ -290,7 +287,7 @@ func (iw *indexWriter) finalize() error {
290287 }
291288 var footerBuf [footerSize ]byte
292289 ftr .encodeTo (footerBuf [:])
293- if _ , err := unix . Pwrite ( iw .fd , footerBuf [:], int64 (iw .metadataWriteOffset )); err != nil {
290+ if _ , err := iw .file . WriteAt ( footerBuf [:], int64 (iw .metadataWriteOffset )); err != nil {
294291 primaryErr := fmt .Errorf ("write footer failed: %w" , err )
295292 return errors .Join (primaryErr , iw .close ())
296293 }
0 commit comments