Skip to content

Commit

Permalink
Merge pull request #8 from storage-lock/dev
Browse files Browse the repository at this point in the history
feat: 优化StorageLock的逻辑
  • Loading branch information
CC11001100 committed Aug 14, 2023
2 parents c4ff477 + 270b13c commit da2e6fd
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 15 deletions.
4 changes: 3 additions & 1 deletion storage_lock_lock.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ func (x *StorageLock) Lock(ctx context.Context, ownerId string) error {
lockBusyCount++
e.Fork().AddAction(events.NewAction(ActionLockBusy).AddPayload(PayloadVersionMissCount, versionMissCount).AddPayload(PayloadLockBusyCount, lockBusyCount)).Publish(ctx)
} else {
// 其它类型的错误就不再管了,认为是获取锁失败
e.Fork().AddAction(events.NewAction(ActionLockError).SetErr(err).AddPayload(PayloadVersionMissCount, versionMissCount).AddPayload(PayloadLockBusyCount, lockBusyCount)).Publish(ctx)
return err
}
Expand Down Expand Up @@ -323,7 +324,8 @@ func (x *StorageLock) lockNotExists(ctx context.Context, e *events.Event, lockId

// 获取到锁了,但是因为种种原因没办法真的获取成功,于是就尝试对齐进行回滚
func (x *StorageLock) lockRollback(ctx context.Context, e *events.Event, lockId, ownerId string, lockInformation *storage.LockInformation) {
// 尽力而为释放锁,如果释放不掉也只能慢慢等它过期了

// 尽力而为回滚锁,如果释放不掉也只能慢慢等它过期了

e.AddAction(events.NewAction(ActionLockRollback)).Publish(ctx)

Expand Down
29 changes: 15 additions & 14 deletions storage_lock_unlock.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func (x *StorageLock) UnLock(ctx context.Context, ownerId string) error {
case <-ctx.Done():
e.Fork().AddAction(events.NewAction(ActionTimeout).AddPayload(PayloadVersionMissCount, versionMissCount)).Publish(ctx)
return err
case <-time.After(time.Microsecond):
default:
e.Fork().AddAction(events.NewAction(ActionSleepRetry).AddPayload(PayloadVersionMissCount, versionMissCount)).Publish(ctx)
continue
}
Expand All @@ -76,7 +76,7 @@ func (x *StorageLock) tryUnlock(ctx context.Context, e *events.Event, lockId, ow

// 如果读取到的锁的信息为空,则说明锁不存在,一个不存在的锁自然也没有继续的必要
if lockInformation == nil {
e.Fork().AddActionByName("lock-information-not-exists").Publish(ctx)
e.Fork().AddActionByName(ActionLockNotExists).Publish(ctx)
return ErrLockNotFound
}

Expand All @@ -93,11 +93,9 @@ func (x *StorageLock) tryUnlock(ctx context.Context, e *events.Event, lockId, ow

// 如果释放一次之后发现还没有释放干净,说明是重入锁,并且加锁次数还没有为0,则尝试更新锁的信息
if lockInformation.LockCount > 0 {
e.Fork().AddActionByName(ActionUnlockReentry).Publish(ctx)
return x.unlockReentry(ctx, e.Fork(), lockId, ownerId, lockInformation, lastVersion)
} else {
// 如果经过这次操作之后锁的锁的锁定次数为0,说明应该彻底释放掉这个锁了,将其从Storage中清除
e.Fork().AddActionByName(ActionUnlockRelease).Publish(ctx)
return x.unlockRelease(ctx, e.Fork(), lockId, ownerId, lockInformation, lastVersion)
}
}
Expand Down Expand Up @@ -125,17 +123,18 @@ func (x *StorageLock) unlockReentry(ctx context.Context, e *events.Event, lockId

err = x.storageExecutor.UpdateWithVersion(ctx, e.Fork(), lockId, lastVersion, lockInformation.Version, lockInformation)
// 更新成功,直接返回,说明锁释放成功了
if err == nil {
e.Fork().AddActionByName(ActionUnlockSuccess).Publish(ctx)
if err != nil {
if errors.Is(err, ErrVersionMiss) {
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionMiss).SetErr(err)).Publish(ctx)
return ErrVersionMiss
} else {
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionError).SetErr(err)).Publish(ctx)
return err
}
} else {
e.Fork().AddActionByName(storage_events.ActionStorageUpdateWithVersionSuccess).Publish(ctx)
return nil
}

if err != nil && !errors.Is(err, ErrVersionMiss) {
e.Fork().AddAction(events.NewAction(ActionUnlockError).SetErr(err)).Publish(ctx)
return err
}
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionSuccess)).Publish(ctx)
return nil
}

// 锁被彻底释放干净了,将其标记为已经释放,以方便下一个到来的人能够重新拿到它
Expand All @@ -160,10 +159,11 @@ func (x *StorageLock) unlockRelease(ctx context.Context, e *events.Event, lockId
if err != nil {
if errors.Is(err, ErrVersionMiss) {
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionMiss).SetErr(err)).Publish(ctx)
return ErrVersionMiss
} else {
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionError).SetErr(err)).Publish(ctx)
return err
}
return err
}
e.Fork().AddAction(events.NewAction(storage_events.ActionStorageUpdateWithVersionSuccess)).Publish(ctx)

Expand All @@ -181,5 +181,6 @@ func (x *StorageLock) unlockRelease(ctx context.Context, e *events.Event, lockId
stopLastWatchDogEvent.Publish(ctx)
}

// 无论看门狗进程是否停止成功,这里都返回nil,看门狗接口的实现者负责保证异常情况下没有协程残留
return nil
}

0 comments on commit da2e6fd

Please sign in to comment.