Skip to content

Commit 5198155

Browse files
committed
Moved outputformat to innodb_version in mysql.py
Allowed for different versions of innodb to get stats
1 parent 710073f commit 5198155

2 files changed

Lines changed: 66 additions & 20 deletions

File tree

mysqld/python_modules/DBUtil.py

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,25 @@ def longish(x):
7474
return longish(x[:-1])
7575
else:
7676
raise ValueError
77+
78+
def hexlongish(x):
79+
if len(x):
80+
try:
81+
return long(str(x), 16)
82+
except ValueError:
83+
return longish(x[:-1])
84+
else:
85+
raise ValueError
7786

78-
def parse_innodb_status(innodb_status_raw):
87+
def parse_innodb_status(innodb_status_raw, innodb_version="1.0"):
7988
def sumof(status):
8089
def new(*idxs):
8190
return sum(map(lambda x: longish(status[x]), idxs))
82-
#new.func_name = 'sumof' #not ok in py2.3
8391
return new
8492

8593
innodb_status = defaultdict(int)
8694
innodb_status['active_transactions']
87-
95+
8896
for line in innodb_status_raw:
8997
istatus = line.split()
9098

@@ -97,15 +105,33 @@ def new(*idxs):
97105
innodb_status['os_waits'] += longish(istatus[8])
98106

99107
elif "RW-shared spins" in line:
100-
innodb_status['spin_waits'] += isum(2,8)
101-
innodb_status['os_waits'] += isum(5,11)
108+
if innodb_version == 1.0:
109+
innodb_status['spin_waits'] += isum(2,8)
110+
innodb_status['os_waits'] += isum(5,11)
111+
elif innodb_version >= 5.5:
112+
innodb_status['spin_waits'] += longish(istatus[2])
113+
innodb_status['os_waits'] += longish(istatus[7])
114+
115+
elif "RW-excl spins" in line and innodb_version >= 5.5:
116+
innodb_status['spin_waits'] += longish(istatus[2])
117+
innodb_status['os_waits'] += longish(istatus[7])
102118

103119
# TRANSACTIONS
104120
elif "Trx id counter" in line:
105-
innodb_status['transactions'] += isum(3,4)
121+
if innodb_version >= 5.6:
122+
innodb_status['transactions'] += longish(istatus[3])
123+
elif innodb_version == 5.5:
124+
innodb_status['transactions'] += hexlongish(istatus[3])
125+
else:
126+
innodb_status['transactions'] += isum(3,4)
106127

107128
elif "Purge done for trx" in line:
108-
innodb_status['transactions_purged'] += isum(6,7)
129+
if innodb_version >= 5.6:
130+
innodb_status['transactions_purged'] += longish(istatus[6])
131+
elif innodb_version == 5.5:
132+
innodb_status['transactions_purged'] += hexlongish(istatus[6])
133+
else:
134+
innodb_status['transactions_purged'] += isum(6,7)
109135

110136
elif "History list length" in line:
111137
innodb_status['history_list'] = longish(istatus[3])
@@ -141,11 +167,22 @@ def new(*idxs):
141167
innodb_status['pending_buffer_pool_flushes'] = longish(istatus[7])
142168

143169
# INSERT BUFFER AND ADAPTIVE HASH INDEX
144-
elif 'merged recs' in line:
170+
elif 'merged recs' in line and innodb_version == 1.0:
145171
innodb_status['ibuf_inserts'] = longish(istatus[0])
146172
innodb_status['ibuf_merged'] = longish(istatus[2])
147173
innodb_status['ibuf_merges'] = longish(istatus[5])
148174

175+
elif 'Ibuf: size' in line and innodb_version >= 5.5:
176+
innodb_status['ibuf_merges'] = longish(istatus[10])
177+
178+
elif 'merged operations' in line and innodb_version >= 5.5:
179+
in_merged = 1
180+
181+
elif 'delete mark' in line and 'in_merged' in vars() and innodb_version >= 5.5:
182+
innodb_status['ibuf_inserts'] = longish(istatus[1])
183+
innodb_status['ibuf_merged'] = 0
184+
del in_merged
185+
149186
# LOG
150187
elif "log i/o's done" in line:
151188
innodb_status['log_writes'] = longish(istatus[0])
@@ -155,10 +192,16 @@ def new(*idxs):
155192
innodb_status['pending_chkp_writes'] = longish(istatus[4])
156193

157194
elif "Log sequence number" in line:
158-
innodb_status['log_bytes_written'] = isum(3,4)
195+
if innodb_version >= 5.5:
196+
innodb_status['log_bytes_written'] = longish(istatus[3])
197+
else:
198+
innodb_status['log_bytes_written'] = isum(3,4)
159199

160200
elif "Log flushed up to" in line:
161-
innodb_status['log_bytes_flushed'] = isum(4,5)
201+
if innodb_version >= 5.5:
202+
innodb_status['log_bytes_flushed'] = longish(istatus[4])
203+
else:
204+
innodb_status['log_bytes_flushed'] = isum(4,5)
162205

163206
# BUFFER POOL AND MEMORY
164207
elif "Buffer pool size" in line:
@@ -173,10 +216,10 @@ def new(*idxs):
173216
elif "Modified db pages" in line:
174217
innodb_status['buffer_pool_pages_dirty'] = longish(istatus[3])
175218

176-
elif "Pages read" in line:
177-
innodb_status['pages_read'] = longish(istatus[2])
178-
innodb_status['pages_created'] = longish(istatus[4])
179-
innodb_status['pages_written'] = longish(istatus[6])
219+
elif "Pages read" in line and "ahead" not in line:
220+
innodb_status['pages_read'] = longish(istatus[2])
221+
innodb_status['pages_created'] = longish(istatus[4])
222+
innodb_status['pages_written'] = longish(istatus[6])
180223

181224
# ROW OPERATIONS
182225
elif 'Number of rows inserted' in line:

mysqld/python_modules/mysql.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,15 @@ def update_stats(get_innodb=True, get_master=True, get_slave=True):
117117
cursor.close()
118118

119119
cursor = conn.cursor(MySQLdb.cursors.Cursor)
120-
cursor.execute("SHOW ENGINES")
120+
cursor.execute("SELECT PLUGIN_STATUS, PLUGIN_VERSION FROM `information_schema`.Plugins WHERE PLUGIN_NAME LIKE '%innodb%' AND PLUGIN_TYPE LIKE 'STORAGE ENGINE';")
121+
121122
have_innodb = False
122-
for row in cursor:
123-
if row[0] == 'InnoDB':
124-
if row[1] == 'DEFAULT' or row[1] == "YES":
125-
have_innodb = True
123+
innodb_version = 1.0
124+
row = cursor.fetchone()
125+
126+
if row[0] == "ACTIVE":
127+
have_innodb = True
128+
innodb_version = row[1]
126129
cursor.close()
127130

128131
# try not to fail ?
@@ -133,7 +136,7 @@ def update_stats(get_innodb=True, get_master=True, get_slave=True):
133136
if get_innodb:
134137
cursor = conn.cursor(MySQLdb.cursors.Cursor)
135138
cursor.execute("SHOW /*!50000 ENGINE*/ INNODB STATUS")
136-
innodb_status = parse_innodb_status(cursor.fetchone()[0].split('\n'))
139+
innodb_status = parse_innodb_status(cursor.fetchone()[2].split('\n'), innodb_version)
137140
cursor.close()
138141
logging.debug('innodb_status: ' + str(innodb_status))
139142

0 commit comments

Comments
 (0)