LCOV - code coverage report
Current view: top level - pebble/vfs - logging_fs.go (source / functions) Hit Total Coverage
Test: 2024-08-12 08:17Z 791b3749 - meta test only.lcov Lines: 0 109 0.0 %
Date: 2024-08-12 08:17:45 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           0 : func WithLogging(fs FS, logFn LogFn) FS {
      16           0 :         return &loggingFS{
      17           0 :                 FS:    fs,
      18           0 :                 logFn: logFn,
      19           0 :         }
      20           0 : }
      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           0 : func (fs *loggingFS) Create(name string, category DiskWriteCategory) (File, error) {
      33           0 :         fs.logFn("create: %s", name)
      34           0 :         f, err := fs.FS.Create(name, category)
      35           0 :         if err != nil {
      36           0 :                 return nil, err
      37           0 :         }
      38           0 :         return newLoggingFile(f, name, fs.logFn), nil
      39             : }
      40             : 
      41           0 : func (fs *loggingFS) Open(name string, opts ...OpenOption) (File, error) {
      42           0 :         var optsStr string
      43           0 :         if len(opts) > 0 {
      44           0 :                 optsStr = " (options:"
      45           0 :                 for i := range opts {
      46           0 :                         optsStr += fmt.Sprintf(" %T", opts[i])
      47           0 :                 }
      48           0 :                 optsStr += ")"
      49             :         }
      50           0 :         fs.logFn("open: %s%s", name, optsStr)
      51           0 :         f, err := fs.FS.Open(name, opts...)
      52           0 :         if err != nil {
      53           0 :                 return nil, err
      54           0 :         }
      55           0 :         return newLoggingFile(f, name, fs.logFn), nil
      56             : }
      57             : 
      58             : func (fs *loggingFS) OpenReadWrite(
      59             :         name string, category DiskWriteCategory, opts ...OpenOption,
      60           0 : ) (File, error) {
      61           0 :         fs.logFn("open-read-write: %s", name)
      62           0 :         f, err := fs.FS.OpenReadWrite(name, category, opts...)
      63           0 :         if err != nil {
      64           0 :                 return nil, err
      65           0 :         }
      66           0 :         return newLoggingFile(f, name, fs.logFn), nil
      67             : }
      68             : 
      69           0 : func (fs *loggingFS) Link(oldname, newname string) error {
      70           0 :         fs.logFn("link: %s -> %s", oldname, newname)
      71           0 :         return fs.FS.Link(oldname, newname)
      72           0 : }
      73             : 
      74           0 : func (fs *loggingFS) OpenDir(name string) (File, error) {
      75           0 :         fs.logFn("open-dir: %s", name)
      76           0 :         f, err := fs.FS.OpenDir(name)
      77           0 :         if err != nil {
      78           0 :                 return nil, err
      79           0 :         }
      80           0 :         return newLoggingFile(f, name, fs.logFn), nil
      81             : }
      82             : 
      83           0 : func (fs *loggingFS) Rename(oldname, newname string) error {
      84           0 :         fs.logFn("rename: %s -> %s", oldname, newname)
      85           0 :         return fs.FS.Rename(oldname, newname)
      86           0 : }
      87             : 
      88             : func (fs *loggingFS) ReuseForWrite(
      89             :         oldname, newname string, category DiskWriteCategory,
      90           0 : ) (File, error) {
      91           0 :         fs.logFn("reuseForWrite: %s -> %s", oldname, newname)
      92           0 :         f, err := fs.FS.ReuseForWrite(oldname, newname, category)
      93           0 :         if err != nil {
      94           0 :                 return nil, err
      95           0 :         }
      96           0 :         return newLoggingFile(f, newname, fs.logFn), nil
      97             : }
      98             : 
      99           0 : func (fs *loggingFS) MkdirAll(dir string, perm os.FileMode) error {
     100           0 :         fs.logFn("mkdir-all: %s %#o", dir, perm)
     101           0 :         return fs.FS.MkdirAll(dir, perm)
     102           0 : }
     103             : 
     104           0 : func (fs *loggingFS) Lock(name string) (io.Closer, error) {
     105           0 :         fs.logFn("lock: %s", name)
     106           0 :         return fs.FS.Lock(name)
     107           0 : }
     108             : 
     109           0 : func (fs loggingFS) Remove(name string) error {
     110           0 :         fs.logFn("remove: %s", name)
     111           0 :         err := fs.FS.Remove(name)
     112           0 :         return err
     113           0 : }
     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           0 : func newLoggingFile(f File, name string, logFn LogFn) *loggingFile {
     130           0 :         return &loggingFile{
     131           0 :                 File:  f,
     132           0 :                 name:  name,
     133           0 :                 logFn: logFn,
     134           0 :         }
     135           0 : }
     136             : 
     137           0 : func (f *loggingFile) Close() error {
     138           0 :         f.logFn("close: %s", f.name)
     139           0 :         return f.File.Close()
     140           0 : }
     141             : 
     142           0 : func (f *loggingFile) Sync() error {
     143           0 :         f.logFn("sync: %s", f.name)
     144           0 :         return f.File.Sync()
     145           0 : }
     146             : 
     147           0 : func (f *loggingFile) SyncData() error {
     148           0 :         f.logFn("sync-data: %s", f.name)
     149           0 :         return f.File.SyncData()
     150           0 : }
     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           0 : func (f *loggingFile) ReadAt(p []byte, offset int64) (int, error) {
     158           0 :         f.logFn("read-at(%d, %d): %s", offset, len(p), f.name)
     159           0 :         return f.File.ReadAt(p, offset)
     160           0 : }
     161             : 
     162           0 : func (f *loggingFile) WriteAt(p []byte, offset int64) (int, error) {
     163           0 :         f.logFn("write-at(%d, %d): %s", offset, len(p), f.name)
     164           0 :         return f.File.WriteAt(p, offset)
     165           0 : }
     166             : 
     167           0 : func (f *loggingFile) Prefetch(offset int64, length int64) error {
     168           0 :         f.logFn("prefetch(%d, %d): %s", offset, length, f.name)
     169           0 :         return f.File.Prefetch(offset, length)
     170           0 : }

Generated by: LCOV version 1.14