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.

shard_store.go 3.5 kB

1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package ops2
  2. import (
  3. "fmt"
  4. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/dag"
  5. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/exec"
  6. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/pool"
  7. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  8. )
  9. func init() {
  10. exec.UseOp[*GetShardInfo]()
  11. exec.UseOp[*StoreShard]()
  12. }
  13. type GetShardInfo struct {
  14. UserSpace jcstypes.UserSpaceDetail
  15. FileHash jcstypes.FileHash
  16. ShardInfo exec.VarID
  17. }
  18. func (o *GetShardInfo) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  19. stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
  20. if err != nil {
  21. return fmt.Errorf("getting shard store: %w", err)
  22. }
  23. store, err := stgPool.GetShardStore(&o.UserSpace)
  24. if err != nil {
  25. return fmt.Errorf("getting shard store: %w", err)
  26. }
  27. info, err := store.Info(o.FileHash)
  28. if err != nil {
  29. return fmt.Errorf("getting shard info: %w", err)
  30. }
  31. e.PutVar(o.ShardInfo, &FileInfoValue{
  32. FileInfo: info,
  33. })
  34. return nil
  35. }
  36. func (o *GetShardInfo) String() string {
  37. return fmt.Sprintf("GetShardInfo(%v)", o.FileHash)
  38. }
  39. type StoreShard struct {
  40. UserSpace jcstypes.UserSpaceDetail
  41. FileInfo exec.VarID
  42. ShardInfo exec.VarID
  43. }
  44. func (o *StoreShard) Execute(ctx *exec.ExecContext, e *exec.Executor) error {
  45. stgPool, err := exec.GetValueByType[*pool.Pool](ctx)
  46. if err != nil {
  47. return fmt.Errorf("getting storage pool: %w", err)
  48. }
  49. store, err := stgPool.GetShardStore(&o.UserSpace)
  50. if err != nil {
  51. return fmt.Errorf("getting shard store: %w", err)
  52. }
  53. info, err := exec.BindVar[*FileInfoValue](e, ctx.Context, o.FileInfo)
  54. if err != nil {
  55. return err
  56. }
  57. stored, err := store.Store(info.Path, info.Hash, info.Size)
  58. if err != nil {
  59. return fmt.Errorf("adding shard: %w", err)
  60. }
  61. e.PutVar(o.ShardInfo, &FileInfoValue{
  62. FileInfo: stored,
  63. })
  64. return nil
  65. }
  66. func (o *StoreShard) String() string {
  67. return fmt.Sprintf("StoreShard: addInfo=%v, shardInfo=%v", o.FileInfo, o.ShardInfo)
  68. }
  69. type GetShardInfoNode struct {
  70. dag.NodeBase
  71. UserSpace jcstypes.UserSpaceDetail
  72. FileHash jcstypes.FileHash
  73. }
  74. func (b *GraphNodeBuilder) NewGetShardInfo(userSpace jcstypes.UserSpaceDetail, fileHash jcstypes.FileHash) *GetShardInfoNode {
  75. node := &GetShardInfoNode{
  76. UserSpace: userSpace,
  77. FileHash: fileHash,
  78. }
  79. b.AddNode(node)
  80. node.OutputValues().Init(node, 1)
  81. return node
  82. }
  83. func (n *GetShardInfoNode) FileInfoVar() dag.ValueOutputSlot {
  84. return dag.ValueOutputSlot{
  85. Node: n,
  86. Index: 0,
  87. }
  88. }
  89. func (n *GetShardInfoNode) GenerateOp() (exec.Op, error) {
  90. return &GetShardInfo{
  91. UserSpace: n.UserSpace,
  92. FileHash: n.FileHash,
  93. ShardInfo: n.FileInfoVar().Var().VarID,
  94. }, nil
  95. }
  96. type StoreShardNode struct {
  97. dag.NodeBase
  98. UserSpace jcstypes.UserSpaceDetail
  99. ShardInfoKey string
  100. }
  101. func (b *GraphNodeBuilder) NewStoreShard(userSpace jcstypes.UserSpaceDetail, shardInfoKey string) *StoreShardNode {
  102. node := &StoreShardNode{
  103. UserSpace: userSpace,
  104. ShardInfoKey: shardInfoKey,
  105. }
  106. b.AddNode(node)
  107. node.InputValues().Init(1)
  108. node.OutputValues().Init(node, 1)
  109. return node
  110. }
  111. func (t *StoreShardNode) FileInfoSlot() dag.ValueInputSlot {
  112. return dag.ValueInputSlot{
  113. Node: t,
  114. Index: 0,
  115. }
  116. }
  117. func (t *StoreShardNode) ShardInfoVar() dag.ValueOutputSlot {
  118. return dag.ValueOutputSlot{
  119. Node: t,
  120. Index: 0,
  121. }
  122. }
  123. func (t *StoreShardNode) GenerateOp() (exec.Op, error) {
  124. return &StoreShard{
  125. UserSpace: t.UserSpace,
  126. FileInfo: t.FileInfoSlot().Var().VarID,
  127. ShardInfo: t.ShardInfoVar().Var().VarID,
  128. }, nil
  129. }

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