#include "fiko/orkestra/node_kayit.hpp" namespace fiko::orkestra { const char* nodeDurumAdi(NodeDurum d) { switch (d) { case NodeDurum::Online: return "Çevrimiçi"; case NodeDurum::Idle: return "Boşta"; case NodeDurum::Busy: return "Meşgul"; case NodeDurum::Error: return "Hata"; case NodeDurum::Yanitsiz: return "Yanıtsız"; case NodeDurum::Offline: return "Çevrimdışı"; } return "?"; } NodeBilgi* NodeKayitDefteri::bulYaz(uint64_t nodeId) { auto it = indeks_.find(nodeId); return it == indeks_.end() ? nullptr : &liste_[it->second]; } const NodeBilgi* NodeKayitDefteri::bul(uint64_t nodeId) const { auto it = indeks_.find(nodeId); return it == indeks_.end() ? nullptr : &liste_[it->second]; } const NodeBilgi& NodeKayitDefteri::ilanIsle(const NodeBilgi& ilan, uint64_t simdiMs) { NodeBilgi* n = bulYaz(ilan.nodeId); if (!n) { indeks_[ilan.nodeId] = liste_.size(); // yeni konum = mevcut boyut liste_.push_back(ilan); n = &liste_.back(); n->ilkGorulmeMs = simdiMs; n->sonBeaconMs = simdiMs; n->durum = NodeDurum::Online; if (katildi) katildi(*n); return *n; } // Mevcut node: kimlik dışı alanları tazele (metrik/task sayaçları kendi // kanallarından sürülür, ilan onları EZMEZ). n->ad = ilan.ad; if (!ilan.ip.empty()) n->ip = ilan.ip; // boş ip mevcut adresi silmesin n->surum = ilan.surum; n->etiketler = ilan.etiketler; n->runtimeSayisi = ilan.runtimeSayisi; n->dogrulanmis = n->dogrulanmis || ilan.dogrulanmis; n->sonBeaconMs = simdiMs; durumTuret(*n, simdiMs); return *n; } void NodeKayitDefteri::metrikIsle(uint64_t nodeId, const NodeMetrikOzet& m, uint64_t simdiMs) { if (NodeBilgi* n = bulYaz(nodeId)) { n->metrik = m; n->sonMetrikMs = simdiMs; n->sonBeaconMs = simdiMs; // metrik akışı da canlılık kanıtıdır durumTuret(*n, simdiMs); } } void NodeKayitDefteri::aktifTaskAyarla(uint64_t nodeId, uint32_t adet) { if (NodeBilgi* n = bulYaz(nodeId)) { n->aktifTask = adet; durumTuret(*n, n->sonBeaconMs); } } void NodeKayitDefteri::hataIsaretle(uint64_t nodeId, bool hata) { if (NodeBilgi* n = bulYaz(nodeId)) { n->hataBayragi = hata; durumTuret(*n, n->sonBeaconMs); } } void NodeKayitDefteri::tazele(uint64_t simdiMs) { for (auto& n : liste_) durumTuret(n, simdiMs); } bool NodeKayitDefteri::kaldir(uint64_t nodeId) { auto it = indeks_.find(nodeId); if (it == indeks_.end()) return false; const size_t i = it->second; if (ayrildi) ayrildi(liste_[i]); liste_.erase(liste_.begin() + (long)i); // Silinen konumdan sonraki indeksler kaydı — map'i yeniden kur (kaldırma nadir). indeks_.clear(); for (size_t j = 0; j < liste_.size(); ++j) indeks_[liste_[j].nodeId] = j; return true; } void NodeKayitDefteri::durumTuret(NodeBilgi& n, uint64_t simdiMs) { const uint64_t sessiz = simdiMs > n.sonBeaconMs ? simdiMs - n.sonBeaconMs : 0; NodeDurum yeni; if (sessiz >= offlineEsikMs_) yeni = NodeDurum::Offline; else if (sessiz >= yanitsizEsikMs_) yeni = NodeDurum::Yanitsiz; else if (n.hataBayragi) yeni = NodeDurum::Error; else if (n.aktifTask > 0) yeni = NodeDurum::Busy; else if (n.sonMetrikMs > 0) yeni = NodeDurum::Idle; // detay bilgi geldi else yeni = NodeDurum::Online; // taze ama ham if (yeni != n.durum) { const NodeDurum eski = n.durum; n.durum = yeni; if (durumDegisti) durumDegisti(n, eski); } } } // namespace fiko::orkestra