github.com/gaukas/goofys100m@v0.24.0/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  func LogPanic(err *error) {
    31  	if e := recover(); e != nil {
    32  		log.Errorf("stacktrace from panic: %v \n"+string(debug.Stack()), e)
    33  		if *err == nil {
    34  			*err = fuse.EIO
    35  		}
    36  	}
    37  }
    38  
    39  func (fs FusePanicLogger) StatFS(ctx context.Context, op *fuseops.StatFSOp) (err error) {
    40  	defer LogPanic(&err)
    41  	return fs.Fs.StatFS(ctx, op)
    42  }
    43  func (fs FusePanicLogger) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) (err error) {
    44  	defer LogPanic(&err)
    45  	return fs.Fs.LookUpInode(ctx, op)
    46  }
    47  func (fs FusePanicLogger) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) (err error) {
    48  	defer LogPanic(&err)
    49  	return fs.Fs.GetInodeAttributes(ctx, op)
    50  }
    51  func (fs FusePanicLogger) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) (err error) {
    52  	defer LogPanic(&err)
    53  	return fs.Fs.SetInodeAttributes(ctx, op)
    54  }
    55  func (fs FusePanicLogger) Fallocate(ctx context.Context, op *fuseops.FallocateOp) (err error) {
    56  	defer LogPanic(&err)
    57  	return fs.Fs.Fallocate(ctx, op)
    58  }
    59  func (fs FusePanicLogger) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) (err error) {
    60  	defer LogPanic(&err)
    61  	return fs.Fs.ForgetInode(ctx, op)
    62  }
    63  func (fs FusePanicLogger) MkDir(ctx context.Context, op *fuseops.MkDirOp) (err error) {
    64  	defer LogPanic(&err)
    65  	return fs.Fs.MkDir(ctx, op)
    66  }
    67  func (fs FusePanicLogger) MkNode(ctx context.Context, op *fuseops.MkNodeOp) (err error) {
    68  	defer LogPanic(&err)
    69  	return fs.Fs.MkNode(ctx, op)
    70  }
    71  func (fs FusePanicLogger) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) (err error) {
    72  	defer LogPanic(&err)
    73  	return fs.Fs.CreateFile(ctx, op)
    74  }
    75  func (fs FusePanicLogger) CreateLink(ctx context.Context, op *fuseops.CreateLinkOp) (err error) {
    76  	defer LogPanic(&err)
    77  	return fs.Fs.CreateLink(ctx, op)
    78  }
    79  func (fs FusePanicLogger) CreateSymlink(ctx context.Context, op *fuseops.CreateSymlinkOp) (err error) {
    80  	defer LogPanic(&err)
    81  	return fs.Fs.CreateSymlink(ctx, op)
    82  }
    83  func (fs FusePanicLogger) Rename(ctx context.Context, op *fuseops.RenameOp) (err error) {
    84  	defer LogPanic(&err)
    85  	return fs.Fs.Rename(ctx, op)
    86  }
    87  func (fs FusePanicLogger) RmDir(ctx context.Context, op *fuseops.RmDirOp) (err error) {
    88  	defer LogPanic(&err)
    89  	return fs.Fs.RmDir(ctx, op)
    90  }
    91  func (fs FusePanicLogger) Unlink(ctx context.Context, op *fuseops.UnlinkOp) (err error) {
    92  	defer LogPanic(&err)
    93  	return fs.Fs.Unlink(ctx, op)
    94  }
    95  func (fs FusePanicLogger) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) (err error) {
    96  	defer LogPanic(&err)
    97  	return fs.Fs.OpenDir(ctx, op)
    98  }
    99  func (fs FusePanicLogger) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) (err error) {
   100  	defer LogPanic(&err)
   101  	return fs.Fs.ReadDir(ctx, op)
   102  }
   103  func (fs FusePanicLogger) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) (err error) {
   104  	defer LogPanic(&err)
   105  	return fs.Fs.ReleaseDirHandle(ctx, op)
   106  }
   107  func (fs FusePanicLogger) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) (err error) {
   108  	defer LogPanic(&err)
   109  	return fs.Fs.OpenFile(ctx, op)
   110  }
   111  func (fs FusePanicLogger) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) (err error) {
   112  	defer LogPanic(&err)
   113  	return fs.Fs.ReadFile(ctx, op)
   114  }
   115  func (fs FusePanicLogger) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) (err error) {
   116  	defer LogPanic(&err)
   117  	return fs.Fs.WriteFile(ctx, op)
   118  }
   119  func (fs FusePanicLogger) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) (err error) {
   120  	defer LogPanic(&err)
   121  	return fs.Fs.SyncFile(ctx, op)
   122  }
   123  func (fs FusePanicLogger) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) (err error) {
   124  	defer LogPanic(&err)
   125  	return fs.Fs.FlushFile(ctx, op)
   126  }
   127  func (fs FusePanicLogger) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) (err error) {
   128  	defer LogPanic(&err)
   129  	return fs.Fs.ReleaseFileHandle(ctx, op)
   130  }
   131  func (fs FusePanicLogger) ReadSymlink(ctx context.Context, op *fuseops.ReadSymlinkOp) (err error) {
   132  	defer LogPanic(&err)
   133  	return fs.Fs.ReadSymlink(ctx, op)
   134  }
   135  func (fs FusePanicLogger) RemoveXattr(ctx context.Context, op *fuseops.RemoveXattrOp) (err error) {
   136  	defer LogPanic(&err)
   137  	return fs.Fs.RemoveXattr(ctx, op)
   138  }
   139  func (fs FusePanicLogger) GetXattr(ctx context.Context, op *fuseops.GetXattrOp) (err error) {
   140  	defer LogPanic(&err)
   141  	return fs.Fs.GetXattr(ctx, op)
   142  }
   143  func (fs FusePanicLogger) ListXattr(ctx context.Context, op *fuseops.ListXattrOp) (err error) {
   144  	defer LogPanic(&err)
   145  	return fs.Fs.ListXattr(ctx, op)
   146  }
   147  func (fs FusePanicLogger) SetXattr(ctx context.Context, op *fuseops.SetXattrOp) (err error) {
   148  	defer LogPanic(&err)
   149  	return fs.Fs.SetXattr(ctx, op)
   150  }
   151  
   152  func (fs FusePanicLogger) Destroy() {
   153  	fs.Fs.Destroy()
   154  }