github.com/adrianjagielak/goofys@v0.24.1-0.20230810095418-94919a5d2254/api/common/panic_logger.go (about)

     1  // Copyright 2019 Ka-Hing Cheung
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package common
    16  
    17  import (
    18  	"context"
    19  	"runtime/debug"
    20  
    21  	"github.com/jacobsa/fuse"
    22  	"github.com/jacobsa/fuse/fuseops"
    23  	"github.com/jacobsa/fuse/fuseutil"
    24  )
    25  
    26  type FusePanicLogger struct {
    27  	Fs fuseutil.FileSystem
    28  }
    29  
    30  var _ fuseutil.FileSystem = FusePanicLogger{}
    31  
    32  func LogPanic(err *error) {
    33  	if e := recover(); e != nil {
    34  		log.Errorf("stacktrace from panic: %v \n"+string(debug.Stack()), e)
    35  		if *err == nil {
    36  			*err = fuse.EIO
    37  		}
    38  	}
    39  }
    40  
    41  func (fs FusePanicLogger) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) (err error) {
    42  	defer LogPanic(&err)
    43  	return fs.Fs.BatchForget(ctx, op)
    44  }
    45  func (fs FusePanicLogger) StatFS(ctx context.Context, op *fuseops.StatFSOp) (err error) {
    46  	defer LogPanic(&err)
    47  	return fs.Fs.StatFS(ctx, op)
    48  }
    49  func (fs FusePanicLogger) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) (err error) {
    50  	defer LogPanic(&err)
    51  	return fs.Fs.LookUpInode(ctx, op)
    52  }
    53  func (fs FusePanicLogger) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) (err error) {
    54  	defer LogPanic(&err)
    55  	return fs.Fs.GetInodeAttributes(ctx, op)
    56  }
    57  func (fs FusePanicLogger) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) (err error) {
    58  	defer LogPanic(&err)
    59  	return fs.Fs.SetInodeAttributes(ctx, op)
    60  }
    61  func (fs FusePanicLogger) Fallocate(ctx context.Context, op *fuseops.FallocateOp) (err error) {
    62  	defer LogPanic(&err)
    63  	return fs.Fs.Fallocate(ctx, op)
    64  }
    65  func (fs FusePanicLogger) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) (err error) {
    66  	defer LogPanic(&err)
    67  	return fs.Fs.ForgetInode(ctx, op)
    68  }
    69  func (fs FusePanicLogger) MkDir(ctx context.Context, op *fuseops.MkDirOp) (err error) {
    70  	defer LogPanic(&err)
    71  	return fs.Fs.MkDir(ctx, op)
    72  }
    73  func (fs FusePanicLogger) MkNode(ctx context.Context, op *fuseops.MkNodeOp) (err error) {
    74  	defer LogPanic(&err)
    75  	return fs.Fs.MkNode(ctx, op)
    76  }
    77  func (fs FusePanicLogger) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) (err error) {
    78  	defer LogPanic(&err)
    79  	return fs.Fs.CreateFile(ctx, op)
    80  }
    81  func (fs FusePanicLogger) CreateLink(ctx context.Context, op *fuseops.CreateLinkOp) (err error) {
    82  	defer LogPanic(&err)
    83  	return fs.Fs.CreateLink(ctx, op)
    84  }
    85  func (fs FusePanicLogger) CreateSymlink(ctx context.Context, op *fuseops.CreateSymlinkOp) (err error) {
    86  	defer LogPanic(&err)
    87  	return fs.Fs.CreateSymlink(ctx, op)
    88  }
    89  func (fs FusePanicLogger) Rename(ctx context.Context, op *fuseops.RenameOp) (err error) {
    90  	defer LogPanic(&err)
    91  	return fs.Fs.Rename(ctx, op)
    92  }
    93  func (fs FusePanicLogger) RmDir(ctx context.Context, op *fuseops.RmDirOp) (err error) {
    94  	defer LogPanic(&err)
    95  	return fs.Fs.RmDir(ctx, op)
    96  }
    97  func (fs FusePanicLogger) Unlink(ctx context.Context, op *fuseops.UnlinkOp) (err error) {
    98  	defer LogPanic(&err)
    99  	return fs.Fs.Unlink(ctx, op)
   100  }
   101  func (fs FusePanicLogger) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) (err error) {
   102  	defer LogPanic(&err)
   103  	return fs.Fs.OpenDir(ctx, op)
   104  }
   105  func (fs FusePanicLogger) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) (err error) {
   106  	defer LogPanic(&err)
   107  	return fs.Fs.ReadDir(ctx, op)
   108  }
   109  func (fs FusePanicLogger) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) (err error) {
   110  	defer LogPanic(&err)
   111  	return fs.Fs.ReleaseDirHandle(ctx, op)
   112  }
   113  func (fs FusePanicLogger) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) (err error) {
   114  	defer LogPanic(&err)
   115  	return fs.Fs.OpenFile(ctx, op)
   116  }
   117  func (fs FusePanicLogger) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) (err error) {
   118  	defer LogPanic(&err)
   119  	return fs.Fs.ReadFile(ctx, op)
   120  }
   121  func (fs FusePanicLogger) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) (err error) {
   122  	defer LogPanic(&err)
   123  	return fs.Fs.WriteFile(ctx, op)
   124  }
   125  func (fs FusePanicLogger) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) (err error) {
   126  	defer LogPanic(&err)
   127  	return fs.Fs.SyncFile(ctx, op)
   128  }
   129  func (fs FusePanicLogger) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) (err error) {
   130  	defer LogPanic(&err)
   131  	return fs.Fs.FlushFile(ctx, op)
   132  }
   133  func (fs FusePanicLogger) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) (err error) {
   134  	defer LogPanic(&err)
   135  	return fs.Fs.ReleaseFileHandle(ctx, op)
   136  }
   137  func (fs FusePanicLogger) ReadSymlink(ctx context.Context, op *fuseops.ReadSymlinkOp) (err error) {
   138  	defer LogPanic(&err)
   139  	return fs.Fs.ReadSymlink(ctx, op)
   140  }
   141  func (fs FusePanicLogger) RemoveXattr(ctx context.Context, op *fuseops.RemoveXattrOp) (err error) {
   142  	defer LogPanic(&err)
   143  	return fs.Fs.RemoveXattr(ctx, op)
   144  }
   145  func (fs FusePanicLogger) GetXattr(ctx context.Context, op *fuseops.GetXattrOp) (err error) {
   146  	defer LogPanic(&err)
   147  	return fs.Fs.GetXattr(ctx, op)
   148  }
   149  func (fs FusePanicLogger) ListXattr(ctx context.Context, op *fuseops.ListXattrOp) (err error) {
   150  	defer LogPanic(&err)
   151  	return fs.Fs.ListXattr(ctx, op)
   152  }
   153  func (fs FusePanicLogger) SetXattr(ctx context.Context, op *fuseops.SetXattrOp) (err error) {
   154  	defer LogPanic(&err)
   155  	return fs.Fs.SetXattr(ctx, op)
   156  }
   157  
   158  func (fs FusePanicLogger) Destroy() {
   159  	fs.Fs.Destroy()
   160  }