Skip to content

Commit 7f6ed0d

Browse files
authored
Merge pull request #34 from ngrok-oss/euan/close-race
Correctly lock fds when closing old listeners
2 parents 9f958fe + 7e329fb commit 7f6ed0d

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

fds.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ var (
2929
// This state is terminal.
3030
// This error will be returned if an atttempt is made to mutate the file
3131
// descriptor store after stopping the upgrader.
32-
ErrUpgraderStopped = errors.New("the upgrader has been marked as stopped")
32+
ErrUpgraderStopped = errors.New("the upgrader has been marked as stopped")
33+
ErrClosingListeners = errors.New("the upgrade completed, and listeners are being cleaned up")
3334
)
3435

3536
// Listener can be shared between processes.
@@ -131,7 +132,7 @@ type Fds struct {
131132
l log15.Logger
132133
}
133134

134-
func (f *Fds) String() string { // XXX here?
135+
func (f *Fds) String() string {
135136
fds := f.copy()
136137
res := make([]string, 0, len(fds))
137138
for _, fi := range fds {
@@ -463,6 +464,9 @@ func (f *Fds) copy() map[string]*fd {
463464
// closeUnused closes unused FDs. It should be called
464465
// while Fds is locked.
465466
func (f *Fds) closeUnused() error {
467+
f.mu.Lock()
468+
defer f.mu.Unlock()
469+
466470
var errs []error
467471
for name, fd := range f.fds {
468472
if !fd.used {

upgrader.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,9 @@ func (u *Upgrader) Ready() error {
240240
}
241241

242242
// Now cleanup all old FDs while holding the lock
243-
//u.Fds.lockMutations(errors.New("closing old listeners"))
244-
// defer u.Fds.unlockMutations()
245-
//_ = u.Fds.closeUnused()
243+
u.Fds.lockMutations(ErrClosingListeners)
244+
defer u.Fds.unlockMutations()
245+
_ = u.Fds.closeUnused()
246246

247247
return nil
248248
}

0 commit comments

Comments
 (0)