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 }