List:Internals« Previous MessageNext Message »
From:tomas Date:July 14 2005 6:04pm
Subject:bk commit into 4.1 tree (tomas:1.2355) BUG#11898
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of tomas. When tomas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2355 05/07/14 18:04:44 tomas@stripped +3 -0
       BUG#11898 ndb_mgmd not releasing resources, added "ping" on add_listener
      + added close of some fd's
      + debug prints

  ndb/src/mgmsrv/Services.cpp
    1.33 05/07/14 18:04:38 tomas@stripped +76 -17
     BUG#11898 ndb_mgmd not releasing resources, added "ping" on add_listener
    + added close of some fd's
    + debug prints

  ndb/src/mgmsrv/MgmtSrvr.hpp
    1.26 05/07/14 18:04:37 tomas@stripped +1 -10
     BUG#11898 ndb_mgmd not releasing resources, added "ping"
    + debug prints

  ndb/src/mgmclient/CommandInterpreter.cpp
    1.48 05/07/14 18:04:37 tomas@stripped +28 -6
     BUG#11898 ndb_mgmd not releasing resources, added "ping"
    + debug prints

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	tomas
# Host:	poseidon.ndb.mysql.com
# Root:	/home/tomas/mysql-4.1-new

--- 1.47/ndb/src/mgmclient/CommandInterpreter.cpp	2005-06-02 21:13:56 +02:00
+++ 1.48/ndb/src/mgmclient/CommandInterpreter.cpp	2005-07-14 18:04:37 +02:00
@@ -455,11 +455,13 @@
 static void*
 event_thread_run(void* m)
 {
+  DBUG_ENTER("event_thread_run");
+
   NdbMgmHandle handle= *(NdbMgmHandle*)m;
 
   int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 };
   int fd = ndb_mgm_listen_event(handle, filter);
-  if (fd > 0)
+  if (fd != NDB_INVALID_SOCKET)
   {
     do_event_thread= 1;
     char *tmp= 0;
@@ -468,20 +470,26 @@
     do {
       if (tmp == 0) NdbSleep_MilliSleep(10);
       if((tmp = in.gets(buf, 1024)))
-	ndbout << tmp;
+      {
+	const char ping_token[]= "<PING>";
+	if (memcmp(ping_token,tmp,sizeof(ping_token)-1))
+	  ndbout << tmp;
+      }
     } while(do_event_thread);
+    NDB_CLOSE_SOCKET(fd);
   }
   else
   {
     do_event_thread= -1;
   }
 
-  return NULL;
+  DBUG_RETURN(NULL);
 }
 
 bool
 CommandInterpreter::connect() 
 {
+  DBUG_ENTER("CommandInterpreter::connect");
   if(!m_connected)
   {
     if(!ndb_mgm_connect(m_mgmsrv, try_reconnect-1, 5, 1))
@@ -512,8 +520,19 @@
 	    do_event_thread == 0 ||
 	    do_event_thread == -1)
 	{
-	  printf("Warning, event thread startup failed, degraded printouts as result\n");
+	  DBUG_PRINT("info",("Warning, event thread startup failed, "
+			     "degraded printouts as result, errno=%d",
+			     errno));
+	  printf("Warning, event thread startup failed, "
+		 "degraded printouts as result, errno=%d\n", errno);
 	  do_event_thread= 0;
+	  if (m_event_thread)
+	  {
+	    void *res;
+	    NdbThread_WaitFor(m_event_thread, &res);
+	    NdbThread_Destroy(&m_event_thread);
+	  }
+	  ndb_mgm_disconnect(m_mgmsrv2);
 	}
       }
       else
@@ -521,6 +540,8 @@
 	printf("Warning, event connect failed, degraded printouts as result\n");
       }
       m_connected= true;
+      DBUG_PRINT("info",("Connected to Management Server at: %s:%d",
+			 host,port));
       if (m_verbose)
       {
 	printf("Connected to Management Server at: %s:%d\n",
@@ -528,12 +549,13 @@
       }
     }
   }
-  return m_connected;
+  DBUG_RETURN(m_connected);
 }
 
 bool 
 CommandInterpreter::disconnect() 
 {
+  DBUG_ENTER("CommandInterpreter::disconnect");
   if (m_event_thread) {
     void *res;
     do_event_thread= 0;
@@ -550,7 +572,7 @@
     }
     m_connected= false;
   }
-  return true;
+  DBUG_RETURN(true);
 }
 
 //*****************************************************************************

--- 1.25/ndb/src/mgmsrv/MgmtSrvr.hpp	2005-04-22 09:07:22 +02:00
+++ 1.26/ndb/src/mgmsrv/MgmtSrvr.hpp	2005-07-14 18:04:37 +02:00
@@ -60,6 +60,7 @@
   }
   
   void add_listener(const Event_listener&);
+  void check_listeners();
   void update_max_log_level(const LogLevel&);
   void update_log_level(const LogLevel&);
   
@@ -764,16 +765,6 @@
   int send(class NdbApiSignal* signal, Uint32 node, Uint32 node_type);
 
   ConfigRetriever *m_config_retriever;
-
-public:
-  /**
-   * This method does not exist
-   */
-  struct Area51 {
-    class TransporterFacade * theFacade;
-    class TransporterRegistry * theRegistry;
-  };
-  Area51 getStuff();
 };
 
 inline

--- 1.32/ndb/src/mgmsrv/Services.cpp	2004-12-17 10:32:22 +01:00
+++ 1.33/ndb/src/mgmsrv/Services.cpp	2005-07-14 18:04:38 +02:00
@@ -253,15 +253,19 @@
 };
 
 MgmApiSession::MgmApiSession(class MgmtSrvr & mgm, NDB_SOCKET_TYPE sock)
