List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:June 22 2009 11:13am
Subject:bzr push into mysql-5.1-telco-6.2 branch (jonas:2947 to 2949)
View as plain text  
 2949 Jonas Oreland	2009-06-22
      ndb - minor bug
        get_node_alive is called wo/ locks, which means that result is unpredictable
        in this case the node could die inbetweem get_node_alive and sendRecSignal
        in which case wrong error code would be returned to callign function.

    modified:
      storage/ndb/src/ndbapi/Ndb.cpp
 2948 Jonas Oreland	2009-06-22
      ndb - bug#45646
        Add a "has_lock" argument to send_event_report

    modified:
      storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp
      storage/ndb/src/ndbapi/NdbImpl.hpp
      storage/ndb/src/ndbapi/Ndbif.cpp
      storage/ndb/src/ndbapi/ndb_internal.hpp
      storage/ndb/tools/restore/consumer_restore.cpp
 2947 Jonas Oreland	2009-06-15
      ndb - fix include inconsistencies in public ndbapi
        as reported by martin z

    modified:
      storage/ndb/include/ndbapi/Ndb.hpp
      storage/ndb/include/ndbapi/NdbBlob.hpp
      storage/ndb/include/ndbapi/NdbError.hpp
      storage/ndb/include/ndbapi/NdbIndexScanOperation.hpp
      storage/ndb/include/ndbapi/NdbIndexStat.hpp
      storage/ndb/include/ndbapi/NdbInterpretedCode.hpp
      storage/ndb/include/ndbapi/NdbScanFilter.hpp
      storage/ndb/include/ndbapi/NdbScanOperation.hpp
=== modified file 'storage/ndb/src/ndbapi/Ndb.cpp'
--- a/storage/ndb/src/ndbapi/Ndb.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/Ndb.cpp	2009-06-22 08:50:59 +0000
@@ -148,15 +148,9 @@ Ndb::NDB_connect(Uint32 tNode) 
 //***************************************************************************
   
   int	         tReturnCode;
-  TransporterFacade *tp = theImpl->m_transporter_facade;
 
   DBUG_ENTER("Ndb::NDB_connect");
 
-  bool nodeAvail = tp->get_node_alive(tNode);
-  if(nodeAvail == false){
-    DBUG_RETURN(0);
-  }
-  
   NdbTransaction * tConArray = theConnectionArray[tNode];
   if (tConArray != NULL) {
     DBUG_RETURN(2);
@@ -211,6 +205,18 @@ Ndb::NDB_connect(Uint32 tNode) 
       // no need to retry with other node
       DBUG_RETURN(-1);
     }
+
+    /**
+     * If node was dead, report 0...
+     *
+     * Btw, the sendRecSignal-method should taken out and shot
+     */
+    switch(tReturnCode){
+    case -2:
+    case -3:
+      DBUG_RETURN(0);
+    }
+
     DBUG_RETURN(3);
   }//if
 }//Ndb::NDB_connect()

=== modified file 'storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp	2009-06-22 08:23:35 +0000
@@ -3323,7 +3323,7 @@ send_report:
   data[5]= apply_gci >> 32;
   data[6]= latest_gci & ~(Uint32)0;
   data[7]= latest_gci >> 32;
-  Ndb_internal::send_event_report(m_ndb, data,8);
+  Ndb_internal::send_event_report(true, m_ndb, data,8);
 #ifdef VM_TRACE
   assert(m_total_alloc >= m_free_data_sz);
 #endif

=== modified file 'storage/ndb/src/ndbapi/NdbImpl.hpp'
--- a/storage/ndb/src/ndbapi/NdbImpl.hpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/NdbImpl.hpp	2009-06-22 08:23:35 +0000
@@ -58,7 +58,7 @@ public:
   NdbImpl(Ndb_cluster_connection *, Ndb&);
   ~NdbImpl();
 
-  int send_event_report(Uint32 *data, Uint32 length);
+  int send_event_report(bool has_lock, Uint32 *data, Uint32 length);
 
   Ndb &m_ndb;
   Ndb * m_next_ndb_object, * m_prev_ndb_object;

=== modified file 'storage/ndb/src/ndbapi/Ndbif.cpp'
--- a/storage/ndb/src/ndbapi/Ndbif.cpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/Ndbif.cpp	2009-06-22 08:23:35 +0000
@@ -1455,7 +1455,8 @@ NdbTransaction::sendTC_COMMIT_ACK(Transp
 }
 
 int
