• 如何找到bug(7): 检查事例完整性的逻辑


    在 SequentialInputHandler.cpp里,areFragmentsThere()函数用来检查L1id事例的数据片段有没有到齐。

    305 /***************************************************************/
    306 bool SequentialInputHandler::areFragmentsThere(unsigned int l1id)
    307 /***************************************************************/
    308 {
    309 
    310   std::map <unsigned int, int>::iterator it;
    311 
    312   DEBUG_TEXT(DFDB_ROSFM, 10, "SequentialInputHandler::areFragmentsThere. On entry:  l1id =  "
    313                             << l1id << " Size of outstanding map = " << m_outStandingEvents.size());
    314   //If there is a single data channel, every new incoming fragment shall generate a trigger
    315   if (m_numberOfDataChannels==1)
    316     return true;
    317 
    318   //IF in singleFragment mode every new incoming fragment shall generate a trigger
    319   if (m_singleFragmentMode)
    320     return true;
    321 
    322   // update map size histogram
    323   int mapsize = m_outStandingEvents.size();
    324   if (mapsize < (c_mapSizeBins - 1)) {
    325     m_mapSizeHist[mapsize]++;
    326   }
    327   else {                            // overflow
    328     DEBUG_TEXT(DFDB_ROSFM, 8, "mapsize:" << mapsize << std::endl);
    329     m_mapSizeHist[c_mapSizeBins - 1]++;
    330   }
    331 
    332   it = m_outStandingEvents.find(l1id);
    333   if (it == m_outStandingEvents.end()) {  // add l1id to map, suggest at the end
    334     m_outStandingEvents.insert(m_outStandingEvents.end(), std::pair<unsigned int, int>(l1id, 1));
    335     return false;
    336   }
    337   else {  // l1id found
    338     if (it->second == (m_numberOfDataChannels-1)) { // complete 
    339 
    340       for(std::map <u_int, int>::iterator iter = m_outStandingEvents.begin(); iter != m_outStandingEvents.end(); iter++)
    341       {
    342         DEBUG_TEXT(DFDB_ROSFM,8, "iter->first:" << iter->first << ", iter->second:" << iter->second <<  std::endl);
    343       } //打印出来m_outStandingEvents的所有元素
    344       m_outStandingEvents.erase(it);
    345       DEBUG_TEXT(DFDB_ROSFM, 8, "areFragmentsThere: l1id complete " << l1id << " l1id erased and map size = " << m_outStandingEvent    s.size());
    346       return true;
    347     }
    348     else {  // incomplete
    349       (it->second)++;
    350       return false;
    351     }
    352   }
    353 }

    查看头文件:

     72     std::map <u_int, int> m_outStandingEvents;              //u_int = L1ID, int = Number of fragments received for this L1ID
     73                                                        //Once each channel has sent a fragment for a given L1ID the event can be processed

    81 static const int c_mapSizeBins = 100; //Histogram (see below)  常量静态数据成员
    82 std::vector<int> m_mapSizeHist; //The histogram tells you how many events (in terms of L1IDs) the system was working on in parallel                       //at any moment in time

     

    第331~347行是检查事例片段是否到齐的逻辑,m_outStandingEvents是一个map, map元素的key为已经接收的L1id, value为已经接收的L1id Fragment的个数。

    每个dataChannel接收一个Fragment后,都会调用一次areFragmentsThere()来检查该L1id 的Fragment是否到齐。

    检查逻辑是: 例如检查L1id=m的数据片段是否到齐: areFragmentsThere(m)

    如果没有在m_outStandingEvents里找到m, 说明之前还没接收过L1id=m的数据片段,于是在m_outStandingEvents的最后插入<m, 1>,表示现在收到L1id=m的第一个数据片段;

    如果在m_outStandingEvents里找到了key=m的元素,value < m_numberOfDataChannels-1, 说明之前就收到过L1id=m的数据片段,但是还没收齐,将value值加1, 表示又收到了一个;如果value =m_numberOfDataChannels-1,说明现在刚好收齐了所有L1id=m的数据片段。

    log文件:

       3687 Debug(1,139760517510912): iter->first:0, iter->second:63
       3688 
       3689 Debug(1,139760517510912): iter->first:1, iter->second:22
       3690 
       3691 Debug(1,139760517510912): iter->first:2, iter->second:9
       3692 
       3693 Debug(1,139760517510912): iter->first:3, iter->second:8
       3694 
       3695 Debug(1,139760517510912): iter->first:4, iter->second:1
       3696 
       3697 Debug(1,139760517510912): iter->first:5, iter->second:1
       3698 
       3699 Debug(1,139760517510912): areFragmentsThere: l1id complete 0 l1id erased and map size = 5
       3700 InputHandler got first ROD: 0
       3701 now we are going to recv data!
       3702 Debug(1,139760517510912): iter->first:1, iter->second:42
       3703 
       3704 Debug(1,139760517510912): iter->first:2, iter->second:55
       3705 
       3706 Debug(1,139760517510912): iter->first:3, iter->second:56
       3707 
       3708 Debug(1,139760517510912): iter->first:4, iter->second:63
       3709 
       3710 Debug(1,139760517510912): iter->first:5, iter->second:63
       3711 
       3712 Debug(1,139760517510912): iter->first:6, iter->second:63
       3713 
       3714 Debug(1,139760517510912): iter->first:7, iter->second:22
       3715 
       3716 Debug(1,139760517510912): iter->first:8, iter->second:9
       3717 
       3718 Debug(1,139760517510912): iter->first:9, iter->second:8
       3719 
       3720 Debug(1,139760517510912): iter->first:10, iter->second:1
       3721 
       3722 Debug(1,139760517510912): iter->first:11, iter->second:1
       3723 
       3724 Debug(1,139760517510912): areFragmentsThere: l1id complete 6 l1id erased and map size = 10

    为什么log文件里面L1id值大的Fragment收到的个数比L1id值小的Fragment收到的个数还多呢?按照这个检查逻辑,好像有哪里不对啊?

  • 相关阅读:
    thinkphp--标签库
    thinkphp中的参数绑定
    thinkphp3.2.3子查询中遇到的错误
    开篇马克
    BST树、B-树、B+树、B*树
    linux shell编程之变量和bash配置文件(第一篇)
    linux awk进阶篇
    linux awk(gawk)
    linux sed命令
    linux basic
  • 原文地址:https://www.cnblogs.com/zengtx/p/6421225.html
Copyright © 2020-2023  润新知