From 085ac704237eb90c2da4191734ff53994cffcbcb Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Wed, 14 Jun 2023 10:44:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=96=E6=B6=88db=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?sql=E5=8C=85=EF=BC=9B=E7=BB=99CreateBucket=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8A=E9=94=81=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lockprovider/string_lock_target.go | 5 +- pkg/distlock/reqbuilder/ipfs.go | 13 +--- .../reqbuilder/lock_request_builder.go | 15 +++++ pkg/distlock/reqbuilder/metadata.go | 62 +----------------- pkg/distlock/reqbuilder/metadata_bucket.go | 63 +++++++++++++++++++ pkg/distlock/reqbuilder/metadata_node.go | 63 +++++++++++++++++++ .../reqbuilder/metadata_user_bucket.go | 63 +++++++++++++++++++ pkg/distlock/reqbuilder/storage.go | 14 +---- pkg/distlock/service/mutex.go | 4 +- 9 files changed, 216 insertions(+), 86 deletions(-) create mode 100644 pkg/distlock/reqbuilder/metadata_bucket.go create mode 100644 pkg/distlock/reqbuilder/metadata_node.go create mode 100644 pkg/distlock/reqbuilder/metadata_user_bucket.go diff --git a/pkg/distlock/lockprovider/string_lock_target.go b/pkg/distlock/lockprovider/string_lock_target.go index afc6ceb..b674fd1 100644 --- a/pkg/distlock/lockprovider/string_lock_target.go +++ b/pkg/distlock/lockprovider/string_lock_target.go @@ -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 diff --git a/pkg/distlock/reqbuilder/ipfs.go b/pkg/distlock/reqbuilder/ipfs.go index 2fee8e4..292953c 100644 --- a/pkg/distlock/reqbuilder/ipfs.go +++ b/pkg/distlock/reqbuilder/ipfs.go @@ -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 } diff --git a/pkg/distlock/reqbuilder/lock_request_builder.go b/pkg/distlock/reqbuilder/lock_request_builder.go index b475992..8ab84ff 100644 --- a/pkg/distlock/reqbuilder/lock_request_builder.go +++ b/pkg/distlock/reqbuilder/lock_request_builder.go @@ -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 +} diff --git a/pkg/distlock/reqbuilder/metadata.go b/pkg/distlock/reqbuilder/metadata.go index 089d945..1403331 100644 --- a/pkg/distlock/reqbuilder/metadata.go +++ b/pkg/distlock/reqbuilder/metadata.go @@ -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} } diff --git a/pkg/distlock/reqbuilder/metadata_bucket.go b/pkg/distlock/reqbuilder/metadata_bucket.go new file mode 100644 index 0000000..d8bde00 --- /dev/null +++ b/pkg/distlock/reqbuilder/metadata_bucket.go @@ -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 +} diff --git a/pkg/distlock/reqbuilder/metadata_node.go b/pkg/distlock/reqbuilder/metadata_node.go new file mode 100644 index 0000000..c011397 --- /dev/null +++ b/pkg/distlock/reqbuilder/metadata_node.go @@ -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 +} diff --git a/pkg/distlock/reqbuilder/metadata_user_bucket.go b/pkg/distlock/reqbuilder/metadata_user_bucket.go new file mode 100644 index 0000000..ffab827 --- /dev/null +++ b/pkg/distlock/reqbuilder/metadata_user_bucket.go @@ -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 +} diff --git a/pkg/distlock/reqbuilder/storage.go b/pkg/distlock/reqbuilder/storage.go index 6e55039..c16a605 100644 --- a/pkg/distlock/reqbuilder/storage.go +++ b/pkg/distlock/reqbuilder/storage.go @@ -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 } diff --git a/pkg/distlock/service/mutex.go b/pkg/distlock/service/mutex.go index 44e6d21..9a929ed 100644 --- a/pkg/distlock/service/mutex.go +++ b/pkg/distlock/service/mutex.go @@ -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