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

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 <NdbMain.h>
  15. #include <NdbOut.hpp>
  16. #include <Sysfile.hpp>
  17. void 
  18. usage(const char * prg){
  19.   ndbout << "Usage " << prg 
  20.  << " P[0-1].sysfile" << endl;  
  21. }
  22. struct NSString {
  23.   Sysfile::ActiveStatus NodeStatus;
  24.   const char * desc;
  25. };
  26. static const
  27. NSString NodeStatusStrings[] = {
  28.   { Sysfile::NS_Active,                 "Active         " },
  29.   { Sysfile::NS_ActiveMissed_1,         "Active missed 1" },
  30.   { Sysfile::NS_ActiveMissed_2,         "Active missed 2" },
  31.   { Sysfile::NS_ActiveMissed_3,         "Active missed 3" },
  32.   { Sysfile::NS_HotSpare,               "Hot spare      " },
  33.   { Sysfile::NS_NotActive_NotTakenOver, "Not active     " },
  34.   { Sysfile::NS_TakeOver,               "Take over      " },
  35.   { Sysfile::NS_NotActive_TakenOver,    "Taken over     " },
  36.   { Sysfile::NS_NotDefined,             "Not defined    " },
  37.   { Sysfile::NS_Standby,                "Stand by       " }
  38. };
  39. const
  40. char * getNSString(Uint32 ns){
  41.   for(Uint32 i = 0; i<(sizeof(NodeStatusStrings)/sizeof(NSString)); i++)
  42.     if((Uint32)NodeStatusStrings[i].NodeStatus == ns)
  43.       return NodeStatusStrings[i].desc;
  44.   return "<Unknown state>";
  45. }
  46. void
  47. fill(const char * buf, int mod){
  48.   int len = strlen(buf)+1;
  49.   ndbout << buf << " ";
  50.   while((len % mod) != 0){
  51.     ndbout << " ";
  52.     len++;
  53.   }
  54. }
  55. void 
  56. print(const char * filename, const Sysfile * sysfile){
  57.   char buf[255];
  58.   ndbout << "----- Sysfile: " << filename << " -----" << endl;
  59.   ndbout << "Initial start ongoing: " 
  60.  << Sysfile::getInitialStartOngoing(sysfile->systemRestartBits) 
  61.  << ", ";
  62.   ndbout << "Restart Ongoing: "
  63.  << Sysfile::getRestartOngoing(sysfile->systemRestartBits) 
  64.  << ", ";
  65.   ndbout << "LCP Ongoing: "
  66.  << Sysfile::getLCPOngoing(sysfile->systemRestartBits) 
  67.  << endl;
  68.   ndbout << "-- Global Checkpoint Identities: --" << endl;
  69.   sprintf(buf, "keepGCI = %u", sysfile->keepGCI);
  70.   fill(buf, 40); 
  71.   ndbout << " -- Tail of REDO log" << endl;
  72.   
  73.   sprintf(buf, "oldestRestorableGCI = %u", sysfile->oldestRestorableGCI);
  74.   fill(buf, 40);
  75.   ndbout << " -- " << endl;
  76.   sprintf(buf, "newestRestorableGCI = %u", sysfile->newestRestorableGCI);
  77.   fill(buf, 40);
  78.   ndbout << " -- " << endl;
  79.   sprintf(buf, "latestLCP = %u", sysfile->latestLCP_ID);
  80.   fill(buf, 40);
  81.   ndbout << " -- " << endl;
  82.   ndbout << "-- Node status: --" << endl;
  83.   for(int i = 1; i < MAX_NDB_NODES; i++){
  84.     if(Sysfile::getNodeStatus(i, sysfile->nodeStatus) !=Sysfile::NS_NotDefined){
  85.       sprintf(buf, 
  86.       "Node %.2d -- %s GCP: %d, NodeGroup: %d, TakeOverNode: %d, "
  87.       "LCP Ongoing: %s",
  88.       i, 
  89.       getNSString(Sysfile::getNodeStatus(i,sysfile->nodeStatus)),
  90.       sysfile->lastCompletedGCI[i],
  91.       Sysfile::getNodeGroup(i, sysfile->nodeGroups),
  92.       Sysfile::getTakeOverNode(i, sysfile->takeOver),
  93.       BitmaskImpl::get(NdbNodeBitmask::Size, 
  94.        sysfile->lcpActive, i) != 0 ? "yes" : "no");
  95.       ndbout << buf << endl;
  96.     }
  97.   }
  98. }
  99. NDB_COMMAND(printSysfile, 
  100.     "printSysfile", "printSysfile", "Prints a sysfile", 16384){ 
  101.   if(argc < 2){
  102.     usage(argv[0]);
  103.     return 0;
  104.   }
  105.   for(int i = 1; i<argc; i++){
  106.     const char * filename = argv[i];
  107.     
  108.     struct stat sbuf;
  109.     const int res = stat(filename, &sbuf);
  110.     if(res != 0){
  111.       ndbout << "Could not find file: "" << filename << """ << endl;
  112.       continue;
  113.     }
  114.     const Uint32 bytes = sbuf.st_size;
  115.     
  116.     Uint32 * buf = new Uint32[bytes/4+1];
  117.     
  118.     FILE * f = fopen(filename, "rb");
  119.     if(f == 0){
  120.       ndbout << "Failed to open file" << endl;
  121.       delete [] buf;
  122.       continue;
  123.     }
  124.     Uint32 sz = fread(buf, 1, bytes, f);
  125.     fclose(f);
  126.     if(sz != bytes){
  127.       ndbout << "Failure while reading file" << endl;
  128.       delete [] buf;
  129.       continue;
  130.     }
  131.     
  132.     print(filename, (Sysfile *)&buf[0]);
  133.     delete [] buf;
  134.     continue;
  135.   }
  136.   return 0;
  137. }