Τρεις στήλες που απέμειναν από το Stats4U 2
Ο κύριος πίνακας μετρητών εδώ έχει 166.436 γραμμές και αρκετές στήλες που μοιάζουν σημαντικές. Τρεις από αυτές είναι οι lastdomain, firstdomain και userdomain. Περιέχουν δεδομένα:
lastdomain | μη κενή σε 15.525 γραμμές |
firstdomain | μη κενή σε 15.457 γραμμές |
userdomain | μη κενή σε 2.982 γραμμές |
Τίποτα δεν τις γράφει. Καμία εντολή σε ολόκληρο τον κώδικα δεν ορίζει καμία από τις τρεις. Οι τιμές προέρχονται από την προηγούμενη γενιά αυτής της υπηρεσίας, παγωμένες σε ό,τι ήταν όταν εκείνη σταμάτησε να λειτουργεί, και κάθε γραμμή που δημιουργήθηκε από τότε είναι κενή.
Γιατί μια μισογεμάτη στήλη είναι πιο δύσκολη από μια κενή
Μια εντελώς κενή στήλη είναι προφανώς νεκρή. Κανείς δεν χτίζει πάνω της, κανείς δεν βγάζει αναφορές από αυτήν, κανείς δεν περνά ένα απόγευμα αναρωτώμενος τι σημαίνει.
Μια στήλη που είναι συμπληρωμένη στο 9% των γραμμών είναι παγίδα. Μοιάζει με πεδίο που άλλοτε συμπληρώνεται και άλλοτε όχι — κάτι απολύτως συνηθισμένο για μια στήλη. Όποιος τη βρει συμπεραίνει εύλογα ότι υπάρχει κάποιος κανόνας που αποφασίζει πότε ορίζεται, και αρχίζει να ψάχνει τον κανόνα. Δεν υπάρχει.
Και οι παλιές τιμές δεν βρίσκονται κρυμμένες σε αδρανείς γραμμές όπου δεν θα έβλαπταν. Από τις γραμμές που έχουν τιμή στη lastdomain, οι 1.613 ανήκουν σε μετρητές που ενημερώνονταν ακόμη φέτος. Ένας ενεργός μετρητής με έναν τομέα καταγεγραμμένο πριν από μια δεκαετία μοιάζει ακριβώς με έναν ενεργό μετρητή με τρέχοντα τομέα.
Χειρότερα, τα δεδομένα είναι εύλογα. Είναι ονόματα τομέα, μοιάζουν με τους τομείς των μετρητών, και ένα ερώτημα που κάνει join σε αυτά επιστρέφει γραμμές. Θα απαντούσε σε μια ερώτηση για ένα web που έχει πια προχωρήσει.
Πώς να το διαπιστώσετε γρήγορα
Αναζητήστε με grep τις εγγραφές, όχι το όνομα. Ένα όνομα στήλης εμφανίζεται σε ερωτήματα SELECT που απλώς διαβάζουν, σε αποτυπώσεις σχήματος, σε παλιές μεταναστεύσεις, σε σχόλια — τίποτα από αυτά δεν αποδεικνύει κάτι. Αυτό που κρίνει το ζήτημα είναι αν κάποιο INSERT ή UPDATE την αναφέρει. Αυτή η αναζήτηση παίρνει ένα λεπτό και είναι οριστική με τρόπο που δεν είναι η ανάγνωση του κώδικα γύρω γύρω.
Ο δεύτερος έλεγχος είναι τα ίδια τα δεδομένα: αν η νεότερη γραμμή που έχει τιμή είναι χρόνων, η στήλη είναι απολίθωμα, ό,τι κι αν φαίνεται να λέει ο κώδικας.
Γιατί εξακολουθούν να υπάρχουν
Η διαγραφή μιας στήλης είναι φθηνή, αλλά όχι δωρεάν. Κάθε μία από αυτές τις γραμμές ανήκει στον μετρητή κάποιου, ορισμένοι από τους οποίους λειτουργούν αδιάκοπα από το 2006, και το ασφαλές βήμα πριν από μια αλλαγή σχήματος σε έναν τέτοιο πίνακα είναι ένα dump που έχει πράγματι επαναφερθεί μία φορά και όχι απλώς παραχθεί. Αυτή η άσκηση έχει γίνει στο μεταξύ. Μέχρι να αξίζει η διαγραφή τους για τον εαυτό της, τρεις αχρησιμοποίητες στήλες δεν κοστίζουν τίποτα πέρα από μια στιγμή σύγχυσης, και η σημείωση που περιγράφεται παρακάτω αφαιρεί ακόμη και αυτήν.
Γι’ αυτό τεκμηριώνονται αντί να διαγραφούν. Δεν υπάρχει προφανές σημείο για αυτή τη σημείωση — το σχήμα αυτής της βάσης δεδομένων υπάρχει μόνο στη βάση δεδομένων που λειτουργεί, όχι σε κάποιο αρχείο του αποθετηρίου — οπότε μπήκε εκεί όπου κάποιος θα σκόνταφτε πράγματι πάνω της: στην κλάση που διαβάζει μια γραμμή μετρητή, ακριβώς εκεί όπου περνούν οι στήλες. Μια σημείωση σε ένα αρχείο που κανείς δεν ανοίγει δεν είναι τεκμηρίωση. Μετατρέπει μια παγίδα σε υποσημείωση μόνο αν βρίσκεται στη διαδρομή.