Print

Print


Follow-up Comment #10, sr #130984 (project xrootd):

I think I found the problem. 
I first thought that there is  a race condition between threads, but Mutexes
seems to be used everywhere in a consistent way. The problem is in erasing
elements of std::map while looping through its elements in 
XrdXrootd/XrdXrootdStats.cc:87


   for ( it=clients.begin() ; it != clients.end(); it++ )
   {
        len += sprintf(cl_buff, client_info, (*it).first, (*it).second,
(*it).first);
        clients.erase((*it).first);
        strcat(buff,cl_buff);
        memset(cl_buff,0,sizeof(cl_buff));
   }


The only things gets that invalidated after std::map.erase() call are the
iterators to the erased elements. In the snippet above, the code will use the
invalidated iterator while changing to the next iteration (first line).

This should fix the issue (haven't tried yet):
--- XrdXrootd/XrdXrootdStats.cc 2012-08-08 23:11:20.000000000 +0200
+++ XrdXrootd/XrdXrootdStats.cc.fixed   2012-08-08 23:13:27.000000000 +0200
@@ -84,10 +84,10 @@
                   LoginAT, AuthBad, LoginAU, LoginUA);
 
    client_mutex.Lock();
-   for ( it=clients.begin() ; it != clients.end(); it++ )
+   for ( it=clients.begin() ; it != clients.end(); )
    {
        len += sprintf(cl_buff, client_info, (*it).first, (*it).second,
(*it).first);
-       clients.erase((*it).first);
+       clients.erase(it++);
        strcat(buff,cl_buff);
        memset(cl_buff,0,sizeof(cl_buff));
    }

Jiri Horky

    _______________________________________________________

Reply to this item at:

  <http://savannah.cern.ch/support/?130984>

_______________________________________________
  Message sent via/by LCG Savannah
  http://savannah.cern.ch/

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the XROOTD-DEV list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=XROOTD-DEV&A=1