MTmertturkoglu.comTüm yazılar

Cloudflare ·

Wrangler'da geçici hatalara yeniden deneme: iki küçük tuzak

Cloudflare workers-sdk #15871: workflows instances list/describe için yeniden deneme eklerken sayfalama ve --json çıktısını bozan iki gizli tuzak.

wrangler workflows instances list ve describe tek bir API isteği yapıyordu. 503 ya da kopan bir bağlantı gibi geçici bir hatada, bir sonraki istek başarılı olacak olsa bile komut 1 koduyla çıkıyordu. Sorunu Alexander Minza #15865 numaralı issue'da bir yeniden üretme betiğiyle bildirdi; mutasyonların yeniden denenmemesi gerektiği de orada yazıyordu.

Wrangler'da bunun için hazır bir yardımcı var: retryOnAPIFailure. En fazla 3 deneme yapıyor; 5xx, 429 (Retry-After başlığına uyarak), zaman aşımı ve ağ hatalarında yeniden deniyor. İşin kolay kısmı istekleri bu yardımcıdan geçirmekti. Zor kısmı, bunu yaparken bozulacak iki şeyi fark etmekti.

Tuzak 1: yeniden deneme sessizce 1. sayfayı döndürürdü

fetchCursorPage, kendisine verilen URLSearchParams nesnesinden page parametresini siliyor. İlk deneme parametreyi silip başarısız olursa, ikinci deneme aynı nesneyi page olmadan alıyor. Sonuç: --page 2 isteyen kullanıcı hiçbir hata görmeden 1. sayfayı alırdı. Çözüm, her denemeye kendi kopyasını vermek:

const instances = await retryOnAPIFailure(
	() =>
		fetchCursorPage<Instance[]>(
			config,
			`/accounts/${accountId}/workflows/${args.name}/instances`,
			undefined,
			// fetchCursorPage deletes `page` from the params it is given, so each attempt needs its own copy
			new URLSearchParams(URLParams)
		),
	getJsonAwareRetryLogger(args.json)
);

Tuzak 2: yeniden deneme bildirimi --json çıktısını bozardı

retryOnAPIFailure, Retry-After beklemelerini logger.info ile bildiriyor, bu da stdout'a yazıyor. --json ile çalışan bir komutta stdout'a JSON dışında tek satır düşmesi, çıktıyı jq gibi bir araca bağlayan herkesin betiğini bozar. --json açıkken bu bildirimleri stderr'e yönlendiren küçük bir logger ekledim; stdout'ta artık sadece JSON var.

Kapsam

  • describe hem örnek isteğini hem de varsayılan --id latest değerini çözen isteği yeniden deniyor.
  • pause, resume, terminate, restart, send-event ve delete da latest değerini aynı yardımcıyla çözdüğü için o okuma da yeniden deneniyor. Bu komutların ardından yaptığı değiştirici istekler yeniden denenmiyor.
  • list'te bir yeniden deneme imleç taramasını baştan başlatıyor. Bunun kök nedeni ayrı bir issue'da (#15866) duruyor, bilerek kapsam dışında bıraktım.

İnceleme

CI'da benim değişikliğimle ilgisiz iki iş kırmızıydı. Birinin değişikliğim olmadan da main üzerinde Windows'ta kırıldığını gösterdim. Dario Piotrowicz yeni yardımcının yeniden adlandırılmasını ve ona özel birim testleri istedi; aynı gün teslim ettim, PR aynı gün birleşti. Toplamda 343 satır eklendi, bunun 280'i test.