mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #14067 from ahrtr/lease_revoke
Fix the race condition between goroutine and channel on the same leases to be revoked
This commit is contained in:
commit
ce77d83ee6
@ -842,33 +842,7 @@ func (s *EtcdServer) run() {
|
|||||||
f := func(context.Context) { s.applyAll(&ep, &ap) }
|
f := func(context.Context) { s.applyAll(&ep, &ap) }
|
||||||
sched.Schedule(f)
|
sched.Schedule(f)
|
||||||
case leases := <-expiredLeaseC:
|
case leases := <-expiredLeaseC:
|
||||||
s.GoAttach(func() {
|
s.revokeExpiredLeases(leases)
|
||||||
// Increases throughput of expired leases deletion process through parallelization
|
|
||||||
c := make(chan struct{}, maxPendingRevokes)
|
|
||||||
for _, lease := range leases {
|
|
||||||
select {
|
|
||||||
case c <- struct{}{}:
|
|
||||||
case <-s.stopping:
|
|
||||||
return
|
|
||||||
}
|
|
||||||
lid := lease.ID
|
|
||||||
s.GoAttach(func() {
|
|
||||||
ctx := s.authStore.WithRoot(s.ctx)
|
|
||||||
_, lerr := s.LeaseRevoke(ctx, &pb.LeaseRevokeRequest{ID: int64(lid)})
|
|
||||||
if lerr == nil {
|
|
||||||
leaseExpired.Inc()
|
|
||||||
} else {
|
|
||||||
lg.Warn(
|
|
||||||
"failed to revoke lease",
|
|
||||||
zap.String("lease-id", fmt.Sprintf("%016x", lid)),
|
|
||||||
zap.Error(lerr),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
<-c
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
case err := <-s.errorc:
|
case err := <-s.errorc:
|
||||||
lg.Warn("server error", zap.Error(err))
|
lg.Warn("server error", zap.Error(err))
|
||||||
lg.Warn("data-dir used by this member must be removed")
|
lg.Warn("data-dir used by this member must be removed")
|
||||||
@ -883,6 +857,41 @@ func (s *EtcdServer) run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *EtcdServer) revokeExpiredLeases(leases []*lease.Lease) {
|
||||||
|
s.GoAttach(func() {
|
||||||
|
lg := s.Logger()
|
||||||
|
// Increases throughput of expired leases deletion process through parallelization
|
||||||
|
c := make(chan struct{}, maxPendingRevokes)
|
||||||
|
for _, curLease := range leases {
|
||||||
|
select {
|
||||||
|
case c <- struct{}{}:
|
||||||
|
case <-s.stopping:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
f := func(lid int64) {
|
||||||
|
s.GoAttach(func() {
|
||||||
|
ctx := s.authStore.WithRoot(s.ctx)
|
||||||
|
_, lerr := s.LeaseRevoke(ctx, &pb.LeaseRevokeRequest{ID: lid})
|
||||||
|
if lerr == nil {
|
||||||
|
leaseExpired.Inc()
|
||||||
|
} else {
|
||||||
|
lg.Warn(
|
||||||
|
"failed to revoke lease",
|
||||||
|
zap.String("lease-id", fmt.Sprintf("%016x", lid)),
|
||||||
|
zap.Error(lerr),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
<-c
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
f(int64(curLease.ID))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Cleanup removes allocated objects by EtcdServer.NewServer in
|
// Cleanup removes allocated objects by EtcdServer.NewServer in
|
||||||
// situation that EtcdServer::Start was not called (that takes care of cleanup).
|
// situation that EtcdServer::Start was not called (that takes care of cleanup).
|
||||||
func (s *EtcdServer) Cleanup() {
|
func (s *EtcdServer) Cleanup() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user