- Katılım
- 6 Kas 2021
- Mesajlar
- 3,270
- Tepkime puanı
- 4,782
- Puanları
- 113
- Yaş
- 31
- Konum
- Türkiye
- Dc
- fatihbulut
Merhaba arkadaşlar,
FDWATCH mekanizmasında karşılaştığım ve logları dolduran bir sorunun çözümünü paylaşmak istiyorum. Eğer siz de loglarınızda sürekli olarak "FDWATCH: peer null in event" hatasını görüyorsanız, bu çözüm işinize yarayebilir.
db/src/ClientManager.cpp
Eski kod
Yeni kodla değiştir
Asıl sorun şuydu: Kod, bu hatayı logladıktan sonra bu geçersiz olayı fdwatch kuyruğundan temizlemiyordu. Bu yüzden, bir sonraki kontrol döngüsünde aynı geçersiz olay tekrar tekrar işlenmeye çalışılıyor ve bu da sürekli olarak aynı hatanın loglara yazılmasına neden oluyordu. Bu durum hem CPU'yu gereksiz yere meşgul ediyor hem de log dosyasını şişiriyordu.
FDWATCH mekanizmasında karşılaştığım ve logları dolduran bir sorunun çözümünü paylaşmak istiyorum. Eğer siz de loglarınızda sürekli olarak "FDWATCH: peer null in event" hatasını görüyorsanız, bu çözüm işinize yarayebilir.
C++:
sys_err("FDWATCH: peer null in event: ident %d
db/src/ClientManager.cpp
Eski kod
C++:
sys_err("FDWATCH: peer null in event: ident %d", fdwatch_get_ident(m_fdWatcher, idx));
Yeni kodla değiştir
C++:
// Önce sorunlu dosya tanımlayıcısını (fd) bir değişkene alıyoruz.
int fd = fdwatch_get_ident(m_fdWatcher, idx);
// Hatayı bu değişkeni kullanarak logluyoruz.
sys_err("FDWATCH: peer null in event: ident %d", fd);
// EN ÖNEMLİ KISIM: Sorunlu olayı fdwach'tan temizleyerek döngüyü kırıyoruz.
fdwatch_clear_event(m_fdWatcher, fd, idx);
Asıl sorun şuydu: Kod, bu hatayı logladıktan sonra bu geçersiz olayı fdwatch kuyruğundan temizlemiyordu. Bu yüzden, bir sonraki kontrol döngüsünde aynı geçersiz olay tekrar tekrar işlenmeye çalışılıyor ve bu da sürekli olarak aynı hatanın loglara yazılmasına neden oluyordu. Bu durum hem CPU'yu gereksiz yere meşgul ediyor hem de log dosyasını şişiriyordu.
Neden bu şekilde çözüldü?
- int fd = ...: Dosya tanımlayıcısını (fd) önce bir değişkene atamak, hem kodu daha okunabilir kılıyor hem de aynı fd değerini hem hata mesajında hem de olayı temizleme fonksiyonunda güvenli bir şekilde kullanmamızı sağlıyor.
- fdwatch_clear_event(...): Bu fonksiyon, çözümün kilit noktasıdır. Hatalı olduğu tespit edilen olayı fdwatch mekanizmasından kaldırır. Böylece sistem, bir sonraki döngüde aynı hatalı olayı tekrar işlemeye çalışmaz ve sonsuz hata döngüsü engellenmiş olur.