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.1 kB

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

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