contrib/recipes/double_barrier.go
func (b *DoubleBarrier) Enter() error {
	client := b.s.Client()
	ek, err := newUniqueEphemeralKey(b.s, b.key+"/waiters")
	if err != nil {
		return err
	}
	b.myKey = ek

	resp, err := client.Get(b.ctx, b.key+"/waiters", clientv3.WithPrefix())
	if err != nil {
		return err
	}

	if len(resp.Kvs) > b.count {
		return ErrTooManyClients
	}

	if len(resp.Kvs) == b.count {
		// unblock waiters
		_, err = client.Put(b.ctx, b.key+"/ready", "")
		return err
	}

	_, err = WaitEvents(
		client,
		b.key+"/ready",
		ek.Revision(),
		[]mvccpb.Event_EventType{mvccpb.PUT})
	return err
}
func (b *DoubleBarrier) Enter() error {
	client := b.s.Client()
	ek, err := newUniqueEphemeralKey(b.s, b.key+"/waiters")
	if err != nil {
		return err
	}
	b.myKey = ek

	resp, err := client.Get(b.ctx, b.key+"/waiters", clientv3.WithPrefix())
	if err != nil {
		return err
	}

	if len(resp.Kvs) > b.count {
		return ErrTooManyClients
	}

	if len(resp.Kvs) == b.count {
		// unblock waiters
		_, err = client.Put(b.ctx, b.key+"/ready", "")
		return err
	}

	_, err = WaitEvents(
		client,
		b.key+"/ready",
		ek.Revision(),
		[]mvccpb.Event_EventType{mvccpb.PUT})
	return err
}
func ( b * DoubleBarrier ) Enter ( ) error { client := b . s . Client ( ) ek , err := newUniqueEphemeralKey ( b . s , b . key + " " ) if err != nil { return err } b . myKey = ek resp , err := client . Get ( b . ctx , b . key + " " , clientv3 . WithPrefix ( ) ) if err != nil { return err } if len ( resp . Kvs ) > b . count { return ErrTooManyClients } if len ( resp . Kvs ) == b . count { // unblock waiters _ , err = client . Put ( b . ctx , b . key + " " , " " ) return err } _ , err = WaitEvents ( client , b . key + " " , ek . Revision ( ) , [ ] mvccpb . Event_EventType { mvccpb . PUT } ) return err }
// Enter waits for "count" processes to enter the barrier then returns
Enter waits for count processes to enter the barrier then returns