Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CtxMutex ¶
type CtxMutex interface {
// Lock will wait until either the mutex can be locked, or
// the context is done (cancelled/deadlined). If the lock
// succeeds, it will return nil. If the context is done,
// it will return a stack-wrapped version of the context's error.
Lock(ctx context.Context) (err stackerr.Error)
// TryLock will attempt to lock the mutex, but will not
// wait if it cannot immediately do so.
TryLock() (locked bool)
// Unlock will unlock the mutex, and will panic if the mutex
// is not currently locked.
Unlock()
// TryUnlock will attempt to unlock the mutex, but will not
// panic if the mutex is not currently locked.
TryUnlock() (unlocked bool)
}
CtxMutex is a mutex where Lock operations use a context that can be cancelled/deadlined to terminate the lock attempt.
type DistributedLock ¶
type DistributedLock interface {
/*
Unlock will release this lock.
Arguments:
ctx - the context to use for all operations in the unlock. If the context is cancelled,
the unlock attempt will be cancelled and the expiry will eventually expire.
Return Values:
err - an error generated by this function
*/
Unlock(ctx context.Context) (err stackerr.Error)
// Include all of the functions for lock data
LockData
}
DistributedLock is a lock that can be used across multiple processes, computers, etc. It requires internet connectivity and an AWS DynamoDB table to use.
type DistributedLocker ¶
type DistributedLocker interface {
/*
Lock will attempt to acquire a distributed lock for the given key.
Arguments:
ctx - the context to use for all operations in the lock. If the context is cancelled,
the lock will not be updated and the lock will eventually expire.
key - the key of the distributed lock to acquire.
metadata - a map of metadata that should be stored with the lock. This can be useful
for debugging or logging when a lock cannot be acquired because it's already held.
Return Values:
newCtx - a context that will be cancelled if the heartbeat fails (but will NOT be
cancelled if the heartbeat exits because the lock was intentionally released).
newLock - the new lock that was acquired, if it could be acquried. If not, this will be nil.
existingLock - the existing lock, if there already was one. If a new lock was acquired,
this will be nil.
err - an error generated by this function
*/
Lock(ctx context.Context, key string, metadata map[string]any) (newCtx context.Context, newLock DistributedLock, existingLock LockData, err stackerr.Error)
// GetAllLocks will get a map of all locks that are stored in the lock table, regardless of whether they're active
GetAllLocks(ctx context.Context) (map[string]LockData, stackerr.Error)
// GetActiveLocks will get a map of all active locks
GetActiveLocks(ctx context.Context) (map[string]LockData, stackerr.Error)
// GetExpiredLocks will get a map of all expired locks
GetExpiredLocks(ctx context.Context) (map[string]LockData, stackerr.Error)
}
func NewDistributedLocker ¶
func NewDistributedLocker(ctx context.Context, dlConfig DistributedLockerConfig) (DistributedLocker, stackerr.Error)
NewDistributedLocker creates a new DynamoDB-based distributed locker that allows holding global locks.
type DistributedLockerConfig ¶
type LockData ¶
type LockData interface {
// Gets the key for the lock
Key() string
// Gets the version for the lock
Version() string
// Gets the time the lock was acquired
Acquired() time.Time
// Gets the time the lock will expire. Only provided
// for getting existing locks (will be zero-value when
// used on a lock that is held by this process)
Expires() time.Time
// Gets the CloudWatch Logs URL for the entity that holds
// the lock
LogsUrl() string
// Gets the metadata that was set for the lock
Metadata() map[string]json.RawMessage
// Active checks whether the lock is currently active (held by something).
Active() bool
}
Click to show internal directories.
Click to hide internal directories.