4587 jonas oreland 2011-10-11
ndb - add ndbinfo.operations showing ongoing operations
TODO: - SQL
- maybe use coord-trans type transaction id (not to confuse things too much)
- expose transaction id per mysql-connection, maybe using information_schema
NOTE: Patch introduces NDB_INFO_OP-defines, for enumerating operation types
instead of exposing to many LQH details.
modified:
mysql-test/suite/ndb/r/ndbinfo.result
storage/ndb/include/ndb_constants.h
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/kernel/vm/Ndbinfo.hpp
storage/ndb/src/kernel/vm/NdbinfoTables.cpp
4586 magnus.blaudd@stripped 2011-10-10 [merge]
Merge 6.3 -> 7.0
modified:
mysql-test/mysql-test-run.pl
=== modified file 'mysql-test/suite/ndb/r/ndbinfo.result'
--- a/mysql-test/suite/ndb/r/ndbinfo.result 2011-10-07 14:34:14 +0000
+++ b/mysql-test/suite/ndb/r/ndbinfo.result 2011-10-11 08:11:15 +0000
@@ -40,9 +40,10 @@ table_id table_name comment
11 threadblocks which blocks are run in which threads
12 threadstat threadstat
13 transactions transactions
+14 operations operations
SELECT COUNT(*) FROM ndb$tables;
COUNT(*)
-14
+15
SELECT * FROM ndb$tables WHERE table_id = 2;
table_id table_name comment
2 test for testing
@@ -56,11 +57,12 @@ table_id table_name comment
11 threadblocks which blocks are run in which threads
12 threadstat threadstat
13 transactions transactions
+14 operations operations
SELECT * FROM ndb$tables WHERE table_name = 'LOGDESTINATION';
table_id table_name comment
SELECT COUNT(*) FROM ndb$tables t1, ndb$tables t2 WHERE t1.table_id = t1.table_id;
COUNT(*)
-196
+225
SELECT table_id, table_name, comment from ndb$tables
WHERE table_id > 2 AND table_id <= 5 ORDER BY table_id;
@@ -79,6 +81,7 @@ table_id table_name
6 logbuffers
5 logspaces
9 nodes
+14 operations
3 pools
7 resources
0 tables
@@ -136,6 +139,7 @@ table_id
11
12
13
+14
TRUNCATE ndb$tables;
ERROR HY000: Table 'ndb$tables' is read only
=== modified file 'storage/ndb/include/ndb_constants.h'
--- a/storage/ndb/include/ndb_constants.h 2011-08-11 17:11:30 +0000
+++ b/storage/ndb/include/ndb_constants.h 2011-10-11 08:11:15 +0000
@@ -124,4 +124,22 @@
#define NDB_INDEX_STAT_PREFIX "ndb_index_stat"
+/**
+ * Defines for NDB$INFO.OPERATIONS
+ */
+#define NDB_INFO_OP_UNKNOWN 0
+#define NDB_INFO_OP_READ 1
+#define NDB_INFO_OP_READ_SH 2
+#define NDB_INFO_OP_READ_EX 3
+#define NDB_INFO_OP_INSERT 4
+#define NDB_INFO_OP_UPDATE 5
+#define NDB_INFO_OP_DELETE 6
+#define NDB_INFO_OP_WRITE 7
+#define NDB_INFO_OP_UNLOCK 8
+#define NDB_INFO_OP_REFRESH 9
+#define NDB_INFO_OP_SCAN_UNKNOWN (256 + 0)
+#define NDB_INFO_OP_SCAN (256 + 1)
+#define NDB_INFO_OP_SCAN_SH (256 + 2)
+#define NDB_INFO_OP_SCAN_EX (256 + 3)
+
#endif
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2011-06-30 15:59:25 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2011-10-11 08:11:15 +0000
@@ -2687,6 +2687,10 @@ private:
bool validate_filter(Signal*);
bool match_and_print(Signal*, Ptr<TcConnectionrec>);
+ void ndbinfo_write_op(Signal* signal,
+ DbinfoScanReq * req,
+ Ndbinfo::Ratelimit * rl,
+ TcConnectionrecPtr tcPtr);
void define_backup(Signal*);
void execDEFINE_BACKUP_REF(Signal*);
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-09-26 07:58:35 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2011-10-11 08:11:15 +0000
@@ -23393,6 +23393,41 @@ void Dblqh::execDBINFO_SCANREQ(Signal *s
}
break;
}
+ case Ndbinfo::OPERATIONS_TABLEID:{
+ Uint32 bucket = cursor->data[0];
+
+ while (true)
+ {
+ if (rl.need_break(req))
+ {
+ jam();
+ ndbinfo_send_scan_break(signal, req, rl, bucket);
+ return;
+ }
+
+ for (; bucket < NDB_ARRAY_SIZE(ctransidHash); bucket++)
+ {
+ if (ctransidHash[bucket] != RNIL)
+ break;
+ }
+
+ if (bucket == NDB_ARRAY_SIZE(ctransidHash))
+ {
+ break;
+ }
+
+ TcConnectionrecPtr tcPtr;
+ tcPtr.i = ctransidHash[bucket];
+ while (tcPtr.i != RNIL)
+ {
+ jam();
+ ptrCheckGuard(tcPtr, ctcConnectrecFileSize, tcConnectionrec);
+ ndbinfo_write_op(signal, &req, &rl, tcPtr);
+ tcPtr.i = tcPtr.p->nextHashRec;
+ }
+ bucket++;
+ }
+ }
default:
break;
@@ -23401,6 +23436,85 @@ void Dblqh::execDBINFO_SCANREQ(Signal *s
ndbinfo_send_scan_conf(signal, req, rl);
}
+void
+Dblqh::ndbinfo_write_op(Signal* signal,
+ DbinfoScanReq * req,
+ Ndbinfo::Ratelimit * rl,
+ TcConnectionrecPtr tcPtr)
+{
+ Ndbinfo::Row row(signal, *req);
+ row.write_uint32(getOwnNodeId());
+ row.write_uint32(instance()); // block instance
+ row.write_uint32(tcPtr.i); // objid
+ row.write_uint32(tcPtr.p->tcBlockref); // tcref
+ row.write_uint32(tcPtr.p->applRef); // apiref
+
+ char transid[64];
+ BaseString::snprintf(transid, sizeof(transid),
+ "%.8x.%.8x",
+ tcPtr.p->transid[0],
+ tcPtr.p->transid[1]);
+ row.write_string(transid);
+ row.write_uint32(tcPtr.p->tableref);
+ row.write_uint32(tcPtr.p->fragmentid);
+
+ if (tcPtr.p->tcScanRec != RNIL)
+ {
+ ScanRecordPtr sp;
+ sp.i = tcPtr.p->tcScanRec;
+ c_scanRecordPool.getPtr(sp);
+
+ Uint32 op = NDB_INFO_OP_SCAN_UNKNOWN;
+ if (sp.p->scanLockMode)
+ op = NDB_INFO_OP_SCAN_EX;
+ else if (sp.p->scanLockHold)
+ op = NDB_INFO_OP_SCAN_SH;
+ else
+ op = NDB_INFO_OP_SCAN;
+
+ row.write_uint32(op);
+ row.write_uint32(sp.p->scanState);
+ row.write_uint32(0);
+ }
+ else
+ {
+ Uint32 op = NDB_INFO_OP_UNKNOWN;
+ switch(tcPtr.p->operation){
+ case ZREAD:
+ if (tcPtr.p->lockType)
+ op = NDB_INFO_OP_READ_EX;
+ else if (!tcPtr.p->dirtyOp)
+ op = NDB_INFO_OP_READ_SH;
+ else
+ op = NDB_INFO_OP_READ;
+ break;
+ case ZINSERT:
+ op = NDB_INFO_OP_INSERT;
+ break;
+ case ZUPDATE:
+ op = NDB_INFO_OP_UPDATE;
+ break;
+ case ZDELETE:
+ op = NDB_INFO_OP_DELETE;
+ break;
+ case ZWRITE:
+ op = NDB_INFO_OP_WRITE;
+ break;
+ case ZUNLOCK:
+ op = NDB_INFO_OP_UNLOCK;
+ break;
+ case ZREFRESH:
+ op = NDB_INFO_OP_REFRESH;
+ break;
+ }
+ row.write_uint32(op);
+ row.write_uint32(tcPtr.p->transactionState);
+ row.write_uint32(0);
+ }
+
+ ndbinfo_send_row(signal, *req, row, *rl);
+}
+
/* **************************************************************** */
/* ---------------------------------------------------------------- */
=== modified file 'storage/ndb/src/kernel/vm/Ndbinfo.hpp'
--- a/storage/ndb/src/kernel/vm/Ndbinfo.hpp 2011-10-07 14:34:14 +0000
+++ b/storage/ndb/src/kernel/vm/Ndbinfo.hpp 2011-10-11 08:11:15 +0000
@@ -49,7 +49,8 @@ public:
DISKPAGEBUFFER_TABLEID = 10,
THREADBLOCKS_TABLEID = 11,
THREADSTAT_TABLEID = 12,
- TRANSACTIONS_TABLEID = 13
+ TRANSACTIONS_TABLEID = 13,
+ OPERATIONS_TABLEID = 14
};
struct Table {
=== modified file 'storage/ndb/src/kernel/vm/NdbinfoTables.cpp'
--- a/storage/ndb/src/kernel/vm/NdbinfoTables.cpp 2011-10-07 14:34:14 +0000
+++ b/storage/ndb/src/kernel/vm/NdbinfoTables.cpp 2011-10-11 08:11:15 +0000
@@ -220,6 +220,23 @@ DECLARE_NDBINFO_TABLE(TRANSACTIONS, 10)
}
};
+DECLARE_NDBINFO_TABLE(OPERATIONS, 11) =
+{ { "operations", 11, 0, "operations" },
+ {
+ {"node_id", Ndbinfo::Number, ""},
+ {"block_instance", Ndbinfo::Number, ""},
+ {"objid", Ndbinfo::Number, ""},
+ {"tcref", Ndbinfo::Number, ""},
+ {"apiref", Ndbinfo::Number, ""},
+ {"transid", Ndbinfo::String, ""},
+ {"tableid", Ndbinfo::Number, ""},
+ {"fragmentid", Ndbinfo::Number, ""},
+ {"op", Ndbinfo::Number, ""},
+ {"state", Ndbinfo::Number, ""},
+ {"flags", Ndbinfo::Number, ""}
+ }
+};
+
#define DBINFOTBL(x) { Ndbinfo::x##_TABLEID, (Ndbinfo::Table*)&ndbinfo_##x }
static
@@ -242,7 +259,8 @@ struct ndbinfo_table_list_entry {
DBINFOTBL(DISKPAGEBUFFER),
DBINFOTBL(THREADBLOCKS),
DBINFOTBL(THREADSTAT),
- DBINFOTBL(TRANSACTIONS)
+ DBINFOTBL(TRANSACTIONS),
+ DBINFOTBL(OPERATIONS)
};
static int no_ndbinfo_tables =
No bundle (reason: useless for push emails).
| Thread |
|---|
| • bzr push into mysql-5.1-telco-7.0 branch (jonas.oreland:4586 to 4587) | jonas oreland | 11 Oct |