kinesis-consumer/storage/lease.go
kperry 8f0fb899b7 addressed PR comments, moved some things around to new storage package,
separated out lease and moved to storage, created storage.go.
2019-05-27 11:46:44 -05:00

42 lines
1.5 KiB
Go

package storage
import (
"errors"
"time"
)
// Lease is data for handling a lease/lock on a particular shard
type Lease struct {
// LeaseKey is the partition/primaryKey in storage and is the shardID
LeaseKey string `json:"leaseKey"`
// Checkpoint the most updated sequenceNumber from kinesis
Checkpoint string `json:"checkpoint"`
// LeaseCounter will be updated any time a lease changes owners
LeaseCounter int `json:"leaseCounter"`
// LeaseOwner is the client id (defaulted to a guid)
LeaseOwner string `json:"leaseOwner"`
// HeartbeatID is a guid that gets updated on every heartbeat. It is used to help determine if a lease is expired.
// If a lease's heartbeatID hasn't been updated within the lease duration, then we assume the lease is expired
HeartbeatID string `json:"heartbeatID"`
// LastUpdateTime is the last time the lease has changed. Purposely not stored in storage. It is used with
LastUpdateTime time.Time `json:"-"` // purposely left out of json so it doesn't get stored in dynamo
}
// IsExpired is a function to check if the lease is expired, but is only expected to be used in the heartbeat loop
func (lease Lease) IsExpired(maxLeaseDuration time.Duration) bool {
if !lease.LastUpdateTime.IsZero() {
durationPast := time.Since(lease.LastUpdateTime)
if durationPast > maxLeaseDuration {
return true
}
}
return false
}
// StorageCouldNotUpdateOrCreateLease is a simple error for handling races that are lost in storage
var StorageCouldNotUpdateOrCreateLease = errors.New("storage could not update or create lease")