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.

models.go 3.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package stgmod
  2. import (
  3. "github.com/samber/lo"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. "gitlink.org.cn/cloudream/common/utils/sort2"
  6. )
  7. type ObjectBlock struct {
  8. ObjectID cdssdk.ObjectID `db:"ObjectID" json:"objectID"`
  9. Index int `db:"Index" json:"index"`
  10. NodeID cdssdk.NodeID `db:"NodeID" json:"nodeID"` // 这个块应该在哪个节点上
  11. FileHash string `db:"FileHash" json:"fileHash"`
  12. }
  13. type ObjectDetail struct {
  14. Object cdssdk.Object `json:"object"`
  15. PinnedAt []cdssdk.NodeID `json:"pinnedAt"`
  16. Blocks []ObjectBlock `json:"blocks"`
  17. }
  18. func NewObjectDetail(object cdssdk.Object, pinnedAt []cdssdk.NodeID, blocks []ObjectBlock) ObjectDetail {
  19. return ObjectDetail{
  20. Object: object,
  21. PinnedAt: pinnedAt,
  22. Blocks: blocks,
  23. }
  24. }
  25. func DetailsFromObjects(objects []cdssdk.Object) []ObjectDetail {
  26. details := make([]ObjectDetail, len(objects))
  27. for i, object := range objects {
  28. details[i] = ObjectDetail{
  29. Object: object,
  30. }
  31. }
  32. return details
  33. }
  34. // 将blocks放到对应的object中。要求objs和blocks都按ObjectID升序
  35. func DetailsFillObjectBlocks(objs []ObjectDetail, blocks []ObjectBlock) {
  36. blksCur := 0
  37. for i := range objs {
  38. obj := &objs[i]
  39. // 1. 查询Object和ObjectBlock时均按照ObjectID升序排序
  40. // 2. ObjectBlock结果集中的不同ObjectID数只会比Object结果集的少
  41. // 因此在两个结果集上同时从头开始遍历时,如果两边的ObjectID字段不同,那么一定是ObjectBlock这边的ObjectID > Object的ObjectID,
  42. // 此时让Object的遍历游标前进,直到两边的ObjectID再次相等
  43. for ; blksCur < len(blocks); blksCur++ {
  44. if blocks[blksCur].ObjectID != obj.Object.ObjectID {
  45. break
  46. }
  47. obj.Blocks = append(obj.Blocks, blocks[blksCur])
  48. }
  49. }
  50. }
  51. // 将pinnedAt放到对应的object中。要求objs和pinnedAt都按ObjectID升序
  52. func DetailsFillPinnedAt(objs []ObjectDetail, pinnedAt []cdssdk.PinnedObject) {
  53. pinnedCur := 0
  54. for i := range objs {
  55. obj := &objs[i]
  56. for ; pinnedCur < len(pinnedAt); pinnedCur++ {
  57. if pinnedAt[pinnedCur].ObjectID != obj.Object.ObjectID {
  58. break
  59. }
  60. obj.PinnedAt = append(obj.PinnedAt, pinnedAt[pinnedCur].StorageID)
  61. }
  62. }
  63. }
  64. type GrouppedObjectBlock struct {
  65. ObjectID cdssdk.ObjectID
  66. Index int
  67. FileHash string
  68. NodeIDs []cdssdk.NodeID
  69. }
  70. func (o *ObjectDetail) GroupBlocks() []GrouppedObjectBlock {
  71. grps := make(map[int]GrouppedObjectBlock)
  72. for _, block := range o.Blocks {
  73. grp, ok := grps[block.Index]
  74. if !ok {
  75. grp = GrouppedObjectBlock{
  76. ObjectID: block.ObjectID,
  77. Index: block.Index,
  78. FileHash: block.FileHash,
  79. }
  80. }
  81. grp.NodeIDs = append(grp.NodeIDs, block.NodeID)
  82. grps[block.Index] = grp
  83. }
  84. return sort2.Sort(lo.Values(grps), func(l, r GrouppedObjectBlock) int { return l.Index - r.Index })
  85. }
  86. type LocalMachineInfo struct {
  87. NodeID *cdssdk.NodeID `json:"nodeID"`
  88. ExternalIP string `json:"externalIP"`
  89. LocalIP string `json:"localIP"`
  90. LocationID cdssdk.LocationID `json:"locationID"`
  91. }
  92. type PackageAccessStat struct {
  93. PackageID cdssdk.PackageID `db:"PackageID" json:"packageID"`
  94. NodeID cdssdk.NodeID `db:"NodeID" json:"nodeID"`
  95. Amount float64 `db:"Amount" json:"Amount"` // 前一日的读取量的滑动平均值
  96. Counter float64 `db:"Counter" json:"counter"` // 当日的读取量
  97. }
  98. type ObjectAccessStat struct {
  99. ObjectID cdssdk.ObjectID `db:"ObjectID" json:"objectID"`
  100. NodeID cdssdk.NodeID `db:"NodeID" json:"nodeID"`
  101. Amount float64 `db:"Amount" json:"Amount"` // 前一日的读取量的滑动平均值
  102. Counter float64 `db:"Counter" json:"counter"` // 当日的读取量
  103. }
  104. type StorageDetail struct {
  105. Storage cdssdk.Storage `json:"storage"`
  106. Shard *cdssdk.ShardStorage `json:"shard"`
  107. Shared *cdssdk.SharedStorage `json:"shared"`
  108. }

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