LCOV - code coverage report
Current view: top level - pebble/vfs - logging_fs.go (source / functions) Hit Total Coverage
Test: 2024-08-08 08:17Z 3419a647 - tests + meta.lcov Lines: 92 109 84.4 %
Date: 2024-08-08 08:18:02 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 1.14