Ο μετρητής προβολών που μετέτρεψε τον κατάλογό μας σε σφάλμα 502

Αποστολή

Η σελίδα που παραθέτει κάθε Εργαλειοθήκη που πουλάμε απαντούσε σε κάθε επισκέπτη με σφάλμα 502 Bad Gateway για περίπου 41 ώρες μετά την κυκλοφορία. Η σελίδα κάθε Εργαλειοθήκης λειτουργούσε, η αρχική σελίδα λειτουργούσε, η ολοκλήρωση αγοράς λειτουργούσε. Το προβληματικό μέρος ήταν μερικές γραμμές που μετρούσαν τις προβολές σελίδας.

Το σφάλμα

Ο διακομιστής του καταστήματός μας μετρά τις επισκέψεις στις σελίδες των Εργαλειοθηκών. Για να βρει σε ποια Εργαλειοθήκη αφορά το αίτημα, έπαιρνε το δεύτερο μέρος της διαδρομής:

self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")

Για το /kits/studio/ αυτό είναι το studio. Για τον ίδιο τον κατάλογο, /kits/, η διαδρομή έχει δύο καθέτους, οπότε ο μηχανισμός ασφαλείας την άφηνε να περάσει, αλλά μετά την αφαίρεση των καθέτων υπάρχει μόνο ένα μέρος, και το [1] προκάλεσε IndexError. Ο χειριστής είναι το τυπικό http.server της Python: μια εξαίρεση στο do_GET κλείνει τη σύνδεση χωρίς απάντηση, και το Cloudflare εμφάνισε στον επισκέπτη ένα 502.

Η διόρθωση είναι μια μικρή συνάρτηση που επιστρέφει μια κενή συμβολοσειρά όταν λείπει το μέρος. Ο αριθμός προβολών χρειαζόταν μόνο το όνομα της Εργαλειοθήκης· δεν χρειαζόταν ποτέ να μπορεί να χαλάσει τη σελίδα που μετρούσε.

Γιατί κανένας από τους ελέγχους μας δεν το εντόπισε

Τι άλλαξε

Το συμπέρασμα

Οι δευτερεύουσες εργασίες σε έναν χειριστή αιτημάτων, όπως η αρίθμηση, η καταγραφή ή η παρακολούθηση, δεν πρέπει ποτέ να μπορούν να ακυρώσουν το αίτημα, ενώ ένας έλεγχος σελίδας που καλύπτει μόνο τις σελίδες που μόλις αλλάξατε παραλείπει αυτές που συνδέονται με αυτές. Ο Φύλακας στο Night Watch δέχεται οποιαδήποτε λίστα σελίδων, καθεμία με το κείμενο που πρέπει να περιέχει, όχι μόνο τις αρχικές σελίδες.

Ενημερώθηκε: