summaryrefslogtreecommitdiff
path: root/storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp')
-rw-r--r--storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp b/storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp
new file mode 100644
index 00000000000..efa4b9c92c5
--- /dev/null
+++ b/storage/ndb/src/kernel/blocks/dbdih/printSysfile/printSysfile.cpp
@@ -0,0 +1,158 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+#include <ndb_global.h>
+
+#include <NdbMain.h>
+#include <NdbOut.hpp>
+#include <Sysfile.hpp>
+
+void
+usage(const char * prg){
+ ndbout << "Usage " << prg
+ << " P[0-1].sysfile" << endl;
+}
+
+struct NSString {
+ Sysfile::ActiveStatus NodeStatus;
+ const char * desc;
+};
+
+static const
+NSString NodeStatusStrings[] = {
+ { Sysfile::NS_Active, "Active " },
+ { Sysfile::NS_ActiveMissed_1, "Active missed 1" },
+ { Sysfile::NS_ActiveMissed_2, "Active missed 2" },
+ { Sysfile::NS_ActiveMissed_3, "Active missed 3" },
+ { Sysfile::NS_HotSpare, "Hot spare " },
+ { Sysfile::NS_NotActive_NotTakenOver, "Not active " },
+ { Sysfile::NS_TakeOver, "Take over " },
+ { Sysfile::NS_NotActive_TakenOver, "Taken over " },
+ { Sysfile::NS_NotDefined, "Not defined " },
+ { Sysfile::NS_Standby, "Stand by " }
+};
+
+const
+char * getNSString(Uint32 ns){
+ for(Uint32 i = 0; i<(sizeof(NodeStatusStrings)/sizeof(NSString)); i++)
+ if((Uint32)NodeStatusStrings[i].NodeStatus == ns)
+ return NodeStatusStrings[i].desc;
+ return "<Unknown state>";
+}
+
+void
+fill(const char * buf, int mod){
+ int len = strlen(buf)+1;
+ ndbout << buf << " ";
+ while((len % mod) != 0){
+ ndbout << " ";
+ len++;
+ }
+}
+
+void
+print(const char * filename, const Sysfile * sysfile){
+ char buf[255];
+ ndbout << "----- Sysfile: " << filename << " -----" << endl;
+ ndbout << "Initial start ongoing: "
+ << Sysfile::getInitialStartOngoing(sysfile->systemRestartBits)
+ << ", ";
+
+ ndbout << "Restart Ongoing: "
+ << Sysfile::getRestartOngoing(sysfile->systemRestartBits)
+ << ", ";
+
+ ndbout << "LCP Ongoing: "
+ << Sysfile::getLCPOngoing(sysfile->systemRestartBits)
+ << endl;
+
+
+ ndbout << "-- Global Checkpoint Identities: --" << endl;
+ sprintf(buf, "keepGCI = %u", sysfile->keepGCI);
+ fill(buf, 40);
+ ndbout << " -- Tail of REDO log" << endl;
+
+ sprintf(buf, "oldestRestorableGCI = %u", sysfile->oldestRestorableGCI);
+ fill(buf, 40);
+ ndbout << " -- " << endl;
+
+ sprintf(buf, "newestRestorableGCI = %u", sysfile->newestRestorableGCI);
+ fill(buf, 40);
+ ndbout << " -- " << endl;
+
+ sprintf(buf, "latestLCP = %u", sysfile->latestLCP_ID);
+ fill(buf, 40);
+ ndbout << " -- " << endl;
+
+ ndbout << "-- Node status: --" << endl;
+ for(int i = 1; i < MAX_NDB_NODES; i++){
+ if(Sysfile::getNodeStatus(i, sysfile->nodeStatus) !=Sysfile::NS_NotDefined){
+ sprintf(buf,
+ "Node %.2d -- %s GCP: %d, NodeGroup: %d, TakeOverNode: %d, "
+ "LCP Ongoing: %s",
+ i,
+ getNSString(Sysfile::getNodeStatus(i,sysfile->nodeStatus)),
+ sysfile->lastCompletedGCI[i],
+ Sysfile::getNodeGroup(i, sysfile->nodeGroups),
+ Sysfile::getTakeOverNode(i, sysfile->takeOver),
+ BitmaskImpl::get(NdbNodeBitmask::Size,
+ sysfile->lcpActive, i) != 0 ? "yes" : "no");
+ ndbout << buf << endl;
+ }
+ }
+}
+
+NDB_COMMAND(printSysfile,
+ "printSysfile", "printSysfile", "Prints a sysfile", 16384){
+ if(argc < 2){
+ usage(argv[0]);
+ return 0;
+ }
+
+ for(int i = 1; i<argc; i++){
+ const char * filename = argv[i];
+
+ struct stat sbuf;
+ const int res = stat(filename, &sbuf);
+ if(res != 0){
+ ndbout << "Could not find file: \"" << filename << "\"" << endl;
+ continue;
+ }
+ const Uint32 bytes = sbuf.st_size;
+
+ Uint32 * buf = new Uint32[bytes/4+1];
+
+ FILE * f = fopen(filename, "rb");
+ if(f == 0){
+ ndbout << "Failed to open file" << endl;
+ delete [] buf;
+ continue;
+ }
+ Uint32 sz = fread(buf, 1, bytes, f);
+ fclose(f);
+ if(sz != bytes){
+ ndbout << "Failure while reading file" << endl;
+ delete [] buf;
+ continue;
+ }
+
+ print(filename, (Sysfile *)&buf[0]);
+ delete [] buf;
+ continue;
+ }
+ return 0;
+}