You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

check_unavailable_cache.go 1.5 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package event
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/jmoiron/sqlx"
  6. "github.com/samber/lo"
  7. "gitlink.org.cn/cloudream/common/consts"
  8. "gitlink.org.cn/cloudream/common/utils/logger"
  9. "gitlink.org.cn/cloudream/db/model"
  10. mysql "gitlink.org.cn/cloudream/db/sql"
  11. )
  12. type CheckUnavailableCache struct {
  13. NodeID int
  14. }
  15. func NewCheckUnavailableCache(nodeID int) *CheckUnavailableCache {
  16. return &CheckUnavailableCache{
  17. NodeID: nodeID,
  18. }
  19. }
  20. func (t *CheckUnavailableCache) TryMerge(other Event) bool {
  21. event, ok := other.(*CheckUnavailableCache)
  22. if !ok {
  23. return false
  24. }
  25. if event.NodeID != t.NodeID {
  26. return false
  27. }
  28. return true
  29. }
  30. func (t *CheckUnavailableCache) Execute(execCtx ExecuteContext) {
  31. err := execCtx.Args.DB.DoTx(sql.LevelSerializable, func(tx *sqlx.Tx) error {
  32. node, err := mysql.Node.GetByID(tx, t.NodeID)
  33. if err == sql.ErrNoRows {
  34. return nil
  35. }
  36. if err != nil {
  37. return fmt.Errorf("get node failed, err: %w", err)
  38. }
  39. if node.State != consts.NODE_STATE_UNAVAILABLE {
  40. return nil
  41. }
  42. caches, err := mysql.Cache.GetNodeCaches(tx, t.NodeID)
  43. if err != nil {
  44. return fmt.Errorf("get node caches failed, err: %w", err)
  45. }
  46. err = mysql.Cache.DeleteNodeAll(tx, t.NodeID)
  47. if err != nil {
  48. return fmt.Errorf("delete node all caches failed, err: %w", err)
  49. }
  50. execCtx.Executor.Post(NewCheckRepCount(lo.Map(caches, func(ch model.Cache, index int) string { return ch.HashValue })))
  51. return nil
  52. })
  53. if err != nil {
  54. logger.WithField("NodeID", t.NodeID).Warn(err.Error())
  55. }
  56. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。