| @@ -15,9 +15,10 @@ func NewStringLockTarget() *StringLockTarget { | |||
| return &StringLockTarget{} | |||
| } | |||
| func (t *StringLockTarget) AddComponent(values ...any) *StringLockTarget { | |||
| // Add 添加一个Component,并将其内容设置为compValues | |||
| func (t *StringLockTarget) Add(compValues ...any) *StringLockTarget { | |||
| t.Components = append(t.Components, StringLockTargetComponet{ | |||
| Values: lo.Map(values, func(val any, index int) string { return fmt.Sprintf("%v", val) }), | |||
| Values: lo.Map(compValues, func(val any, index int) string { return fmt.Sprintf("%v", val) }), | |||
| }) | |||
| return t | |||
| @@ -14,20 +14,11 @@ type IPFSLockReqBuilder struct { | |||
| func (b *LockRequestBuilder) IPFS() *IPFSLockReqBuilder { | |||
| return &IPFSLockReqBuilder{LockRequestBuilder: b} | |||
| } | |||
| func (b *MetadataLockReqBuilder) IPFS() *IPFSLockReqBuilder { | |||
| return &IPFSLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *StorageLockReqBuilder) IPFS() *IPFSLockReqBuilder { | |||
| return &IPFSLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *IPFSLockReqBuilder) ReadOneRep(nodeID int, fileHash string) *IPFSLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath(nodeID), | |||
| Name: lockprovider.IPFS_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(fileHash), | |||
| Target: *lockprovider.NewStringLockTarget().Add(fileHash), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -36,7 +27,7 @@ func (b *IPFSLockReqBuilder) WriteOneRep(nodeID int, fileHash string) *IPFSLockR | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath(nodeID), | |||
| Name: lockprovider.IPFS_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(fileHash), | |||
| Target: *lockprovider.NewStringLockTarget().Add(fileHash), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -2,6 +2,7 @@ package reqbuilder | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock/service" | |||
| mylo "gitlink.org.cn/cloudream/common/utils/lo" | |||
| ) | |||
| @@ -9,8 +10,22 @@ type LockRequestBuilder struct { | |||
| locks []distlock.Lock | |||
| } | |||
| func NewBuilder() *LockRequestBuilder { | |||
| return &LockRequestBuilder{} | |||
| } | |||
| func (b *LockRequestBuilder) Build() distlock.LockRequest { | |||
| return distlock.LockRequest{ | |||
| Locks: mylo.ArrayClone(b.locks), | |||
| } | |||
| } | |||
| func (b *LockRequestBuilder) MutextLock(svc *service.Service) (*service.Mutex, error) { | |||
| mutex := service.NewMutex(svc, b.Build()) | |||
| err := mutex.Lock() | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| return mutex, nil | |||
| } | |||
| @@ -1,9 +1,6 @@ | |||
| package reqbuilder | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock/lockprovider" | |||
| ) | |||
| import "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| type MetadataLockReqBuilder struct { | |||
| *LockRequestBuilder | |||
| @@ -13,63 +10,6 @@ func (b *LockRequestBuilder) Metadata() *MetadataLockReqBuilder { | |||
| return &MetadataLockReqBuilder{LockRequestBuilder: b} | |||
| } | |||
| func (b *IPFSLockReqBuilder) Metadata() *MetadataLockReqBuilder { | |||
| return &MetadataLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *StorageLockReqBuilder) Metadata() *MetadataLockReqBuilder { | |||
| return &MetadataLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *MetadataLockReqBuilder) ReadOneNode(nodeID int) *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(nodeID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) WriteOneNode(nodeID int) *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(nodeID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) CreateOneNode() *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) ReadAnyNode() *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) WriteAnyNode(nodeID int) *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) CreateAnyNode() *MetadataLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataLockReqBuilder) makePath(tableName string) []string { | |||
| return []string{distlock.METADATA_LOCK_PATH_PREFIX, tableName} | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| package reqbuilder | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock/lockprovider" | |||
| ) | |||
| type MetadataBucketLockReqBuilder struct { | |||
| *MetadataLockReqBuilder | |||
| } | |||
| func (b *MetadataLockReqBuilder) Bucket() *MetadataBucketLockReqBuilder { | |||
| return &MetadataBucketLockReqBuilder{MetadataLockReqBuilder: b} | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) ReadOne(bucketID int) *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(bucketID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) WriteOne(bucketID int) *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(bucketID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) CreateOne(userID int, bucketName string) *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(userID, bucketName), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) ReadAny() *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_SET_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) WriteAny() *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_SET_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataBucketLockReqBuilder) CreateAny() *MetadataBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Bucket"), | |||
| Name: lockprovider.METADATA_SET_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| package reqbuilder | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock/lockprovider" | |||
| ) | |||
| type MetadataNodeLockReqBuilder struct { | |||
| *MetadataLockReqBuilder | |||
| } | |||
| func (b *MetadataLockReqBuilder) Node() *MetadataNodeLockReqBuilder { | |||
| return &MetadataNodeLockReqBuilder{MetadataLockReqBuilder: b} | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) ReadOne(nodeID int) *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(nodeID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) WriteOne(nodeID int) *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(nodeID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) CreateOne() *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_ELEMENT_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) ReadAny() *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) WriteAny() *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataNodeLockReqBuilder) CreateAny() *MetadataNodeLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("Node"), | |||
| Name: lockprovider.METADATA_SET_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -0,0 +1,63 @@ | |||
| package reqbuilder | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock/lockprovider" | |||
| ) | |||
| type MetadataUserBucketLockReqBuilder struct { | |||
| *MetadataLockReqBuilder | |||
| } | |||
| func (b *MetadataLockReqBuilder) UserBucket() *MetadataUserBucketLockReqBuilder { | |||
| return &MetadataUserBucketLockReqBuilder{MetadataLockReqBuilder: b} | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) ReadOne(bucketID int) *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(bucketID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) WriteOne(bucketID int) *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(bucketID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) CreateOne(userID int, bucketID int) *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_ELEMENT_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().Add(userID, bucketID), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) ReadAny() *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_SET_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) WriteAny() *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_SET_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| func (b *MetadataUserBucketLockReqBuilder) CreateAny() *MetadataUserBucketLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath("UserBucket"), | |||
| Name: lockprovider.METADATA_SET_CREATE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget(), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -15,19 +15,11 @@ func (b *LockRequestBuilder) Storage() *StorageLockReqBuilder { | |||
| return &StorageLockReqBuilder{LockRequestBuilder: b} | |||
| } | |||
| func (b *MetadataLockReqBuilder) Storage() *StorageLockReqBuilder { | |||
| return &StorageLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *IPFSLockReqBuilder) Storage() *StorageLockReqBuilder { | |||
| return &StorageLockReqBuilder{LockRequestBuilder: b.LockRequestBuilder} | |||
| } | |||
| func (b *StorageLockReqBuilder) ReadOneObject(storageID int, fileHash string) *StorageLockReqBuilder { | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath(storageID), | |||
| Name: lockprovider.STORAGE_ELEMENT_READ_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(fileHash), | |||
| Target: *lockprovider.NewStringLockTarget().Add(fileHash), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -36,7 +28,7 @@ func (b *StorageLockReqBuilder) WriteOneObject(storageID int, fileHash string) * | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath(storageID), | |||
| Name: lockprovider.STORAGE_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(fileHash), | |||
| Target: *lockprovider.NewStringLockTarget().Add(fileHash), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -45,7 +37,7 @@ func (b *StorageLockReqBuilder) CreateOneObject(storageID int, fileHash string) | |||
| b.locks = append(b.locks, distlock.Lock{ | |||
| Path: b.makePath(storageID), | |||
| Name: lockprovider.STORAGE_ELEMENT_WRITE_LOCK, | |||
| Target: *lockprovider.NewStringLockTarget().AddComponent(fileHash), | |||
| Target: *lockprovider.NewStringLockTarget().Add(fileHash), | |||
| }) | |||
| return b | |||
| } | |||
| @@ -1,6 +1,8 @@ | |||
| package service | |||
| import "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| import ( | |||
| "gitlink.org.cn/cloudream/common/pkg/distlock" | |||
| ) | |||
| type Mutex struct { | |||
| svc *Service | |||