WatchDog.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <my_pthread.h>
  15. #include "WatchDog.hpp"
  16. #include "GlobalData.hpp"
  17. #include <NdbOut.hpp>
  18. #include <NdbSleep.h>
  19. #include <ErrorHandlingMacros.hpp>
  20.    
  21. extern "C" 
  22. void* 
  23. runWatchDog(void* w){
  24.   ((WatchDog*)w)->run();
  25.   return NULL;
  26. }
  27. WatchDog::WatchDog(Uint32 interval) : 
  28.   theIPValue(globalData.getWatchDogPtr())
  29. {
  30.   setCheckInterval(interval);
  31.   theStop = false;
  32.   theThreadPtr = 0;
  33. }
  34. WatchDog::~WatchDog(){
  35.   doStop();
  36. }
  37. Uint32
  38. WatchDog::setCheckInterval(Uint32 interval){
  39.   // An interval of less than 70ms is not acceptable
  40.   return theInterval = (interval < 70 ? 70 : interval);
  41. }
  42. void
  43. WatchDog::doStart(){
  44.   theStop = false;
  45.   theThreadPtr = NdbThread_Create(runWatchDog, 
  46.   (void**)this, 
  47.   32768,
  48.   "ndb_watchdog",
  49.                                   NDB_THREAD_PRIO_HIGH);
  50. }
  51. void
  52. WatchDog::doStop(){
  53.   void *status;
  54.   theStop = true;
  55.   if(theThreadPtr){
  56.     NdbThread_WaitFor(theThreadPtr, &status);
  57.     NdbThread_Destroy(&theThreadPtr);
  58.   }
  59. }
  60. void 
  61. WatchDog::run(){
  62.   unsigned int anIPValue;
  63.   unsigned int alerts = 0;
  64.   unsigned int oldIPValue = 0;
  65.   
  66.   // WatchDog for the single threaded NDB
  67.   while(!theStop){
  68.     Uint32 tmp  = theInterval / 500;
  69.     tmp= (tmp ? tmp : 1);
  70.     
  71.     while(!theStop && tmp > 0){
  72.       NdbSleep_MilliSleep(500);
  73.       tmp--;
  74.     }
  75.     
  76.     if(theStop)
  77.       break;
  78.     // Verify that the IP thread is not stuck in a loop
  79.     anIPValue = *theIPValue;
  80.     if(anIPValue != 0) {
  81.       oldIPValue = anIPValue;
  82.       globalData.incrementWatchDogCounter(0);
  83.       alerts = 0;
  84.     } else {
  85.       alerts++;
  86.       ndbout << "Ndb kernel is stuck in: ";
  87.       switch (oldIPValue) {
  88.       case 1:
  89.         ndbout << "Job Handling" << endl;
  90.         break;
  91.       case 2:
  92.         ndbout << "Scanning Timers" << endl;
  93.         break;
  94.       case 3:
  95.         ndbout << "External I/O" << endl;
  96.         break;
  97.       case 4:
  98.         ndbout << "Print Job Buffers at crash" << endl;
  99.         break;
  100.       case 5:
  101.         ndbout << "Checking connections" << endl;
  102.         break;
  103.       case 6:
  104.         ndbout << "Performing Send" << endl;
  105.         break;
  106.       case 7:
  107.         ndbout << "Polling for Receive" << endl;
  108.         break;
  109.       case 8:
  110.         ndbout << "Performing Receive" << endl;
  111.         break;
  112.       default:
  113.         ndbout << "Unknown place" << endl;
  114.         break;
  115.       }//switch
  116.       if(alerts == 3){
  117. shutdownSystem();
  118.       }
  119.     }
  120.   }
  121.   return;
  122. }
  123. void
  124. WatchDog::shutdownSystem(){
  125.   
  126.   ErrorReporter::handleError(ecError,
  127.      ERR_PROGRAMERROR,
  128.      "WatchDog terminate",
  129.      __FILE__,
  130.      NST_Watchdog);
  131. }