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 5.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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 `gorm:"column:ObjectID; primaryKey; type:bigint" json:"objectID"`
  9. Index int `gorm:"column:Index; primaryKey; type:int" json:"index"`
  10. StorageID cdssdk.StorageID `gorm:"column:StorageID; primaryKey; type:bigint" json:"storageID"` // 这个块应该在哪个节点上
  11. FileHash cdssdk.FileHash `gorm:"column:FileHash; type:char(68); not null" json:"fileHash"`
  12. }
  13. func (ObjectBlock) TableName() string {
  14. return "ObjectBlock"
  15. }
  16. type ObjectDetail struct {
  17. Object cdssdk.Object `json:"object"`
  18. PinnedAt []cdssdk.StorageID `json:"pinnedAt"`
  19. Blocks []ObjectBlock `json:"blocks"`
  20. }
  21. func NewObjectDetail(object cdssdk.Object, pinnedAt []cdssdk.StorageID, blocks []ObjectBlock) ObjectDetail {
  22. return ObjectDetail{
  23. Object: object,
  24. PinnedAt: pinnedAt,
  25. Blocks: blocks,
  26. }
  27. }
  28. func DetailsFromObjects(objects []cdssdk.Object) []ObjectDetail {
  29. details := make([]ObjectDetail, len(objects))
  30. for i, object := range objects {
  31. details[i] = ObjectDetail{
  32. Object: object,
  33. }
  34. }
  35. return details
  36. }
  37. // 将blocks放到对应的object中。要求objs和blocks都按ObjectID升序
  38. func DetailsFillObjectBlocks(objs []ObjectDetail, blocks []ObjectBlock) {
  39. blksCur := 0
  40. for i := range objs {
  41. obj := &objs[i]
  42. // 1. 查询Object和ObjectBlock时均按照ObjectID升序排序
  43. // 2. ObjectBlock结果集中的不同ObjectID数只会比Object结果集的少
  44. // 因此在两个结果集上同时从头开始遍历时,如果两边的ObjectID字段不同,那么一定是ObjectBlock这边的ObjectID > Object的ObjectID,
  45. // 此时让Object的遍历游标前进,直到两边的ObjectID再次相等
  46. for ; blksCur < len(blocks); blksCur++ {
  47. if blocks[blksCur].ObjectID != obj.Object.ObjectID {
  48. break
  49. }
  50. obj.Blocks = append(obj.Blocks, blocks[blksCur])
  51. }
  52. }
  53. }
  54. // 将pinnedAt放到对应的object中。要求objs和pinnedAt都按ObjectID升序
  55. func DetailsFillPinnedAt(objs []ObjectDetail, pinnedAt []cdssdk.PinnedObject) {
  56. pinnedCur := 0
  57. for i := range objs {
  58. obj := &objs[i]
  59. for ; pinnedCur < len(pinnedAt); pinnedCur++ {
  60. if pinnedAt[pinnedCur].ObjectID != obj.Object.ObjectID {
  61. break
  62. }
  63. obj.PinnedAt = append(obj.PinnedAt, pinnedAt[pinnedCur].StorageID)
  64. }
  65. }
  66. }
  67. type GrouppedObjectBlock struct {
  68. ObjectID cdssdk.ObjectID
  69. Index int
  70. FileHash cdssdk.FileHash
  71. StorageIDs []cdssdk.StorageID
  72. }
  73. func (o *ObjectDetail) GroupBlocks() []GrouppedObjectBlock {
  74. grps := make(map[int]GrouppedObjectBlock)
  75. for _, block := range o.Blocks {
  76. grp, ok := grps[block.Index]
  77. if !ok {
  78. grp = GrouppedObjectBlock{
  79. ObjectID: block.ObjectID,
  80. Index: block.Index,
  81. FileHash: block.FileHash,
  82. }
  83. }
  84. grp.StorageIDs = append(grp.StorageIDs, block.StorageID)
  85. grps[block.Index] = grp
  86. }
  87. return sort2.Sort(lo.Values(grps), func(l, r GrouppedObjectBlock) int { return l.Index - r.Index })
  88. }
  89. type LocalMachineInfo struct {
  90. HubID *cdssdk.HubID `json:"hubID"`
  91. ExternalIP string `json:"externalIP"`
  92. LocalIP string `json:"localIP"`
  93. LocationID cdssdk.LocationID `json:"locationID"`
  94. }
  95. type PackageAccessStat struct {
  96. PackageID cdssdk.PackageID `gorm:"column:PackageID; primaryKey; type:bigint" json:"packageID"`
  97. StorageID cdssdk.StorageID `gorm:"column:StorageID; primaryKey; type:bigint" json:"storageID"`
  98. Amount float64 `gorm:"column:Amount; type:double" json:"amount"` // 前一日的读取量的滑动平均值
  99. Counter float64 `gorm:"column:Counter; type:double" json:"counter"` // 当日的读取量
  100. }
  101. func (PackageAccessStat) TableName() string {
  102. return "PackageAccessStat"
  103. }
  104. type ObjectAccessStat struct {
  105. ObjectID cdssdk.ObjectID `gorm:"column:ObjectID; primaryKey; type:bigint" json:"objectID"`
  106. StorageID cdssdk.StorageID `gorm:"column:StorageID; primaryKey; type:bigint" json:"storageID"`
  107. Amount float64 `gorm:"column:Amount; type:float; not null" json:"amount"` // 前一日的读取量的滑动平均值
  108. Counter float64 `gorm:"column:Counter; type:float; not null" json:"counter"` // 当日的读取量
  109. }
  110. func (ObjectAccessStat) TableName() string {
  111. return "ObjectAccessStat"
  112. }
  113. type StorageDetail struct {
  114. Storage cdssdk.Storage `json:"storage"`
  115. MasterHub *cdssdk.Hub `json:"masterHub"`
  116. }
  117. type ObjectStorage struct {
  118. Manufacturer string `json:"manufacturer"`
  119. Region string `json:"region"`
  120. AK string `json:"access_key_id"`
  121. SK string `json:"secret_access_key"`
  122. Endpoint string `json:"endpoint"`
  123. Bucket string `json:"bucket"`
  124. }
  125. const (
  126. HuaweiCloud = "HuaweiCloud"
  127. AliCloud = "AliCloud"
  128. SugonCloud = "SugonCloud"
  129. )
  130. type LoadedPackageID struct {
  131. UserID cdssdk.UserID
  132. PackageID cdssdk.PackageID
  133. }

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