MCPcopy
hub / github.com/bsm/redislock / ExampleLock_Refresh_watchdog

Function ExampleLock_Refresh_watchdog

example_test.go:92–132  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

90}
91
92func ExampleLock_Refresh_watchdog() {
93 client := redis.NewClient(&redis.Options{Network: "tcp", Addr: "127.0.0.1:6379"})
94 defer client.Close()
95
96 locker := redislock.New(client)
97
98 ctx := context.Background()
99
100 // Obtain a lock with a 30s TTL.
101 const ttl = 30 * time.Second
102 lock, err := locker.Obtain(ctx, "my-key", ttl, nil)
103 if err != nil {
104 log.Fatalln(err)
105 }
106 defer lock.Release(context.Background())
107
108 // Start a watchdog that refreshes the lock every ttl/3. The work context
109 // is cancelled if a refresh fails so the protected work can abort.
110 workCtx, cancel := context.WithCancel(ctx)
111 defer cancel()
112
113 go func() {
114 t := time.NewTicker(ttl / 3)
115 defer t.Stop()
116 for {
117 select {
118 case <-workCtx.Done():
119 return
120 case <-t.C:
121 if err := lock.Refresh(workCtx, ttl, nil); err != nil {
122 log.Printf("lock refresh failed: %v", err)
123 cancel()
124 return
125 }
126 }
127 }
128 }()
129
130 // ... do work using workCtx ...
131 fmt.Println("I have a lock!")
132}
133
134func ExampleClient_Obtain_customDeadline() {
135 client := redis.NewClient(&redis.Options{Network: "tcp", Addr: "127.0.0.1:6379"})

Callers

nothing calls this directly

Calls 4

NewFunction · 0.92
ObtainMethod · 0.80
ReleaseMethod · 0.80
RefreshMethod · 0.80

Tested by

no test coverage detected