ceph源码分析--Monitor对osd report进行报down处理
2018-02-08 16:07
274 查看
上一篇讲到Monitor的tick处理,顺带讲解Monitor对osd report超时的处理
该部分在PGMonitor的tick中调用
在这里调用了PGMonitor的tick()
调用了void PGMonitor::handle_osd_timeouts()
bool OSDMonitor::handle_osd_timeouts(const utime_t &now,std::map
该部分在PGMonitor的tick中调用
void Monitor::tick() { // ok go. dout(11) << "tick" << dendl; ··· //调用paxosservice的tick() for (vector<PaxosService*>::iterator p = paxos_service.begin(); p != paxos_service.end(); ++p) { (*p)->tick(); (*p)->maybe_trim(); } ··· new_tick(); }
在这里调用了PGMonitor的tick()
void PGMonitor::tick() { if (!is_active()) return; if (mon->osdmon()->osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS) { return; } //处理osd的report超时 handle_osd_timeouts(); if (!pg_map.pg_sum_deltas.empty()) { utime_t age = ceph_clock_now() - pg_map.stamp; if (age > 2 * g_conf->mon_delta_reset_interval) { dout(10) << " clearing pg_map delta (" << age << " > " << g_conf->mon_delta_reset_interval << " seconds old)" << dendl; pg_map.clear_delta(); } } /* If we have deltas for pools, run through pgmap's 'per_pool_sum_delta' and * clear any deltas that are old enough. * * Note that 'per_pool_sum_delta' keeps a pool id as key, and a pair containing * the calc'ed stats delta and an absolute timestamp from when those stats were * obtained -- the timestamp IS NOT a delta itself. */ if (!pg_map.per_pool_sum_deltas.empty()) { ceph::unordered_map<uint64_t,pair<pool_stat_t,utime_t> >::iterator it; for (it = pg_map.per_pool_sum_delta.begin(); it != pg_map.per_pool_sum_delta.end(); ) { utime_t age = ceph_clock_now() - it->second.second; if (age > 2*g_conf->mon_delta_reset_interval) { dout(10) << " clearing pg_map delta for pool " << it->first << " (" << age << " > " << g_conf->mon_delta_reset_interval << " seconds old)" << dendl; pg_map.per_pool_sum_deltas.erase(it->first); pg_map.per_pool_sum_deltas_stamps.erase(it->first); pg_map.per_pool_sum_delta.erase((it++)->first); } else { ++it; } } } dout(10) << pg_map << dendl; }
调用了void PGMonitor::handle_osd_timeouts()
void PGMonitor::handle_osd_timeouts() { if (!mon->is_leader()) return; if (did_delete) return; utime_t now(ceph_clock_now()); utime_t timeo(g_conf->mon_osd_report_timeout, 0); if (now - mon->get_leader_since() < timeo) { // We haven't been the leader for long enough to consider OSD timeouts // return; } if (mon->osdmon()->is_writeable()) //调用了osdmon的handle_osd_timeouts mon->osdmon()->handle_osd_timeouts(now, last_osd_report); }
bool OSDMonitor::handle_osd_timeouts(const utime_t &now,std::map
bool OSDMonitor::handle_osd_timeouts(const utime_t &now, std::map<int,utime_t> &last_osd_report) { utime_t timeo(g_conf->mon_osd_report_timeout, 0); if (now - mon->get_leader_since() < timeo) { // We haven't been the leader for long enough to consider OSD timeouts return false; } int max_osd = osdmap.get_max_osd(); bool new_down = false; for (int i=0; i < max_osd; ++i) { dout(30) << __func__ << ": checking up on osd " << i << dendl; if (!osdmap.exists(i)) { last_osd_report.erase(i); // if any continue; } if (!osdmap.is_up(i)) continue; const std::map<int,utime_t>::const_iterator t = last_osd_report.find(i); if (t == last_osd_report.end()) { // it wasn't in the map; start the timer. last_osd_report[i] = now; } else if (can_mark_down(i)) { utime_t diff = now - t->second; if (diff > timeo) { mon->clog->info() << "osd." << i << " marked down after no beacon for " << diff << " seconds"; derr << "no beacon from osd." << i << " since " << t->second << ", " << diff << " seconds ago. marking down" << dendl; pending_inc.new_state[i] = CEPH_OSD_UP; new_down = true; } } } return new_down; }
相关文章推荐
- ceph源码分析--Monitor对osd report进行报down处
- 小伙伴们的ceph源码分析三——monitor消息处理流程
- Ceph Monitor源码机制分析(三)—— 选举
- 一个ceph-osd异常DOWN掉的原因分析
- Ceph Monitor源码机制分析(二)—— 初始化
- RecyclerView.java源码动画分析,每个itemView的动画交给了 DefaultItemAnimator 这个类进行处理
- ceph源码分析--monitor的lease机制
- Ambari-Server Rest API处理2(Ambari-Server通过Rest API进行服务安装、部署、操作流程+操作源码分析)
- ceph源码分析--monitor leader选举
- ceph-deploy源码分析(四)——osd模块 <转>
- ceph源码分析--monitor leader选举
- Ceph 学习——OSD读写流程与源码分析(一)
- ceph源码分析--monitor的lease机制
- Ceph Monitor源码机制分析(一)—— 概述
- 小伙伴们的ceph源码分析二——monitor启动流程
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 如何进行大数据分析及处理?
- Tomcat源码分析(四)--容器处理链接之责任链模式
- Tomcat处理HTTP请求源码分析
- Kubernetes编排工具-helm源码分析(Tiller中status命令处理流程)