contrib/recipes/rwmutex.go
func (rwm *RWMutex) waitOnLastRev(pfx string) (bool, error) {
	client := rwm.s.Client()
	// get key that's blocking myKey
	opts := append(v3.WithLastRev(), v3.WithMaxModRev(rwm.myKey.Revision()-1))
	lastKey, err := client.Get(rwm.ctx, pfx, opts...)
	if err != nil {
		return false, err
	}
	if len(lastKey.Kvs) == 0 {
		return true, nil
	}
	// wait for release on blocking key
	_, err = WaitEvents(
		client,
		string(lastKey.Kvs[0].Key),
		rwm.myKey.Revision(),
		[]mvccpb.Event_EventType{mvccpb.DELETE})
	return false, err
}
func (rwm *RWMutex) waitOnLastRev(pfx string) (bool, error) {
	client := rwm.s.Client()
	// get key that's blocking myKey
	opts := append(v3.WithLastRev(), v3.WithMaxModRev(rwm.myKey.Revision()-1))
	lastKey, err := client.Get(rwm.ctx, pfx, opts...)
	if err != nil {
		return false, err
	}
	if len(lastKey.Kvs) == 0 {
		return true, nil
	}
	// wait for release on blocking key
	_, err = WaitEvents(
		client,
		string(lastKey.Kvs[0].Key),
		rwm.myKey.Revision(),
		[]mvccpb.Event_EventType{mvccpb.DELETE})
	return false, err
}
func ( rwm * RWMutex ) waitOnLastRev ( pfx string ) ( bool , error ) { client := rwm . s . Client ( ) // get key that's blocking myKey opts := append ( v3 . WithLastRev ( ) , v3 . WithMaxModRev ( rwm . myKey . Revision ( ) - 1 ) ) lastKey , err := client . Get ( rwm . ctx , pfx , opts ... ) if err != nil { return false , err } if len ( lastKey . Kvs ) == 0 { return true , nil } // wait for release on blocking key _ , err = WaitEvents ( client , string ( lastKey . Kvs [ 0 ] . Key ) , rwm . myKey . Revision ( ) , [ ] mvccpb . Event_EventType { mvccpb . DELETE } ) return false , err }
// waitOnLowest will wait on the last key with a revision < rwm.myKey.Revision with a
// given prefix. If there are no keys left to wait on, return true.
waitOnLowest will wait on the last key with a revision < rwm . myKey . Revision with a given prefix . If there are no keys left to wait on return true .