-NdbImpl::send_event_report(Uint32 *data, Uint32 length)
+NdbImpl::send_event_report(bool has_lock,
+                           Uint32 *data, Uint32 length)
 {
   NdbApiSignal aSignal(m_ndb.theMyRef);
   TransporterFacade *tp = m_transporter_facade;
@@ -1465,15 +1466,29 @@ NdbImpl::send_event_report(Uint32 *data,
   aSignal.theLength               = length;
   memcpy((char *)aSignal.getDataPtrSend(), (char *)data, length*4);
 
+
+  int ret = 0;
+  if (!has_lock)
+  {
+    tp->lock_mutex();
+  }
   Uint32 tNode;
   Ndb_cluster_connection_node_iter node_iter;
   m_ndb_cluster_connection.init_get_next_node(node_iter);
   while ((tNode= m_ndb_cluster_connection.get_next_node(node_iter)))
   {
-    if(tp->get_node_alive(tNode)){
+    if(tp->get_node_alive(tNode))
+    {
       tp->sendSignal(&aSignal, tNode);
-      return 0;
+      goto done;
     }
   }
-  return 1;
+  
+  ret = 1;
+done:
+  if (!has_lock)
+  {
+    tp->unlock_mutex();
+  }
+  return ret;
 }

=== modified file 'storage/ndb/src/ndbapi/ndb_internal.hpp'
--- a/storage/ndb/src/ndbapi/ndb_internal.hpp	2009-05-26 18:53:34 +0000
+++ b/storage/ndb/src/ndbapi/ndb_internal.hpp	2009-06-22 08:23:35 +0000
@@ -25,6 +25,6 @@ private:
   friend class BackupRestore;
   Ndb_internal() {}
   virtual ~Ndb_internal() {}
-  static int send_event_report(Ndb *ndb, Uint32 *data, Uint32 length)
-    { return ndb->theImpl->send_event_report(data, length); }
+  static int send_event_report(bool has_lock, Ndb *ndb, Uint32 *data, Uint32 length)
+    { return ndb->theImpl->send_event_report(has_lock, data, length); }
 };

=== modified file 'storage/ndb/tools/restore/consumer_restore.cpp'
--- a/storage/ndb/tools/restore/consumer_restore.cpp	2009-06-15 05:46:54 +0000
+++ b/storage/ndb/tools/restore/consumer_restore.cpp	2009-06-22 08:23:35 +0000
@@ -732,7 +732,7 @@ BackupRestore::report_started(unsigned b
     data[0]= NDB_LE_RestoreStarted;
     data[1]= backup_id;
     data[2]= node_id;
-    Ndb_internal::send_event_report(m_ndb, data, 3);
+    Ndb_internal::send_event_report(false /* has lock */, m_ndb, data, 3);
   }
   return true;
 }
@@ -751,7 +751,7 @@ BackupRestore::report_meta_data(unsigned
     data[5]= m_n_logfilegroup;
     data[6]= m_n_datafile;
     data[7]= m_n_undofile;
-    Ndb_internal::send_event_report(m_ndb, data, 8);
+    Ndb_internal::send_event_report(false /* has lock */, m_ndb, data, 8);
   }
   return true;
 }
@@ -768,7 +768,7 @@ BackupRestore::report_data(unsigned back
     data[4]= 0;
     data[5]= m_dataBytes & 0xFFFFFFFF;
     data[6]= (m_dataBytes >> 32) & 0xFFFFFFFF;
-    Ndb_internal::send_event_report(m_ndb, data, 7);
+    Ndb_internal::send_event_report(false /* has lock */, m_ndb, data, 7);
   }
   return true;
 }
@@ -786,7 +786,7 @@ BackupRestore::report_log(unsigned backu
     data[4]= 0;
     data[5]= m_logBytes & 0xFFFFFFFF;
     data[6]= (m_logBytes >> 32) & 0xFFFFFFFF;
-    Ndb_internal::send_event_report(m_ndb, data, 7);
+    Ndb_internal::send_event_report(false /* has lock */, m_ndb, data, 7);
   }
   return true;
 }
@@ -800,7 +800,7 @@ BackupRestore::report_completed(unsigned
     data[0]= NDB_LE_RestoreCompleted;
     data[1]= backup_id;
     data[2]= node_id;
-    Ndb_internal::send_event_report(m_ndb, data, 3);
+    Ndb_internal::send_event_report(false /* has lock */, m_ndb, data, 3);
   }
   return true;
 }


Attachment: [text/bzr-bundle] bzr/jonas@mysql.com-20090622085059-6es3unsvnr1dk0ip.bundle
Thread
bzr push into mysql-5.1-telco-6.2 branch (jonas:2947 to 2949)Jonas Oreland22 Jun