ngvfs.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package openngvfs
  2. import (
  3. "context"
  4. "fmt"
  5. "git.swzry.com/ProjectNagae/FsUtils/amntfs"
  6. "git.swzry.com/zry/GoHiedaLogger/hiedalog"
  7. )
  8. type LogHandlerIntf interface {
  9. ChildFsError(mid int64, fstype, mountpoint, path, action string, rawErr error)
  10. NoAvailableMountPointForThisPath(path string, action string)
  11. InitError(err error)
  12. UnknownError(path string, action string, err error)
  13. FsInitWasm(name string)
  14. }
  15. type OpenNagaeVFS struct {
  16. root *amntfs.AMNTFS
  17. logger *hiedalog.HiedaLogger
  18. initWAVM *InitWAVM
  19. }
  20. func NewOpenNagaeVFS(logger *hiedalog.HiedaLogger) *OpenNagaeVFS {
  21. return &OpenNagaeVFS{
  22. root: amntfs.NewAMNTFS(),
  23. logger: logger,
  24. }
  25. }
  26. func (n *OpenNagaeVFS) errorProcess(path, action string, err error) error {
  27. if aErr, ok := err.(*amntfs.AMNTFSError); ok {
  28. rawErr := aErr.GetRawError()
  29. var rawErrStr string
  30. if rawErr != nil {
  31. rawErrStr = rawErr.Error()
  32. } else {
  33. rawErrStr = ""
  34. }
  35. switch aErr.GetErrNo() {
  36. case amntfs.ErrChildFsError:
  37. n.logger.LogComplex("ngvfs", hiedalog.DLN_ERROR, map[string]string{
  38. "type": "child_fs_error",
  39. "path": path,
  40. "fstype": aErr.GetFsType(),
  41. "action": action,
  42. "mnt": aErr.GetMountPoint(),
  43. "mid": fmt.Sprintf("%016X", aErr.GetMountId()),
  44. "raw_err": rawErrStr,
  45. })
  46. return rawErr
  47. case amntfs.ErrNoAvailableMountPointForThisPath:
  48. n.logger.LogComplex("ngvfs", hiedalog.DLN_ERROR, map[string]string{
  49. "type": "no_mnt_point_error",
  50. "path": path,
  51. "action": action,
  52. })
  53. return fmt.Errorf("no available mount point for path '%s'", path)
  54. default:
  55. n.logger.LogComplex("ngvfs", hiedalog.DLN_ERROR, map[string]string{
  56. "type": "unknown_error",
  57. "path": path,
  58. "action": action,
  59. "raw_err": err.Error(),
  60. })
  61. return err
  62. }
  63. } else {
  64. var xerrStr string
  65. if err != nil {
  66. xerrStr = err.Error()
  67. } else {
  68. xerrStr = ""
  69. }
  70. n.logger.LogComplex("ngvfs", hiedalog.DLN_ERROR, map[string]string{
  71. "type": "unknown_error",
  72. "path": path,
  73. "action": action,
  74. "raw_err": xerrStr,
  75. })
  76. }
  77. return err
  78. }
  79. func (n *OpenNagaeVFS) Init(ctx context.Context, nagaeRootEnv string, appName string) error {
  80. hmApi := NewWAVMHostAPI(n.root)
  81. vm, err := NewInitWAVM(ctx, hmApi, nagaeRootEnv, appName, n.logger)
  82. if err != nil {
  83. return fmt.Errorf("failed to init ngvfs: %w", err)
  84. }
  85. n.initWAVM = vm
  86. return n.initWAVM.Init()
  87. }
  88. func (n *OpenNagaeVFS) DeInit() error {
  89. if n.initWAVM == nil {
  90. return fmt.Errorf("deinit before init")
  91. }
  92. return n.initWAVM.DeInit()
  93. }
  94. func (n *OpenNagaeVFS) RunMount() error {
  95. if n.initWAVM == nil {
  96. return fmt.Errorf("deinit before init")
  97. }
  98. return n.initWAVM.AutoMount()
  99. }