Skip to content

Commit 2f7b765

Browse files
committed
Fix race condition
1 parent 83528e3 commit 2f7b765

File tree

2 files changed

+26
-22
lines changed

2 files changed

+26
-22
lines changed

front.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ func NewStatusCodeValidator(reject []int) ResponseValidator {
363363
// slice of masquerade sorted by last vetted time
364364
type sortedFronts []Front
365365

366+
var frontsMu sync.RWMutex
367+
366368
func (m sortedFronts) Len() int { return len(m) }
367369
func (m sortedFronts) Swap(i, j int) { m[i], m[j] = m[j], m[i] }
368370
func (m sortedFronts) Less(i, j int) bool {
@@ -377,11 +379,32 @@ func (m sortedFronts) Less(i, j int) bool {
377379

378380
func (m sortedFronts) sortedCopy() sortedFronts {
379381
c := make(sortedFronts, len(m))
382+
frontsMu.Lock()
383+
defer frontsMu.Unlock()
380384
copy(c, m)
381385
sort.Sort(c)
382386
return c
383387
}
384388

389+
func (m sortedFronts) addFronts(fronts sortedFronts) {
390+
// Add new masquerades to the existing masquerades slice, but add them at the beginning.
391+
frontsMu.Lock()
392+
defer frontsMu.Unlock()
393+
m = append(m, fronts...)
394+
}
395+
396+
func (m sortedFronts) size() int {
397+
frontsMu.Lock()
398+
defer frontsMu.Unlock()
399+
return len(m)
400+
}
401+
402+
func (m sortedFronts) frontAt(i int) Front {
403+
frontsMu.Lock()
404+
defer frontsMu.Unlock()
405+
return m[i]
406+
}
407+
385408
func (fr *front) markCacheDirty() {
386409
select {
387410
case fr.cacheDirty <- nil:

fronted.go

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ func (f *fronted) onNewFronts(pool *x509.CertPool, providers map[string]*Provide
260260
}
261261
providersCopy := copyProviders(providers, f.countryCode)
262262
f.addProviders(providersCopy)
263-
f.addFronts(loadFronts(providersCopy, f.cacheDirty))
263+
f.fronts.addFronts(loadFronts(providersCopy, f.cacheDirty))
264264
f.certPool.Store(pool)
265265

266266
// The goroutine for finding working fronts runs forever, so only start it once.
@@ -320,8 +320,8 @@ func (f *fronted) tryAllFronts() {
320320
pool := pond.NewPool(40)
321321

322322
// Submit all fronts to the worker pool.
323-
for i := 0; i < f.frontSize(); i++ {
324-
m := f.frontAt(i)
323+
for i := 0; i < f.fronts.size(); i++ {
324+
m := f.fronts.frontAt(i)
325325
pool.Submit(func() {
326326
if f.isStopped() {
327327
return
@@ -348,18 +348,6 @@ func (f *fronted) hasEnoughWorkingFronts() bool {
348348
return len(f.frontsCh) >= 4
349349
}
350350

351-
func (f *fronted) frontSize() int {
352-
f.frontsMu.Lock()
353-
defer f.frontsMu.Unlock()
354-
return len(f.fronts)
355-
}
356-
357-
func (f *fronted) frontAt(i int) Front {
358-
f.frontsMu.Lock()
359-
defer f.frontsMu.Unlock()
360-
return f.fronts[i]
361-
}
362-
363351
func (f *fronted) vetFront(fr Front) bool {
364352
conn, err := f.dialFront(fr)
365353
if err != nil {
@@ -616,13 +604,6 @@ func (f *fronted) addProviders(providers map[string]*Provider) {
616604
}
617605
}
618606

619-
func (f *fronted) addFronts(fronts sortedFronts) {
620-
// Add new masquerades to the existing masquerades slice, but add them at the beginning.
621-
f.frontsMu.Lock()
622-
defer f.frontsMu.Unlock()
623-
f.fronts = append(fronts, f.fronts...)
624-
}
625-
626607
func (f *fronted) providerFor(m Front) *Provider {
627608
pid := m.getProviderID()
628609
if pid == "" {

0 commit comments

Comments
 (0)