refactor: optimize driver initialization need to manually deserialize and assign values, and remove redundant driver registration parameters (#2691)

* refactor: optimize driver initialization need to manually deserialize and assign values, and remove redundant driver registration parameters

* fix typo

Co-authored-by: Noah Hsu <i@nn.ci>
This commit is contained in:
foxxorcat
2022-12-13 18:03:30 +08:00
committed by GitHub
parent 3ee45c69a7
commit 33bae52fa1
67 changed files with 194 additions and 392 deletions

View File

@ -17,11 +17,11 @@ type Meta interface {
Config() Config
// GetStorage just get raw storage, no need to implement, because model.Storage have implemented
GetStorage() *model.Storage
// GetAddition Additional can't be modified externally, so needn't return pointer
SetStorage(model.Storage)
// GetAddition Additional is used for unmarshal of JSON, so need return pointer
GetAddition() Additional
// Init If already initialized, drop first
// need to unmarshal string to addition first
Init(ctx context.Context, storage model.Storage) error
Init(ctx context.Context) error
Drop(ctx context.Context) error
}

View File

@ -33,6 +33,10 @@ func (s *Storage) GetStorage() *Storage {
return s
}
func (s *Storage) SetStorage(storage Storage) {
*s = storage
}
func (s *Storage) SetStatus(status string) {
s.Status = status
}

View File

@ -15,10 +15,12 @@ type New func() driver.Driver
var driverNewMap = map[string]New{}
var driverInfoMap = map[string]driver.Info{}
func RegisterDriver(config driver.Config, driver New) {
func RegisterDriver(driver New) {
// log.Infof("register driver: [%s]", config.Name)
registerDriverItems(config, driver().GetAddition())
driverNewMap[config.Name] = driver
tempDriver := driver()
tempConfig := tempDriver.Config()
registerDriverItems(tempConfig, tempDriver.GetAddition())
driverNewMap[tempConfig.Name] = driver
}
func GetDriverNew(name string) (New, error) {
@ -44,6 +46,9 @@ func GetDriverInfoMap() map[string]driver.Info {
func registerDriverItems(config driver.Config, addition driver.Additional) {
// log.Debugf("addition of %s: %+v", config.Name, addition)
tAddition := reflect.TypeOf(addition)
for tAddition.Kind() == reflect.Pointer {
tAddition = tAddition.Elem()
}
mainItems := getMainItems(config)
additionalItems := getAdditionalItems(tAddition, config.DefaultRoot)
driverInfoMap[config.Name] = driver.Info{

View File

@ -2,7 +2,6 @@ package op
import (
"context"
"fmt"
"sort"
"strings"
"time"
@ -56,15 +55,9 @@ func CreateStorage(ctx context.Context, storage model.Storage) (uint, error) {
return storage.ID, errors.WithMessage(err, "failed create storage in database")
}
// already has an id
err = storageDriver.Init(ctx, storage)
storagesMap.Store(storage.MountPath, storageDriver)
err = initStorage(ctx, storage, storageDriver)
if err != nil {
storageDriver.GetStorage().SetStatus(fmt.Sprintf("%+v", err.Error()))
MustSaveDriverStorage(storageDriver)
return storage.ID, errors.Wrapf(err, "failed init storage but storage is already created")
} else {
storageDriver.GetStorage().SetStatus(WORK)
MustSaveDriverStorage(storageDriver)
return storage.ID, errors.Wrap(err, "failed init storage but storage is already created")
}
log.Debugf("storage %+v is created", storageDriver)
return storage.ID, nil
@ -80,18 +73,31 @@ func LoadStorage(ctx context.Context, storage model.Storage) error {
return errors.WithMessage(err, "failed get driver new")
}
storageDriver := driverNew()
err = storageDriver.Init(ctx, storage)
storagesMap.Store(storage.MountPath, storageDriver)
if err != nil {
storageDriver.GetStorage().SetStatus(fmt.Sprintf("%+v", err.Error()))
MustSaveDriverStorage(storageDriver)
return errors.Wrapf(err, "failed init storage")
} else {
storageDriver.GetStorage().SetStatus(WORK)
MustSaveDriverStorage(storageDriver)
}
err = initStorage(ctx, storage, storageDriver)
log.Debugf("storage %+v is created", storageDriver)
return nil
return err
}
// initStorage initialize the driver and store to storagesMap
func initStorage(ctx context.Context, storage model.Storage, storageDriver driver.Driver) (err error) {
storageDriver.SetStorage(storage)
driverStorage := storageDriver.GetStorage()
// Unmarshal Addition
err = utils.Json.UnmarshalFromString(driverStorage.Addition, storageDriver.GetAddition())
if err == nil {
err = storageDriver.Init(ctx)
}
storagesMap.Store(driverStorage.MountPath, storageDriver)
if err != nil {
driverStorage.SetStatus(err.Error())
err = errors.Wrap(err, "failed init storage")
} else {
driverStorage.SetStatus(WORK)
}
MustSaveDriverStorage(storageDriver)
return err
}
func EnableStorage(ctx context.Context, id uint) error {
@ -128,7 +134,7 @@ func DisableStorage(ctx context.Context, id uint) error {
}
// drop the storage in the driver
if err := storageDriver.Drop(ctx); err != nil {
return errors.Wrapf(err, "failed drop storage")
return errors.Wrap(err, "failed drop storage")
}
// delete the storage in the memory
storage.Disabled = true
@ -172,17 +178,10 @@ func UpdateStorage(ctx context.Context, storage model.Storage) error {
if err != nil {
return errors.Wrapf(err, "failed drop storage")
}
err = storageDriver.Init(ctx, storage)
storagesMap.Store(storage.MountPath, storageDriver)
if err != nil {
storageDriver.GetStorage().SetStatus(fmt.Sprintf("%+v", err.Error()))
MustSaveDriverStorage(storageDriver)
return errors.Wrapf(err, "failed init storage")
} else {
storageDriver.GetStorage().SetStatus(WORK)
MustSaveDriverStorage(storageDriver)
}
return nil
err = initStorage(ctx, storage, storageDriver)
log.Debugf("storage %+v is update", storageDriver)
return err
}
func DeleteStorageById(ctx context.Context, id uint) error {
@ -220,11 +219,11 @@ func MustSaveDriverStorage(driver driver.Driver) {
func saveDriverStorage(driver driver.Driver) error {
storage := driver.GetStorage()
addition := driver.GetAddition()
bytes, err := utils.Json.Marshal(addition)
strs, err := utils.Json.MarshalToString(addition)
if err != nil {
return errors.Wrap(err, "error while marshal addition")
}
storage.Addition = string(bytes)
storage.Addition = strs
err = db.UpdateStorage(storage)
if err != nil {
return errors.WithMessage(err, "failed update storage in database")

View File

@ -64,7 +64,7 @@ func GetIgnorePaths() ([]string, error) {
for _, storage := range storages {
if utils.SliceContains(skipDrivers, storage.Config().Name) {
if storage.Config().Name == "AList V3" {
addition := storage.GetAddition().(alist_v3.Addition)
addition := storage.GetAddition().(*alist_v3.Addition)
allowIndexed, visited := v3Visited[addition.Address]
if !visited {
url := addition.Address + "/api/public/settings"