initStorage initialize the driver and store to storagesMap
(ctx context.Context, storage model.Storage, storageDriver driver.Driver)
| 96 | |
| 97 | // initStorage initialize the driver and store to storagesMap |
| 98 | func initStorage(ctx context.Context, storage model.Storage, storageDriver driver.Driver) (err error) { |
| 99 | storageDriver.SetStorage(storage) |
| 100 | driverStorage := storageDriver.GetStorage() |
| 101 | defer func() { |
| 102 | if err := recover(); err != nil { |
| 103 | errInfo := fmt.Sprintf("[panic] err: %v\nstack: %s\n", err, getCurrentGoroutineStack()) |
| 104 | log.Errorf("panic init storage: %s", errInfo) |
| 105 | driverStorage.SetStatus(errInfo) |
| 106 | MustSaveDriverStorage(storageDriver) |
| 107 | storagesMap.Store(driverStorage.MountPath, storageDriver) |
| 108 | } |
| 109 | }() |
| 110 | // Unmarshal Addition |
| 111 | err = utils.Json.UnmarshalFromString(driverStorage.Addition, storageDriver.GetAddition()) |
| 112 | if err == nil { |
| 113 | if ref, ok := storageDriver.(driver.Reference); ok { |
| 114 | if strings.HasPrefix(driverStorage.Remark, "ref:/") { |
| 115 | refMountPath := driverStorage.Remark |
| 116 | i := strings.Index(refMountPath, "\n") |
| 117 | if i > 0 { |
| 118 | refMountPath = refMountPath[4:i] |
| 119 | } else { |
| 120 | refMountPath = refMountPath[4:] |
| 121 | } |
| 122 | var refStorage driver.Driver |
| 123 | refStorage, err = GetStorageByMountPath(refMountPath) |
| 124 | if err != nil { |
| 125 | err = fmt.Errorf("ref: %w", err) |
| 126 | } else { |
| 127 | err = ref.InitReference(refStorage) |
| 128 | if err != nil && errs.IsNotSupportError(err) { |
| 129 | err = fmt.Errorf("ref: storage is not %s", storageDriver.Config().Name) |
| 130 | } |
| 131 | } |
| 132 | } |
| 133 | } |
| 134 | } |
| 135 | if err == nil { |
| 136 | err = storageDriver.Init(ctx) |
| 137 | } |
| 138 | storagesMap.Store(driverStorage.MountPath, storageDriver) |
| 139 | if err != nil { |
| 140 | if IsUseOnlineAPI(storageDriver) { |
| 141 | driverStorage.SetStatus(utils.SanitizeHTML(err.Error())) |
| 142 | } else { |
| 143 | driverStorage.SetStatus(err.Error()) |
| 144 | } |
| 145 | err = errors.Wrap(err, "failed init storage") |
| 146 | } else { |
| 147 | driverStorage.SetStatus(WORK) |
| 148 | } |
| 149 | MustSaveDriverStorage(storageDriver) |
| 150 | return err |
| 151 | } |
| 152 | |
| 153 | func IsUseOnlineAPI(storageDriver driver.Driver) bool { |
| 154 | v := reflect.ValueOf(storageDriver.GetAddition()) |
no test coverage detected