Przypadek 500-milowego e-maila
Posted on Sat 05 March 2005 in Pamietniczek • 5 min read
Oto przypadek, który brzmiał niewarygodnie... właściwie żałuję, że opowiadanie udostępniłem szerokiemu gronu bo to świetnia dykteryjka na konferencyjne posiedzenia w barze. ;-) Historia została lekko podrasowana aby ochronić winnych, pominąć nudne lub nieistotne szczegóły oraz uczynić ją bardziej wciągającą.
Pracowałem wtedy przy obsłudze uniwersyteckiego systemu poczty elektronicznej. Było to parę lat temu. Pewnego dnia zadzwonił do mnie szef działu statystycznego.
- Mamy kłopot z wysyłaniem e-maili.
- Co się dzieje? - spytałem.
- Nie możemy wysłać poczty dalej niż 500 mil.
Zakrztusiłem się kawą: - Słucham!?
- Nie możemy wysłać żadnego e-maila dalej niż 500 mil stąd. - powtórzył - Konkretnie to ciut dalej, powiedzmy 520 mil. Ale nie dalej.
- Eee... E-maile tak nie działają, proszę pana - powiedziałem, próbując nie panikować. Nie powinno się okazywać paniki podczas rozmowy z szefem działu, nawet jeśli jest to szef działu tak niewiele znaczącego jak statystyka. - Dlaczego uważa pan, że wasze e-maile nie dochodzą dalej niż 500 mil?
- Proszę pana, ja nie *uważam*, ja wiem. - odparł szef - Widzi pan, gdy po raz pierwszy to zauważyliśmy czyli kilka dni temu...
- Kilka dni?! Czekaliście z tym kilka dni?! - przerwałem mu - I przez cały ten czas nie mogliście wysyłać poczty?
- Mogliśmy. Tyle, że nie dalej niż...
- 500 mil, tak, tak. - znowu mu przerwałem - Rozumiem. Ale czemu nie zadzwoniliście wcześniej?
- Prawdę mówiąc, nie mieliśmy dostatecznej ilości danych, żeby upewnić się w czym rzecz. Aż do dzisiaj...
"No tak, przecież to szef STATYSTYKI."
- W każdym razie, poprosiłem jedną z geostatystyczek, żeby się temu przyjrzała...
- Geostatystyczek...?
- Tak. I przygotowała mapę z zaznaczonym okręgiem, w zasięgu którego nasze e-maile docierają. W promieniu nieco ponad 500 mil jest kilka miejsc do których nie docieramy lub dobijamy się sporadycznie, jednak poza ten okrąg wyjść nie możemy.
- Rozumiem. - powiedziałem i złapałem się za głowę - Kiedy to się zaczęło? Powiedział pan, że kilka dni temu, ale czy w międzyczasie nic się nie zmieniło w waszych systemach?
- Był tu informatyk, zapaczował nasz serwer i zrestartował. Dzwoniłem do niego ale twierdzi, że do systemu pocztowego w ogóle się nie dotykał.
- OK, zobaczę co się dzieje i zadzwonię do pana. - powiedziałem, próbując uwierzyć, że ktoś robi sobie ze mnie jaja. To nie był Prima Aprilis ale zastanawiałem się czy nie zalazłem komuś za skórę tak, żeby próbował się odegrać.
Zalogowałem się na serwer statystyków i wysłałem kilka testowych e-maili. Znajdowałem się w Trójkącie Naukowym w Północnej Karolinie i e-maile dotarły na moje konto bez problemu. Tak samo wysłane do Richmond, do Atlanty i Waszyngtonu. Inny, puszczony do Princeton (400 mil) też zadziałał.
Ale potem spróbowałem wysłać pocztę do Memphis (600 mil). Nie doszła. Boston, też nie doszła. Detroit, również porażka. Wziąłem książkę adresową i próbowałem zawęzić obszar. Nowy Jork (420 mil) działał ale Providence (580 mil) już nie.
Zacząłem się martwić o swoje zdrowie psychiczne. Napisałem do kolegi mieszkającego w Północnej Karolinie, którego prowajder internetowy znajdował się w Seattle. Na szczęście, to nie zadziałało. Gdyby okazało się, że to ma coś wspólnego z położeniem geograficznym odbiorcy, a nie z jego serwerem pocztowym, pewnie rzuciłbym się z płaczem na podłogę.
Po ustaleniu, że choć to nieprawdopodobne, problem rzeczywiście istnieje i jest powtarzalny, rzuciłem okiem w plik sendmail.cf. Wyglądał dosyć normalnie. Wyglądał znajomo.
Porównałem go diffem[1] z kopią w moim katalogu domowym. Nikt go nie zmienił - to był ten sam plik, który stworzyłem. I byłem prawie pewny, że nie włączałem w nim opcji "FAIL_MAIL_OVER_500_MILES"[2]. Nie wiedząc co robić, telnetnąłem się na port SMTP. Serwer wyświetlił banner Sunowskiego sendmaila[3].
Chwila, moment... banner Sunowskiego sendmaila? W tym czasie, wraz ze swoim systemem Sun wciąż dostarczał Sendmaila 5, mimo że Sendmail 8 był już całkiem dojrzałym programem. Jako dobry administrator oparłem się właśnie na wersji 8. I również jako dobry administrator napisałem własnoręcznie sendmail.cf, używając w nim długich, opisowych dyrektyw dostępnych w Sendmailu 8, zamiast zagadkowych, pełnych znaków interpunkcyjnych dyrektyw z Sendmaila 5.
Wszystkie kawałki układanki znalazły się na miejscu, a ja zakrztusiłem się fusami wystygłej kawy! Podczas gdy informatyk "paczował serwer" najwyraźniej zapgrejdował SunOS-a, i jednocześnie *zdałngrejdował* Sendmaila. Uaktualnienie szczęśliwie pozostawiło sendmail.cf bez zmian ale obecnie w niewłaściwej wersji.
Najwidoczniej Sendmail 5 - lub wersja, którą rozprowadzał Sun - dawała sobie radę z sendmail.cf z wersji 8-ej bo większość dyrektyw pozostała niezmieniona. Nowe, długie dyrektywy konfiguracyjne Sendmail potraktował jako śmieci i odpuścił je sobie. A że, binarka Sendmaila nie ma wkompilowanych ustawień domyślnych dla większości z nich, nie znalazłszy ich w sendmail.cf poustawiała je na zero.
Jednym z wyzerowanych ustawień był timeout przy połączeniu do zdalnego serwera SMTP. Po paru eksperymentach okazało się, że dla tej konkretnej maszyny, przy jej typowym obciążeniu, zerowy timeout zamyka połączenie po upływie "ciut więcej" niż trzech milisekund.
Nasza sieć uniwersytecka miała w tym czasie dość dziwną cechę, mianowicie była w 100% przełączalna. Pakiet wychodzący nie powodował opóźnienia routera dopóki nie dotarł do POP-a [4], zawrócił i osiągnął router od drugiej strony. Czas na połączenie ze zdalnym, niezbyt obciążonym hostem był w w większym stopniu zależny od odległości mierzonej prędkością światła niż od opóźnień routera.
Czując lekkie zawroty głowy, wpisałem w shellu:
"500 mil, konkretnie ciut dalej."
Trey Harris