-  : SocketServer::Session(sock), m_mgmsrv(mgm) {
+  : SocketServer::Session(sock), m_mgmsrv(mgm)
+{
+  DBUG_ENTER("MgmApiSession::MgmApiSession");
   m_input = new SocketInputStream(sock);
   m_output = new SocketOutputStream(sock);
   m_parser = new Parser_t(commands, *m_input, true, true, true);
   m_allocated_resources= new MgmtSrvr::Allocated_resources(m_mgmsrv);
+  DBUG_VOID_RETURN;
 }
 
 MgmApiSession::~MgmApiSession()
 {
+  DBUG_ENTER("MgmApiSession::~MgmApiSession");
   if (m_input)
     delete m_input;
   if (m_output)
@@ -270,10 +274,19 @@
     delete m_parser;
   if (m_allocated_resources)
     delete m_allocated_resources;
+  if(m_socket != NDB_INVALID_SOCKET)
+  {
+    NDB_CLOSE_SOCKET(m_socket);
+    m_socket= NDB_INVALID_SOCKET;
+  }
+  DBUG_VOID_RETURN;
 }
 
 void
-MgmApiSession::runSession() {
+MgmApiSession::runSession()
+{
+  DBUG_ENTER("MgmApiSession::runSession");
+
   Parser_t::Context ctx;
   while(!m_stop) {
     m_parser->run(ctx, *this);
@@ -301,8 +314,13 @@
       break;
     }
   }
-  if(m_socket >= 0)
+  if(m_socket != NDB_INVALID_SOCKET)
+  {
     NDB_CLOSE_SOCKET(m_socket);
+    m_socket= NDB_INVALID_SOCKET;
+  }
+
+  DBUG_VOID_RETURN;
 }
 
 #ifdef MGM_GET_CONFIG_BACKWARDS_COMPAT
@@ -1236,7 +1254,7 @@
   Uint32 threshold;
   LogLevel::EventCategory cat;
   Logger::LoggerLevel severity;
-  int i;
+  int i, n;
   DBUG_ENTER("Ndb_mgmd_event_service::log");
   DBUG_PRINT("enter",("eventType=%d, nodeid=%d", eventType, nodeId));
 
@@ -1248,28 +1266,30 @@
 
   Vector<NDB_SOCKET_TYPE> copy; 
   m_clients.lock();
-  for(i = m_clients.size() - 1; i >= 0; i--){
-    if(threshold <= m_clients[i].m_logLevel.getLogLevel(cat)){
-      if(m_clients[i].m_socket != NDB_INVALID_SOCKET &&
-	 println_socket(m_clients[i].m_socket, 
-			MAX_WRITE_TIMEOUT, m_text) == -1){
-	copy.push_back(m_clients[i].m_socket);
+  for(i = m_clients.size() - 1; i >= 0; i--)
+  {
+    if(threshold <= m_clients[i].m_logLevel.getLogLevel(cat))
+    {
+      int fd= m_clients[i].m_socket;
+      if(fd != NDB_INVALID_SOCKET &&
+	 println_socket(fd, MAX_WRITE_TIMEOUT, m_text) == -1)
+      {
+	copy.push_back(fd);
 	m_clients.erase(i, false);
       }
     }
   }
   m_clients.unlock();
   
-  for(i = 0; (unsigned)i < copy.size(); i++){
-    NDB_CLOSE_SOCKET(copy[i]);
-  }
+  if ((n= (int)copy.size()))
+  {
+    for(i= 0; i < n; i++)
+      NDB_CLOSE_SOCKET(copy[i]);
 
-  if(copy.size()){
     LogLevel tmp; tmp.clear();
     m_clients.lock();
-    for(i = 0; (unsigned)i < m_clients.size(); i++){
+    for(i= m_clients.size() - 1; i >= 0; i--)
       tmp.set_max(m_clients[i].m_logLevel);
-    }
     m_clients.unlock();
     update_log_level(tmp);
   }
@@ -1297,9 +1317,48 @@
 }
 
 void
-Ndb_mgmd_event_service::add_listener(const Event_listener& client){
+Ndb_mgmd_event_service::check_listeners()
+{
+  int i, n= 0;
+  DBUG_ENTER("Ndb_mgmd_event_service::check_listeners");
+  m_clients.lock();
+  for(i= m_clients.size() - 1; i >= 0; i--)
+  {
+    int fd= m_clients[i].m_socket;
+    DBUG_PRINT("info",("%d %d",i,fd));
+    char buf[1];
+    buf[0]=0;
+    if (fd != NDB_INVALID_SOCKET &&
+	println_socket(fd,MAX_WRITE_TIMEOUT,"<PING>") == -1)
+    {
+      NDB_CLOSE_SOCKET(fd);
+      m_clients.erase(i, false);
+      n=1;
+    }
+  }
+  if (n)
+  {
+    LogLevel tmp; tmp.clear();
+    for(i= m_clients.size() - 1; i >= 0; i--)
+      tmp.set_max(m_clients[i].m_logLevel);
+    update_log_level(tmp);
+  }
+  m_clients.unlock();
+  DBUG_VOID_RETURN;
+}
+
+void
+Ndb_mgmd_event_service::add_listener(const Event_listener& client)
+{
+  DBUG_ENTER("Ndb_mgmd_event_service::add_listener");
+  DBUG_PRINT("enter",("client.m_socket: %d", client.m_socket));
+
+  check_listeners();
+
   m_clients.push_back(client);
   update_max_log_level(client.m_logLevel);
+
+  DBUG_VOID_RETURN;
 }
 
 void
Thread
bk commit into 4.1 tree (tomas:1.2355) BUG#11898tomas14 Jul