LCOV - code coverage report
Current view: top level - pebble/vfs/vfs - logging_fs.go (source / functions) Coverage Total Hit
Test: 2025-03-22 08:23Z a45eb824 - tests only.lcov Lines: 84.4 % 109 92
Test Date: 2025-03-22 08:26:16 Functions: - 0 0

            Line data    Source code
       1              : // Copyright 2021 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 vfs
       6              : 
       7              : import (
       8              :         "fmt"
       9              :         "io"
      10              :         "os"
      11              : )
      12              : 
      13              : // WithLogging wraps an FS and logs filesystem modification operations to the
      14              : // given logFn.
      15            1 : func WithLogging(fs FS, logFn LogFn) FS {
      16            1 :         return &loggingFS{
      17            1 :                 FS:    fs,
      18            1 :                 logFn: logFn,
      19            1 :         }
      20            1 : }
      21              : 
      22              : // LogFn is a function that is used to capture a log when WithLogging is used.
      23              : type LogFn func(fmt string, args ...interface{})
      24              : 
      25              : type loggingFS struct {
      26              :         FS
      27              :         logFn LogFn
      28              : }
      29              : 
      30              : var _ FS = (*loggingFS)(nil)
      31              : 
      32            1 : func (fs *loggingFS) Create(name string, category DiskWriteCategory) (File, error) {
      33            1 :         fs.logFn("create: %s", name)
      34            1 :         f, err := fs.FS.Create(name, category)
      35            1 :         if err != nil {
      36            0 :                 return nil, err
      37            0 :         }
      38            1 :         return newLoggingFile(f, name, fs.logFn), nil
      39              : }
      40              : 
      41            1 : func (fs *loggingFS) Open(name string, opts ...OpenOption) (File, error) {
      42            1 :         var optsStr string
      43            1 :         if len(opts) > 0 {
      44            1 :                 optsStr = " (options:"
      45            1 :                 for i := range opts {
      46            1 :                         optsStr += fmt.Sprintf(" %T", opts[i])
      47            1 :                 }
      48            1 :                 optsStr += ")"
      49              :         }
      50            1 :         fs.logFn("open: %s%s", name, optsStr)
      51            1 :         f, err := fs.FS.Open(name, opts...)
      52            1 :         if err != nil {
      53            0 :                 return nil, err
      54            0 :         }
      55            1 :         return newLoggingFile(f, name, fs.logFn), nil
      56              : }
      57              : 
      58              : func (fs *loggingFS) OpenReadWrite(
      59              :         name string, category DiskWriteCategory, opts ...OpenOption,
      60            1 : ) (File, error) {
      61            1 :         fs.logFn("open-read-write: %s", name)
      62            1 :         f, err := fs.FS.OpenReadWrite(name, category, opts...)
      63            1 :         if err != nil {
      64            0 :                 return nil, err
      65            0 :         }
      66            1 :         return newLoggingFile(f, name, fs.logFn), nil
      67              : }
      68              : 
      69            1 : func (fs *loggingFS) Link(oldname, newname string) error {
      70            1 :         fs.logFn("link: %s -> %s", oldname, newname)
      71            1 :         return fs.FS.Link(oldname, newname)
      72            1 : }
      73              : 
      74            1 : func (fs *loggingFS) OpenDir(name string) (File, error) {
      75            1 :         fs.logFn("open-dir: %s", name)
      76            1 :         f, err := fs.FS.OpenDir(name)
      77            1 :         if err != nil {
      78            1 :                 return nil, err
      79            1 :         }
      80            1 :         return newLoggingFile(f, name, fs.logFn), nil
      81              : }
      82              : 
      83            1 : func (fs *loggingFS) Rename(oldname, newname string) error {
      84            1 :         fs.logFn("rename: %s -> %s", oldname, newname)
      85            1 :         return fs.FS.Rename(oldname, newname)
      86            1 : }
      87              : 
      88              : func (fs *loggingFS) ReuseForWrite(
      89              :         oldname, newname string, category DiskWriteCategory,
      90            1 : ) (File, error) {
      91            1 :         fs.logFn("reuseForWrite: %s -> %s", oldname, newname)
      92            1 :         f, err := fs.FS.ReuseForWrite(oldname, newname, category)
      93            1 :         if err != nil {
      94            0 :                 return nil, err
      95            0 :         }
      96            1 :         return newLoggingFile(f, newname, fs.logFn), nil
      97              : }
      98              : 
      99            1 : func (fs *loggingFS) MkdirAll(dir string, perm os.FileMode) error {
     100            1 :         fs.logFn("mkdir-all: %s %#o", dir, perm)
     101            1 :         return fs.FS.MkdirAll(dir, perm)
     102            1 : }
     103              : 
     104            1 : func (fs *loggingFS) Lock(name string) (io.Closer, error) {
     105            1 :         fs.logFn("lock: %s", name)
     106            1 :         return fs.FS.Lock(name)
     107            1 : }
     108              : 
     109            1 : func (fs loggingFS) Remove(name string) error {
     110            1 :         fs.logFn("remove: %s", name)
     111            1 :         err := fs.FS.Remove(name)
     112            1 :         return err
     113            1 : }
     114              : 
     115            0 : func (fs loggingFS) RemoveAll(name string) error {
     116            0 :         fs.logFn("remove-all: %s", name)
     117            0 :         err := fs.FS.RemoveAll(name)
     118            0 :         return err
     119            0 : }
     120              : 
     121              : type loggingFile struct {
     122              :         File
     123              :         name  string
     124              :         logFn LogFn
     125              : }
     126              : 
     127              : var _ File = (*loggingFile)(nil)
     128              : 
     129            1 : func newLoggingFile(f File, name string, logFn LogFn) *loggingFile {
     130            1 :         return &loggingFile{
     131            1 :                 File:  f,
     132            1 :                 name:  name,
     133            1 :                 logFn: logFn,
     134            1 :         }
     135            1 : }
     136              : 
     137            1 : func (f *loggingFile) Close() error {
     138            1 :         f.logFn("close: %s", f.name)
     139            1 :         return f.File.Close()
     140            1 : }
     141              : 
     142            1 : func (f *loggingFile) Sync() error {
     143            1 :         f.logFn("sync: %s", f.name)
     144            1 :         return f.File.Sync()
     145            1 : }
     146              : 
     147            1 : func (f *loggingFile) SyncData() error {
     148            1 :         f.logFn("sync-data: %s", f.name)
     149            1 :         return f.File.SyncData()
     150            1 : }
     151              : 
     152            0 : func (f *loggingFile) SyncTo(length int64) (fullSync bool, err error) {
     153            0 :         f.logFn("sync-to(%d): %s", length, f.name)
     154            0 :         return f.File.SyncTo(length)
     155            0 : }
     156              : 
     157            1 : func (f *loggingFile) ReadAt(p []byte, offset int64) (int, error) {
     158            1 :         f.logFn("read-at(%d, %d): %s", offset, len(p), f.name)
     159            1 :         return f.File.ReadAt(p, offset)
     160            1 : }
     161              : 
     162            1 : func (f *loggingFile) WriteAt(p []byte, offset int64) (int, error) {
     163            1 :         f.logFn("write-at(%d, %d): %s", offset, len(p), f.name)
     164            1 :         return f.File.WriteAt(p, offset)
     165            1 : }
     166              : 
     167            1 : func (f *loggingFile) Prefetch(offset int64, length int64) error {
     168            1 :         f.logFn("prefetch(%d, %d): %s", offset, length, f.name)
     169            1 :         return f.File.Prefetch(offset, length)
     170            1 : }
        

Generated by: LCOV version 2.0-1