Yazılım hatalarında bu hafta

Neredeyse bir ay önce programda bir sorun keşfettik. Yüksek üretim hızında bir süre sonra sunucu ile diğer uygulamalar arasındaki TCP/IP haberleşmesi duruyordu. Durmadan önce sunucu pencere büyüklüğünü sürekli azaltıyordu ve bir süre sonra sıfırda çakılıp kalıyordu. Bu noktadan sonra da hiçbir mesajı kabul etmiyordu. Bunun yanında test ekibinin dikkatini çeken başka bir nokta da sunucunun birden yüzde yüz işlemci kullanmaya başlamasıydı. Genelde bunun nedeni bir şekilde sunucunun sonsuz döngüye girmiş olmasıydı. Hangi thread’in sonsuz döngüye girdiğini bulmak kolaydı ama kodun o kısmında göze çarpan bir sonsuz döngü adayı yoktu. Bu nedenle hatayı haberleşme kısmında aramaya başladım.

Bir önceki versiyondan beri haberleşme modüllerindeki değişikleri kontrol ettim. Böyle bir etkiye yol açabilecek bir değişiklik yoktu. Bunun üzerine test sistemine bir önceki versiyonu yükledim ve aynı yük altında test ettim. Aynı davranış bir önceki versiyonda da vardı. Demek ki bu sorun daha uzun zamandır bizimle beraberdi ve biz bunu farketmemiştik.

Tabii ki hemen daha önceki versiyonu yükleyip aynı denemeyi yaptım ve bu versiyon sorunsuz çalıştı. Demek ki bundan bir sonraki versiyona geçerken bir şeyi bozmuş olmalıydım. Haberleşme modüllerini yine karşılaştırdım. Aralarındaki fark çok önemsizdi. Bu hata oradan gelemezdi.

Bu gibi durumlarda klasik mühendis yaklaşımından başka bir şey aklıma gelmez pek. Bir şeyi arıyorsan ve bu şeyin nerede olduğunu bilmiyorsan aramaya ışığın olduğu yerde başla. Sonsuz döngü olan kod kısmını incelemeye başladım. Kodun aslında sonsuz döngüye yol açması pek mümkün gözükmüyordu ama basit bir döngü ve multithreaded bir uygulamadan her şey beklenebilir. İlk kontrol ettiğim şeylerden biri bu döngüde en son değişikliği ne zaman yaptığım oldu. Evet, çalışan versiyondan çalışmayan versiyona geçerken yapmışım. Hatta çalışan versiyonda o noktada bir döngü yokmuş bile. Bir optimizasyon için o döngüyü eklemişim. Birden şüphelerim güçlenmeye başladı. Son versiyonda o döngüyü kaldırıp bir daha test yaptım ve son versiyon da sorunsuz çalıştı. Demek ki o döngüde kullandığım nesne hiç beklemediğim bir şekilde bozuluyormuş. Bunun üzerine bu nesneye her türlü erişimi senkronize etmeye başladım. Aslında bu sorunlara önlem olsun diye kendinden senkronize olan bir nesne türü kullanmıştım ama döngü içindeki iterasyonda bu senkronizasyon yeterli olmuyor tabii. Kötü bir günümde bunu atlamışım. Şimdi o modülde her şeyi düzelttim ve çıkmadan önce testi başlattım. Yarın sabah sonuçları görürüm.

Eve geldiğimde haftalardır yağmayan yağmurun sonunda yağıyor olduğunu gördüm. Bahçe sonunda bayram etti. Çekmecedeki tohumların da bir kısmını bahçeye ektim, başka türlü bu tohumları bitirme şansım yok. Bu yağmurlar haftasonu boyunca da devam edecek gibi. En azından bahçe sulamaya gerek kalmayacak.

Bir yanıt yazın