Bläddra i källkod

doctor: run DC connectivity probes in parallel

Each DC dial uses a 10s timeout, and "checkNetwork" iterates 6 DCs
sequentially, so worst case is ~60s when egress is broken. Probing in
parallel collapses the worst case to a single timeout window while
preserving the existing DC-ordered output.

Refs #482
pull/485/head
dolonet 1 vecka sedan
förälder
incheckning
a9011c0333
1 ändrade filer med 16 tillägg och 4 borttagningar
  1. 16
    4
      internal/cli/doctor.go

+ 16
- 4
internal/cli/doctor.go Visa fil

10
 	"slices"
10
 	"slices"
11
 	"strconv"
11
 	"strconv"
12
 	"strings"
12
 	"strings"
13
+	"sync"
13
 	"text/template"
14
 	"text/template"
14
 	"time"
15
 	"time"
15
 
16
 
220
 	dcs := slices.Collect(maps.Keys(essentials.TelegramCoreAddresses))
221
 	dcs := slices.Collect(maps.Keys(essentials.TelegramCoreAddresses))
221
 	slices.Sort(dcs)
222
 	slices.Sort(dcs)
222
 
223
 
224
+	errs := make([]error, len(dcs))
225
+
226
+	var wg sync.WaitGroup
227
+	for i, dc := range dcs {
228
+		wg.Add(1)
229
+		go func() {
230
+			defer wg.Done()
231
+			errs[i] = d.checkNetworkAddresses(ntw, essentials.TelegramCoreAddresses[dc])
232
+		}()
233
+	}
234
+	wg.Wait()
235
+
223
 	ok := true
236
 	ok := true
224
 
237
 
225
-	for _, dc := range dcs {
226
-		err := d.checkNetworkAddresses(ntw, essentials.TelegramCoreAddresses[dc])
227
-		if err == nil {
238
+	for i, dc := range dcs {
239
+		if errs[i] == nil {
228
 			tplODCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
240
 			tplODCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
229
 				"dc": dc,
241
 				"dc": dc,
230
 			})
242
 			})
231
 		} else {
243
 		} else {
232
 			tplEDCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
244
 			tplEDCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
233
 				"dc":    dc,
245
 				"dc":    dc,
234
-				"error": err,
246
+				"error": errs[i],
235
 			})
247
 			})
236
 			ok = false
248
 			ok = false
237
 		}
249
 		}

Laddar…
Avbryt
Spara