Changeset 3901 in Sophya for trunk


Ignore:
Timestamp:
Oct 7, 2010, 11:16:52 PM (15 years ago)
Author:
ansari
Message:

Suite recherche de probleme de blocage avec transfert sur ethernet ds mfacq.cc (EthernetReader...), Reza 07/10/2010

Location:
trunk/AddOn/TAcq
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/brparam.cc

    r3899 r3901  
    137137  ethr_nlink=0;
    138138  ethr_forcesamefc_=false;
    139   ethr_sfc_maxdpc_=50;
    140   ethr_sfc_maxresync_=50;
     139  ethr_sfc_maxdpc_=0;
     140  ethr_sfc_maxresync_=0;
    141141  ethr_waitendmsg_=false;
    142142
     
    262262  if (conf.HasKey("ethrforcesamefc"))  {
    263263    ethr_forcesamefc_=true;   // force SAME FrameCounter   on all links
    264     ethr_sfc_maxdpc_=conf.IParam("ethrforcesamefc",0,50);
    265     ethr_sfc_maxresync_=conf.IParam("ethrforcesamefc",1,50);
     264    ethr_sfc_maxdpc_=conf.IParam("ethrforcesamefc",0,0);
     265    ethr_sfc_maxresync_=conf.IParam("ethrforcesamefc",1,0);
    266266  }
    267267  if (conf.HasKey("ethrwaitendmsg"))  ethr_waitendmsg_=true;
  • trunk/AddOn/TAcq/racqueth.cc

    r3900 r3901  
    466466    bool fgok=true;
    467467    while (fgok&&(totnpaqrd_<par_.MaxNbPaquets())) {
    468       if (stop_) break;
     468      if (stop_) {
     469        if (prtlev_>0) 
     470          cout << ">S>S>S> EthernetReader::run() / Stopping, through Stop() method" << endl; 
     471        stopreason_="EthernetReader::run() / Stopping, through Stop() method";
     472        break;
     473      }
    469474      if ( MoveToNextTarget() ) {
    470475        cout << "EthernetReader::run()/Error-A- MoveToNextTarget() returned true ->STOP 9" << endl;
     
    485490               << totsamefc_ << " / NPaqFib0Read=" << totnpqrd_[0]
    486491               << " FracSameFC=" << 100*totsamefc_/totnpqrd_[0] << " %" <<  endl;
     492      }
     493      if (totnpaqrd_>=par_.MaxNbPaquets()) {
     494        if (prtlev_>0) 
     495          cout << ">S>S>S> EthernetReader::run() / Stopping, totnpaqrd_>=par_.MaxNbPaquets()" << endl; 
     496        stopreason_="EthernetReader::run() / Stopping, totnpaqrd_>=par_.MaxNbPaquets()";
    487497      }
    488498    }
     
    537547bool EthernetReader::ReadNextAllFibers()
    538548{
    539   if (SkipAndSyncLinks()>8)  return true;
    540  
     549  if (sfc_maxresync_>0) return ReadNextAllFibersWithSync();
     550
     551  for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
     552    if (ReadNext(fib)) return true;  // probleme
     553  }
     554  if (!rdsamefc_ || (memgr_.NbFibres()<2))  {
     555    uint_8 cfc=curfc_[0];
     556    bool fgsamefc=true;
     557    for(size_t fib=1; fib<memgr_.NbFibres(); fib++) {
     558      if (curfc_[fib]!=cfc)   fgsamefc=false;
     559    }
     560    if (fgsamefc)  totsamefc_++; 
     561    return false;  // c'est OK
     562  }
     563  //  On va essayer de lire jusqu'a avoir same_frame_counter
     564  uint_8 cfc=curfc_[0];
     565  bool fgsamefc=true;
     566  for(size_t fib=1; fib<memgr_.NbFibres(); fib++) {
     567    if (curfc_[fib]!=cfc) {
     568      fgsamefc=false;
     569      if (curfc_[fib] > cfc)  cfc=curfc_[fib];
     570    }
     571  }
     572  if (fgsamefc) {
     573    totsamefc_++;  return false;  // c'est OK  , same framecounter
     574  }
     575  else {  // else !fgsame
     576    bool encorerd=true;
     577    uint_4  ntrd=0;
     578    while(encorerd) {
     579      encorerd=false;
     580      for(uint_4 fib=0; fib<memgr_.NbFibres(); fib++) {
     581        if (curfc_[fib]>=cfc)  continue;
     582        if (ReadNext(fib)) return true;  // probleme     
     583        encorerd=true;         
     584      }
     585      ntrd++;
     586      if (ntrd>sfc_maxdpc_) {
     587        if (prtlev_>0) 
     588          cout << ">S>S>S> EthernetReader::ReadNextAllFibers(" << fib << ")/ Stopping, Nb_ReadNext=" 
     589               << ntrd << " > sfc_maxdpc_" << endl;
     590        stopreason_="ReadNextAllFibers() StopReason: failed to get SameFC Nb_ReadNext>sfc_maxdpc_";
     591        return true;
     592      }
     593    }
     594  }   // fin de  else !fgsame
     595
     596  return true; // probleme
     597}
     598
     599/* --Methode-- */
     600bool EthernetReader::ReadNext(int fib)
     601{
     602  bool fggood=false;
     603  while(!fggood) {
     604    ReceiveFromSocket(fib, (char *)vpaq_[fib].Begin(), packsize_);
     605    if (vec_fgsokend_[fib])   {   // fin de reception sur le lien
     606      if (prtlev_>0) 
     607        cout << ">S>S>S> EthernetReader::ReadNext(" << fib << ")/ Stopping, reason EndReceive fgsokend_="
     608             << vec_fgsokend_[fib] << endl;
     609      stopreason_="ReadNext() StopReason: EndReceive signaled on link";
     610      return true;
     611    }
     612    totnbytesrd_+=packsize_;
     613    totnpqrd_[fib]++;
     614    fggood = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
     615  }
     616  totnpqok_[fib]++;
     617  return false;
     618}
     619
     620/* --Methode-- */
     621void EthernetReader::CleanUpAllSockets()
     622{
     623  bool fgallfinished=false;
     624  while (!fgallfinished) {
     625    fgallfinished=true;
     626    for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
     627      if (vec_fgsokend_[fib]>0) continue;
     628      ReceiveFromSocket(fib,dummybuff_,packsize_);
     629      fgallfinished=false;
     630    }
     631  }
     632  return;
     633}
     634
     635/* --Methode-- */
     636size_t EthernetReader::ReceiveFromSocket(int fib, char* data, size_t len)
     637{
     638  size_t rc =0;
     639  if (vec_fgsokend_[fib]) { // la lecture est finie
     640    memset(data, 0, len);
     641    return 0;
     642  }
     643
     644  if (vec_cntpaq_[fib]%memgr_.NbPaquets() == 0) {
     645    char msg[BRTCPMSGLEN2];
     646    msg[0]='\0';
     647    vsok_[fib].ReceiveAll(msg, BRTCPMSGLEN2);
     648    //    if (strncmp(msg,"PCIEToEthernet-SendCnt",22) != 0)
     649    //      cout << " EthernetReader::ReceiveFromSocket/ BAD HandShake message : " << msg << endl;
     650    bool fgbadhsm=true;
     651    if (strncmp(msg,"PCIEToEthernet-Send",19)==0) {
     652      if (strncmp(msg+19,"Cnt",3)==0) fgbadhsm=false;
     653      else if (strncmp(msg+19,"-END",4)==0) {
     654        fgbadhsm=false;
     655        vec_fgsokend_[fib]=1;  gl_fgsokend=true;
     656        //DBG   cout << "ReceiveFromSocket/DEBUG -END msg received  " << endl;
     657        if (prtlev_>2) 
     658          cout << " EthernetReader::ReceiveFromSocket/ Receive on LinkNo" << fib << " Ended OK" << endl;
     659      }
     660    }
     661    if (fgbadhsm) {
     662      cout << " EthernetReader::ReceiveFromSocket/ BAD HandShake, LinkNo " <<  fib << " msg: " << msg << endl;
     663      vec_fgsokend_[fib]=2;
     664    }
     665  }
     666
     667  if (vec_fgsokend_[fib]>0) { // la lecture est finie
     668    memset(data, 0, len);
     669    return 0;
     670  }
     671
     672  rc += vsok_[fib].ReceiveAll(data, len);
     673  vec_cntpaq_[fib]++;
     674
     675#ifdef BR_DO_HANDSHAKE
     676  // Envoi de message de hand-shake
     677  if (vec_cntpaq_[fib]%memgr_.NbPaquets() == 0) {
     678    char msg[BRTCPMSGLEN2];
     679    sprintf(msg,"EthernetReader-RecvCnt %d",vec_cntpaq_[fib]);
     680    vsok_[fib].SendAll(msg, BRTCPMSGLEN2);
     681    //DBG    cout << " ReceiveFromSocket/DEBUG-B msg=" << msg << endl;
     682  }
     683#endif 
     684  return rc;
     685}
     686
     687/* --Methode-- */
     688bool EthernetReader::ReadNextAllFibersWithSync()
     689{
     690  if (rdsamefc_&&(sfc_maxresync_>0)) {
     691    if (SkipAndSyncLinks()>8)  return true;
     692  }
    541693  for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
    542694    if (ReadNext(fib)) return true;  // probleme
     
    557709    if (nbechec>sfc_maxresync_)  {
    558710      if (prtlev_>0) 
    559         cout << ">S>S>S> EthernetReader::ReadNextAllFibers()/ Stopping, reason NbEchec>(NbMax_Resync="
     711        cout << ">S>S>S> EthernetReader::ReadNextAllFibersWithSync()/ Stopping, reason NbEchec>(NbMax_Resync="
    560712             << sfc_maxresync_ << ")" << endl;
    561       stopreason_="ReadNextAllFibers() , StopReason: NbEchec>NbMax_Resyn";
     713      stopreason_="ReadNextAllFibersWithSync() , StopReason: NbEchec>NbMax_Resyn";
    562714      return true;
    563715    }
     
    574726    }
    575727    else {  // else !fgsame
    576       if (nbechec>sfc_maxresync_)  return true;
    577728      if (nbechec>0)   {
    578729        int rcres=SkipAndSyncLinks();
     
    596747     
    597748      if (prtlev_>5)
    598         cout << " EthernetReader::ReadNextAllFibers()/DEBUG NbEchec=" << nbechec 
     749        cout << " EthernetReader::ReadNextAllFibersWithSync()/DEBUG NbEchec=" << nbechec 
    599750             << " cfc=" << cfc << endl;
    600751     
     
    605756        }
    606757      }
     758
    607759      nbechec++;
    608760    }   // fin de  else !fgsame
     
    610762
    611763  return true; // probleme
    612 }
    613 
    614 /* --Methode-- */
    615 bool EthernetReader::ReadNext(int fib)
    616 {
    617   bool fggood=false;
    618   while(!fggood) {
    619     ReceiveFromSocket(fib, (char *)vpaq_[fib].Begin(), packsize_);
    620     if (vec_fgsokend_[fib])   {   // fin de reception sur le lien
    621       if (prtlev_>0) 
    622         cout << ">S>S>S> EthernetReader::ReadNext(" << fib << ")/ Stopping, reason EndReceive fgsokend_="
    623              << vec_fgsokend_[fib] << endl;
    624       stopreason_="ReadNext() StopReason: EndReceive signaled on link";
    625       return true;
    626     }
    627     totnbytesrd_+=packsize_;
    628     totnpqrd_[fib]++;
    629     fggood = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
    630   }
    631   totnpqok_[fib]++;
    632   return false;
    633 }
    634 
    635 /* --Methode-- */
    636 void EthernetReader::CleanUpAllSockets()
    637 {
    638   bool fgallfinished=false;
    639   while (!fgallfinished) {
    640     fgallfinished=true;
    641     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
    642       if (vec_fgsokend_[fib]>0) continue;
    643       ReceiveFromSocket(fib,dummybuff_,packsize_);
    644       fgallfinished=false;
    645     }
    646   }
    647   return;
    648 }
    649 
    650 /* --Methode-- */
    651 size_t EthernetReader::ReceiveFromSocket(int fib, char* data, size_t len)
    652 {
    653   size_t rc =0;
    654   if (vec_fgsokend_[fib]) { // la lecture est finie
    655     memset(data, 0, len);
    656     return 0;
    657   }
    658 
    659   if (vec_cntpaq_[fib]%memgr_.NbPaquets() == 0) {
    660     char msg[BRTCPMSGLEN2];
    661     msg[0]='\0';
    662     vsok_[fib].ReceiveAll(msg, BRTCPMSGLEN2);
    663     //    if (strncmp(msg,"PCIEToEthernet-SendCnt",22) != 0)
    664     //      cout << " EthernetReader::ReceiveFromSocket/ BAD HandShake message : " << msg << endl;
    665     bool fgbadhsm=true;
    666     if (strncmp(msg,"PCIEToEthernet-Send",19)==0) {
    667       if (strncmp(msg+19,"Cnt",3)==0) fgbadhsm=false;
    668       else if (strncmp(msg+19,"-END",4)==0) {
    669         fgbadhsm=false;
    670         vec_fgsokend_[fib]=1;  gl_fgsokend=true;
    671         //DBG   cout << "ReceiveFromSocket/DEBUG -END msg received  " << endl;
    672         if (prtlev_>2) 
    673           cout << " EthernetReader::ReceiveFromSocket/ Receive on LinkNo" << fib << " Ended OK" << endl;
    674       }
    675     }
    676     if (fgbadhsm) {
    677       cout << " EthernetReader::ReceiveFromSocket/ BAD HandShake, LinkNo " <<  fib << " msg: " << msg << endl;
    678       vec_fgsokend_[fib]=2;
    679     }
    680   }
    681 
    682   if (vec_fgsokend_[fib]>0) { // la lecture est finie
    683     memset(data, 0, len);
    684     return 0;
    685   }
    686 
    687   rc += vsok_[fib].ReceiveAll(data, len);
    688   vec_cntpaq_[fib]++;
    689 
    690 #ifdef BR_DO_HANDSHAKE
    691   // Envoi de message de hand-shake
    692   if (vec_cntpaq_[fib]%memgr_.NbPaquets() == 0) {
    693     char msg[BRTCPMSGLEN2];
    694     sprintf(msg,"EthernetReader-RecvCnt %d",vec_cntpaq_[fib]);
    695     vsok_[fib].SendAll(msg, BRTCPMSGLEN2);
    696     //DBG    cout << " ReceiveFromSocket/DEBUG-B msg=" << msg << endl;
    697   }
    698 #endif 
    699   return rc;
    700764}
    701765
  • trunk/AddOn/TAcq/racqueth.h

    r3899 r3901  
    9696  // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une
    9797  // difference maximum de maxdiff_paqnum entre nombre de paquets lus sur chaque fibre
    98   inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=50, uint_4 maxresync=50)
     98  inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=0, uint_4 maxresync=0)
    9999  { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
    100100  //  En activant le flag, le reader ne se termine qu'avec la reception des message END sur chaque lien
     
    115115  size_t ReceiveFromSocket(int fib, char* data, size_t len);
    116116
     117  bool ReadNextAllFibersWithSync();      // Renvoie true si probleme
    117118// recale les links en cas d'ecart important entre nb de paquets lu sur chaque lien
    118119  int SkipAndSyncLinks();   // Renvoie 0 si rien fait, 1 si skip fait, 9 si probleme 
  • trunk/AddOn/TAcq/swrapsock.h

    r3897 r3901  
    4444  size_t ReceiveAll(char * buff, size_t len);
    4545
     46/* Configuration nombre maxi de retry et temps d'attente (microsecondes)
     47   pour SendAll et ReceiveAll
     48  inline void SetSendRecvAllMaxNTry(int maxnt=20, int slus=100)
     49  {  maxntry_=maxnt; slus_retry_=slus; }
     50*/
     51
    4652  virtual int Close();
    4753 
     
    6975  long lstnbb;    /*  Nb bytes last send or receive */
    7076  long errcnt;    /*  Total error count */
     77//  int maxntry_;  int slus_retry_;
    7178  int prtlev;
    7279};
Note: See TracChangeset for help on using the changeset viewer.