Line data Source code
1 : // Copyright 2023 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 : // of this source code is governed by a BSD-style license that can be found in 3 : // the LICENSE file. 4 : 5 : package objstorageprovider 6 : 7 : import ( 8 : "bufio" 9 : 10 : "github.com/cockroachdb/pebble/objstorage" 11 : "github.com/cockroachdb/pebble/vfs" 12 : ) 13 : 14 : // NewFileWritable returns a Writable that uses a file as underlying storage. 15 2 : func NewFileWritable(file vfs.File) objstorage.Writable { 16 2 : return newFileBufferedWritable(file) 17 2 : } 18 : 19 : type fileBufferedWritable struct { 20 : file vfs.File 21 : bw *bufio.Writer 22 : } 23 : 24 : var _ objstorage.Writable = (*fileBufferedWritable)(nil) 25 : 26 2 : func newFileBufferedWritable(file vfs.File) *fileBufferedWritable { 27 2 : return &fileBufferedWritable{ 28 2 : file: file, 29 2 : bw: bufio.NewWriter(file), 30 2 : } 31 2 : } 32 : 33 : // Write is part of the objstorage.Writable interface. 34 2 : func (w *fileBufferedWritable) Write(p []byte) error { 35 2 : // Ignoring the length written since bufio.Writer.Write is guaranteed to 36 2 : // return an error if the length written is < len(p). 37 2 : _, err := w.bw.Write(p) 38 2 : return err 39 2 : } 40 : 41 : // Finish is part of the objstorage.Writable interface. 42 2 : func (w *fileBufferedWritable) Finish() error { 43 2 : err := w.bw.Flush() 44 2 : if err == nil { 45 2 : err = w.file.Sync() 46 2 : } 47 2 : err = firstError(err, w.file.Close()) 48 2 : w.bw = nil 49 2 : w.file = nil 50 2 : return err 51 : } 52 : 53 : // Abort is part of the objstorage.Writable interface. 54 1 : func (w *fileBufferedWritable) Abort() { 55 1 : _ = w.file.Close() 56 1 : w.bw = nil 57 1 : w.file = nil 58 1 : } 59 : 60 2 : func firstError(err0, err1 error) error { 61 2 : if err0 != nil { 62 1 : return err0 63 1 : } 64 2 : return err1 65 : }