@@ -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 :
0 commit comments