Documentation
¶
Index ¶
Examples ¶
Constants ¶
View Source
const ( // EnvVarDomain is the name of the environment variable that defines // the lock provider's concurrency domain. EnvVarDomain = "X_CSI_SERIAL_VOL_ACCESS_ETCD_DOMAIN" // EnvVarEndpoints is the name of the environment variable that defines // the lock provider's etcd endoints. EnvVarEndpoints = "X_CSI_SERIAL_VOL_ACCESS_ETCD_ENDPOINTS" // EnvVarTTL is the name of the environment // variable that defines the length of time etcd will wait before // releasing ownership of a distributed lock if the lock's session // has not been renewed. EnvVarTTL = "X_CSI_SERIAL_VOL_ACCESS_ETCD_TTL" // EnvVarAutoSyncInterval is the name of the environment // variable that defines the interval to update endpoints with its latest // members. 0 disables auto-sync. By default auto-sync is disabled. EnvVarAutoSyncInterval = "X_CSI_SERIAL_VOL_ACCESS_ETCD_AUTO_SYNC_INTERVAL" // EnvVarDialTimeout is the name of the environment // variable that defines the timeout for failing to establish a connection. EnvVarDialTimeout = "X_CSI_SERIAL_VOL_ACCESS_ETCD_DIAL_TIMEOUT" // EnvVarDialKeepAliveTime is the name of the environment // variable that defines the time after which client pings the server to see // if transport is alive. EnvVarDialKeepAliveTime = "X_CSI_SERIAL_VOL_ACCESS_ETCD_DIAL_KEEP_ALIVE_TIME" // EnvVarDialKeepAliveTimeout is the name of the // environment variable that defines the time that the client waits for a // response for the keep-alive probe. If the response is not received in // this time, the connection is closed. EnvVarDialKeepAliveTimeout = "X_CSI_SERIAL_VOL_ACCESS_ETCD_DIAL_KEEP_ALIVE_TIMEOUT" // EnvVarMaxCallSendMsgSz is the name of the environment // variable that defines the client-side request send limit in bytes. // If 0, it defaults to 2.0 MiB (2 * 1024 * 1024). // Make sure that "MaxCallSendMsgSize" < server-side default send/recv // limit. ("--max-request-bytes" flag to etcd or // "embed.Config.MaxRequestBytes"). EnvVarMaxCallSendMsgSz = "X_CSI_SERIAL_VOL_ACCESS_ETCD_MAX_CALL_SEND_MSG_SZ" // EnvVarMaxCallRecvMsgSz is the name of the environment // variable that defines the client-side response receive limit. // If 0, it defaults to "math.MaxInt32", because range response can // easily exceed request send limits. // Make sure that "MaxCallRecvMsgSize" >= server-side default send/recv // limit. ("--max-request-bytes" flag to etcd or // "embed.Config.MaxRequestBytes"). EnvVarMaxCallRecvMsgSz = "X_CSI_SERIAL_VOL_ACCESS_ETCD_MAX_CALL_RECV_MSG_SZ" // EnvVarUsername is the name of the environment // variable that defines the user name used for authentication. EnvVarUsername = "X_CSI_SERIAL_VOL_ACCESS_ETCD_USERNAME" // EnvVarPassword is the name of the environment // variable that defines the password used for authentication. EnvVarPassword = "X_CSI_SERIAL_VOL_ACCESS_ETCD_PASSWORD" // EnvVarRejectOldCluster is the name of the environment // variable that defines when set will refuse to create a client against // an outdated cluster. EnvVarRejectOldCluster = "X_CSI_SERIAL_VOL_ACCESS_ETCD_REJECT_OLD_CLUSTER" // EnvVarTLS is the name of the environment // variable that defines whether or not the client should attempt // to use TLS when connecting to the server. EnvVarTLS = "X_CSI_SERIAL_VOL_ACCESS_ETCD_TLS" // EnvVarTLSInsecure is the name of the environment // variable that defines whether or not the TLS connection should // verify certificates. EnvVarTLSInsecure = "X_CSI_SERIAL_VOL_ACCESS_ETCD_TLS_INSECURE" )
Variables ¶
This section is empty.
Functions ¶
Types ¶
type TryMutex ¶
type TryMutex struct {
// LockCtx, when non-nil, is the context used with Lock.
LockCtx context.Context
// UnlockCtx, when non-nil, is the context used with Unlock.
UnlockCtx context.Context
// TryLockCtx, when non-nil, is the context used with TryLock.
TryLockCtx context.Context
// contains filtered or unexported fields
}
TryMutex is a mutual exclusion lock backed by etcd that implements the TryLocker interface. The zero value for a TryMutex is an unlocked mutex.
A TryMutex may be copied after first use.
func (*TryMutex) Lock ¶
func (m *TryMutex) Lock()
Lock locks m. If the lock is already in use, the calling goroutine blocks until the mutex is available.
func (*TryMutex) TryLock ¶
TryLock attempts to lock m. If no lock can be obtained in the specified duration then a false value is returned.
Example ¶
package main
import (
"context"
"fmt"
"io"
"time"
log "github.com/sirupsen/logrus"
mwtypes "github.com/rexray/gocsi/middleware/serialvolume/types"
)
var p mwtypes.VolumeLockerProvider
func main() {
const lockName = "ExampleTryMutex_TryLock"
// The context used when creating new locks and their concurrency sessions.
ctx := context.Background()
// Assign a TryMutex to m1 and then lock m1.
m1, err := p.GetLockWithName(ctx, lockName)
if err != nil {
log.Error(err)
return
}
defer m1.(io.Closer).Close()
m1.Lock()
// Start a goroutine that sleeps for one second and then
// unlocks m1. This makes it possible for the TryLock
// call below to lock m2.
go func() {
time.Sleep(time.Duration(1) * time.Second)
m1.Unlock()
}()
// Try for three seconds to lock m2.
m2, err := p.GetLockWithName(ctx, lockName)
if err != nil {
log.Error(err)
return
}
defer m2.(io.Closer).Close()
if m2.TryLock(time.Duration(3) * time.Second) {
fmt.Println("lock obtained")
}
m2.Unlock()
}
Output: lock obtained
Example (Timeout) ¶
package main
import (
"context"
"fmt"
"io"
"time"
log "github.com/sirupsen/logrus"
mwtypes "github.com/rexray/gocsi/middleware/serialvolume/types"
)
var p mwtypes.VolumeLockerProvider
func main() {
const lockName = "ExampleTryMutex_TryLock_timeout"
// The context used when creating new locks and their concurrency sessions.
ctx := context.Background()
// Assign a TryMutex to m1 and then lock m1.
m1, err := p.GetLockWithName(ctx, lockName)
if err != nil {
log.Error(err)
return
}
defer m1.(io.Closer).Close()
defer m1.Unlock()
m1.Lock()
// Try for three seconds to lock m2.
m2, err := p.GetLockWithName(ctx, lockName)
if err != nil {
log.Error(err)
return
}
defer m2.(io.Closer).Close()
if !m2.TryLock(time.Duration(3) * time.Second) {
fmt.Println("lock not obtained")
}
}
Output: lock not obtained
Click to show internal directories.
Click to hide internal directories.