package concurrency
import (
"fmt"
v3 "github.com/coreos/etcd/clientv3"
"github.com/coreos/etcd/mvcc/mvccpb"
"golang.org/x/net/context"
)
func waitDelete(ctx context.Context, client *v3.Client, key string, rev int64) error { cctx, cancel := context.WithCancel(ctx)
defer cancel()
var wr v3.WatchResponse
wch := client.Watch(cctx, key, v3.WithRev(rev))
for wr = range wch { for _, ev := range wr.Events { if ev.Type == mvccpb.DELETE { return nil
}
}
}
if err := wr.Err(); err != nil { return err
}
if err := ctx.Err(); err != nil { return err
}
return fmt.Errorf("lost watcher waiting for delete")}
// waitDeletes efficiently waits until all keys matching the prefix and no greater
// than the create revision.
func waitDeletes(ctx context.Context, client *v3.Client, pfx string, maxCreateRev int64) error { getOpts := append(v3.WithLastCreate(), v3.WithMaxCreateRev(maxCreateRev))
for { resp, err := client.Get(ctx, pfx, getOpts...)
if err != nil { return err
}
if len(resp.Kvs) == 0 { return nil
}
lastKey := string(resp.Kvs[0].Key)
if err = waitDelete(ctx, client, lastKey, resp.Header.Revision); err != nil { return err
}
}
}