@@ -68,7 +68,8 @@ func newRetryKV(inner kvClient, count int, baseDelay, maxDelay time.Duration, en
6868func (r * retryKV ) Get (key string , q * api.QueryOptions ) (* api.KVPair , * api.QueryMeta , error ) {
6969 var pair * api.KVPair
7070 var meta * api.QueryMeta
71- err := r .retry (func () error {
71+ ctx := contextFromQueryOptions (q )
72+ err := r .retry (ctx , func () error {
7273 var ierr error
7374 pair , meta , ierr = r .inner .Get (key , q )
7475 return ierr
@@ -79,7 +80,8 @@ func (r *retryKV) Get(key string, q *api.QueryOptions) (*api.KVPair, *api.QueryM
7980func (r * retryKV ) List (prefix string , q * api.QueryOptions ) (api.KVPairs , * api.QueryMeta , error ) {
8081 var pairs api.KVPairs
8182 var meta * api.QueryMeta
82- err := r .retry (func () error {
83+ ctx := contextFromQueryOptions (q )
84+ err := r .retry (ctx , func () error {
8385 var ierr error
8486 pairs , meta , ierr = r .inner .List (prefix , q )
8587 return ierr
@@ -90,7 +92,8 @@ func (r *retryKV) List(prefix string, q *api.QueryOptions) (api.KVPairs, *api.Qu
9092func (r * retryKV ) Keys (prefix string , separator string , q * api.QueryOptions ) ([]string , * api.QueryMeta , error ) {
9193 var keys []string
9294 var meta * api.QueryMeta
93- err := r .retry (func () error {
95+ ctx := contextFromQueryOptions (q )
96+ err := r .retry (ctx , func () error {
9497 var ierr error
9598 keys , meta , ierr = r .inner .Keys (prefix , separator , q )
9699 return ierr
@@ -102,15 +105,23 @@ func (r *retryKV) Txn(txn api.KVTxnOps, q *api.QueryOptions) (bool, *api.KVTxnRe
102105 var ok bool
103106 var resp * api.KVTxnResponse
104107 var meta * api.QueryMeta
105- err := r .retry (func () error {
108+ ctx := contextFromQueryOptions (q )
109+ err := r .retry (ctx , func () error {
106110 var ierr error
107111 ok , resp , meta , ierr = r .inner .Txn (txn , q )
108112 return ierr
109113 })
110114 return ok , resp , meta , err
111115}
112116
113- func (r * retryKV ) retry (action func () error ) error {
117+ func contextFromQueryOptions (q * api.QueryOptions ) context.Context {
118+ if q != nil && q .Context () != nil {
119+ return q .Context ()
120+ }
121+ return context .Background ()
122+ }
123+
124+ func (r * retryKV ) retry (ctx context.Context , action func () error ) error {
114125 if ! r .enabled {
115126 return action ()
116127 }
@@ -119,7 +130,11 @@ func (r *retryKV) retry(action func() error) error {
119130 for attempt := 0 ; attempt < r .count ; attempt ++ {
120131 if attempt > 0 {
121132 delay := r .backoff (attempt )
122- time .Sleep (delay )
133+ select {
134+ case <- ctx .Done ():
135+ return ctx .Err ()
136+ case <- time .After (delay ):
137+ }
123138 }
124139
125140 err = action ()
0 commit comments