Parcourir la source

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 il y a 1 semaine
Parent
révision
a9011c0333
1 fichiers modifiés avec 16 ajouts et 4 suppressions
  1. 16
    4
      internal/cli/doctor.go

+ 16
- 4
internal/cli/doctor.go Voir le fichier

@@ -10,6 +10,7 @@ import (
10 10
 	"slices"
11 11
 	"strconv"
12 12
 	"strings"
13
+	"sync"
13 14
 	"text/template"
14 15
 	"time"
15 16
 
@@ -220,18 +221,29 @@ func (d *Doctor) checkNetwork(ntw mtglib.Network) bool {
220 221
 	dcs := slices.Collect(maps.Keys(essentials.TelegramCoreAddresses))
221 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 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 240
 			tplODCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
229 241
 				"dc": dc,
230 242
 			})
231 243
 		} else {
232 244
 			tplEDCConnect.Execute(os.Stdout, map[string]any{ //nolint: errcheck
233 245
 				"dc":    dc,
234
-				"error": err,
246
+				"error": errs[i],
235 247
 			})
236 248
 			ok = false
237 249
 		}

Chargement…
Annuler
Enregistrer