| 1 | /*********************************************************************** |
| 2 | |
| 3 | Copyright (c) 2010, 2015, Oracle and/or its affiliates. All Rights Reserved. |
| 4 | Copyright (c) 2012, Facebook Inc. |
| 5 | Copyright (c) 2013, 2018, MariaDB Corporation. |
| 6 | |
| 7 | This program is free software; you can redistribute it and/or modify it |
| 8 | under the terms of the GNU General Public License as published by the |
| 9 | Free Software Foundation; version 2 of the License. |
| 10 | |
| 11 | This program is distributed in the hope that it will be useful, but |
| 12 | WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
| 14 | Public License for more details. |
| 15 | |
| 16 | You should have received a copy of the GNU General Public License along with |
| 17 | this program; if not, write to the Free Software Foundation, Inc., |
| 18 | 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA |
| 19 | |
| 20 | ***********************************************************************/ |
| 21 | |
| 22 | /**************************************************//** |
| 23 | @file include/srv0mon.h |
| 24 | Server monitor counter related defines |
| 25 | |
| 26 | Created 12/15/2009 Jimmy Yang |
| 27 | *******************************************************/ |
| 28 | |
| 29 | #ifndef srv0mon_h |
| 30 | #define srv0mon_h |
| 31 | |
| 32 | #include "univ.i" |
| 33 | |
| 34 | #ifndef __STDC_LIMIT_MACROS |
| 35 | /* Required for FreeBSD so that INT64_MAX is defined. */ |
| 36 | #define __STDC_LIMIT_MACROS |
| 37 | #endif /* __STDC_LIMIT_MACROS */ |
| 38 | |
| 39 | #include <stdint.h> |
| 40 | |
| 41 | /** Possible status values for "mon_status" in "struct monitor_value" */ |
| 42 | enum monitor_running_status { |
| 43 | MONITOR_STARTED = 1, /*!< Monitor has been turned on */ |
| 44 | MONITOR_STOPPED = 2 /*!< Monitor has been turned off */ |
| 45 | }; |
| 46 | |
| 47 | typedef enum monitor_running_status monitor_running_t; |
| 48 | |
| 49 | /** Monitor counter value type */ |
| 50 | typedef int64_t mon_type_t; |
| 51 | |
| 52 | /** Two monitor structures are defined in this file. One is |
| 53 | "monitor_value_t" which contains dynamic counter values for each |
| 54 | counter. The other is "monitor_info_t", which contains |
| 55 | static information (counter name, desc etc.) for each counter. |
| 56 | In addition, an enum datatype "monitor_id_t" is also defined, |
| 57 | it identifies each monitor with an internally used symbol, whose |
| 58 | integer value indexes into above two structure for its dynamic |
| 59 | and static information. |
| 60 | Developer who intend to add new counters would require to |
| 61 | fill in counter information as described in "monitor_info_t" and |
| 62 | create the internal counter ID in "monitor_id_t". */ |
| 63 | |
| 64 | /** Structure containing the actual values of a monitor counter. */ |
| 65 | struct monitor_value_t { |
| 66 | ib_time_t mon_start_time; /*!< Start time of monitoring */ |
| 67 | ib_time_t mon_stop_time; /*!< Stop time of monitoring */ |
| 68 | ib_time_t mon_reset_time; /*!< Time counter resetted */ |
| 69 | mon_type_t mon_value; /*!< Current counter Value */ |
| 70 | mon_type_t mon_max_value; /*!< Current Max value */ |
| 71 | mon_type_t mon_min_value; /*!< Current Min value */ |
| 72 | mon_type_t mon_value_reset;/*!< value at last reset */ |
| 73 | mon_type_t mon_max_value_start; /*!< Max value since start */ |
| 74 | mon_type_t mon_min_value_start; /*!< Min value since start */ |
| 75 | mon_type_t mon_start_value;/*!< Value at the start time */ |
| 76 | mon_type_t mon_last_value; /*!< Last set of values */ |
| 77 | monitor_running_t mon_status; /* whether monitor still running */ |
| 78 | }; |
| 79 | |
| 80 | /** Follwoing defines are possible values for "monitor_type" field in |
| 81 | "struct monitor_info" */ |
| 82 | enum monitor_type_t { |
| 83 | MONITOR_NONE = 0, /*!< No monitoring */ |
| 84 | MONITOR_MODULE = 1, /*!< This is a monitor module type, |
| 85 | not a counter */ |
| 86 | MONITOR_EXISTING = 2, /*!< The monitor carries information from |
| 87 | an existing system status variable */ |
| 88 | MONITOR_NO_AVERAGE = 4, /*!< Set this status if we don't want to |
| 89 | calculate the average value for the counter */ |
| 90 | MONITOR_DISPLAY_CURRENT = 8, /*!< Display current value of the |
| 91 | counter, rather than incremental value |
| 92 | over the period. Mostly for counters |
| 93 | displaying current resource usage */ |
| 94 | MONITOR_GROUP_MODULE = 16, /*!< Monitor can be turned on/off |
| 95 | only as a module, but not individually */ |
| 96 | MONITOR_DEFAULT_ON = 32,/*!< Monitor will be turned on by default at |
| 97 | server start up */ |
| 98 | MONITOR_SET_OWNER = 64, /*!< Owner of "monitor set", a set of |
| 99 | monitor counters */ |
| 100 | MONITOR_SET_MEMBER = 128,/*!< Being part of a "monitor set" */ |
| 101 | MONITOR_HIDDEN = 256 /*!< Do not display this monitor in the |
| 102 | metrics table */ |
| 103 | }; |
| 104 | |
| 105 | /** Counter minimum value is initialized to be max value of |
| 106 | mon_type_t (int64_t) */ |
| 107 | #ifndef INT64_MAX |
| 108 | #define INT64_MAX (9223372036854775807LL) |
| 109 | #endif |
| 110 | #ifndef INT64_MIN |
| 111 | #define INT64_MIN (-9223372036854775807LL-1) |
| 112 | #endif |
| 113 | #define MIN_RESERVED INT64_MAX |
| 114 | #define MAX_RESERVED INT64_MIN |
| 115 | |
| 116 | /** This enumeration defines internal monitor identifier used internally |
| 117 | to identify each particular counter. Its value indexes into two arrays, |
| 118 | one is the "innodb_counter_value" array which records actual monitor |
| 119 | counter values, the other is "innodb_counter_info" array which describes |
| 120 | each counter's basic information (name, desc etc.). A couple of |
| 121 | naming rules here: |
| 122 | 1) If the monitor defines a module, it starts with MONITOR_MODULE |
| 123 | 2) If the monitor uses exisitng counters from "status variable", its ID |
| 124 | name shall start with MONITOR_OVLD |
| 125 | |
| 126 | Please refer to "innodb_counter_info" in srv/srv0mon.cc for detail |
| 127 | information for each monitor counter */ |
| 128 | |
| 129 | enum monitor_id_t { |
| 130 | /* This is to identify the default value set by the metrics |
| 131 | control global variables */ |
| 132 | MONITOR_DEFAULT_START = 0, |
| 133 | |
| 134 | /* Start of Metadata counter */ |
| 135 | MONITOR_MODULE_METADATA, |
| 136 | MONITOR_TABLE_OPEN, |
| 137 | MONITOR_TABLE_CLOSE, |
| 138 | MONITOR_TABLE_REFERENCE, |
| 139 | |
| 140 | /* Lock manager related counters */ |
| 141 | MONITOR_MODULE_LOCK, |
| 142 | MONITOR_DEADLOCK, |
| 143 | MONITOR_TIMEOUT, |
| 144 | MONITOR_LOCKREC_WAIT, |
| 145 | MONITOR_TABLELOCK_WAIT, |
| 146 | MONITOR_NUM_RECLOCK_REQ, |
| 147 | MONITOR_RECLOCK_CREATED, |
| 148 | MONITOR_RECLOCK_REMOVED, |
| 149 | MONITOR_NUM_RECLOCK, |
| 150 | MONITOR_TABLELOCK_CREATED, |
| 151 | MONITOR_TABLELOCK_REMOVED, |
| 152 | MONITOR_NUM_TABLELOCK, |
| 153 | MONITOR_OVLD_ROW_LOCK_CURRENT_WAIT, |
| 154 | MONITOR_OVLD_LOCK_WAIT_TIME, |
| 155 | MONITOR_OVLD_LOCK_MAX_WAIT_TIME, |
| 156 | MONITOR_OVLD_ROW_LOCK_WAIT, |
| 157 | MONITOR_OVLD_LOCK_AVG_WAIT_TIME, |
| 158 | |
| 159 | /* Buffer and I/O realted counters. */ |
| 160 | MONITOR_MODULE_BUFFER, |
| 161 | MONITOR_OVLD_BUFFER_POOL_SIZE, |
| 162 | MONITOR_OVLD_BUF_POOL_READS, |
| 163 | MONITOR_OVLD_BUF_POOL_READ_REQUESTS, |
| 164 | MONITOR_OVLD_BUF_POOL_WRITE_REQUEST, |
| 165 | MONITOR_OVLD_BUF_POOL_WAIT_FREE, |
| 166 | MONITOR_OVLD_BUF_POOL_READ_AHEAD, |
| 167 | MONITOR_OVLD_BUF_POOL_READ_AHEAD_EVICTED, |
| 168 | MONITOR_OVLD_BUF_POOL_PAGE_TOTAL, |
| 169 | MONITOR_OVLD_BUF_POOL_PAGE_MISC, |
| 170 | MONITOR_OVLD_BUF_POOL_PAGES_DATA, |
| 171 | MONITOR_OVLD_BUF_POOL_BYTES_DATA, |
| 172 | MONITOR_OVLD_BUF_POOL_PAGES_DIRTY, |
| 173 | MONITOR_OVLD_BUF_POOL_BYTES_DIRTY, |
| 174 | MONITOR_OVLD_BUF_POOL_PAGES_FREE, |
| 175 | MONITOR_OVLD_PAGE_CREATED, |
| 176 | MONITOR_OVLD_PAGES_WRITTEN, |
| 177 | MONITOR_OVLD_INDEX_PAGES_WRITTEN, |
| 178 | MONITOR_OVLD_NON_INDEX_PAGES_WRITTEN, |
| 179 | MONITOR_OVLD_PAGES_READ, |
| 180 | MONITOR_OVLD_PAGES0_READ, |
| 181 | MONITOR_OVLD_INDEX_SEC_REC_CLUSTER_READS, |
| 182 | MONITOR_OVLD_INDEX_SEC_REC_CLUSTER_READS_AVOIDED, |
| 183 | MONITOR_OVLD_BYTE_READ, |
| 184 | MONITOR_OVLD_BYTE_WRITTEN, |
| 185 | MONITOR_FLUSH_BATCH_SCANNED, |
| 186 | MONITOR_FLUSH_BATCH_SCANNED_NUM_CALL, |
| 187 | MONITOR_FLUSH_BATCH_SCANNED_PER_CALL, |
| 188 | MONITOR_FLUSH_BATCH_TOTAL_PAGE, |
| 189 | MONITOR_FLUSH_BATCH_COUNT, |
| 190 | MONITOR_FLUSH_BATCH_PAGES, |
| 191 | MONITOR_FLUSH_NEIGHBOR_TOTAL_PAGE, |
| 192 | MONITOR_FLUSH_NEIGHBOR_COUNT, |
| 193 | MONITOR_FLUSH_NEIGHBOR_PAGES, |
| 194 | MONITOR_FLUSH_N_TO_FLUSH_REQUESTED, |
| 195 | |
| 196 | MONITOR_FLUSH_N_TO_FLUSH_BY_AGE, |
| 197 | MONITOR_FLUSH_ADAPTIVE_AVG_TIME_SLOT, |
| 198 | MONITOR_LRU_BATCH_FLUSH_AVG_TIME_SLOT, |
| 199 | |
| 200 | MONITOR_FLUSH_ADAPTIVE_AVG_TIME_THREAD, |
| 201 | MONITOR_LRU_BATCH_FLUSH_AVG_TIME_THREAD, |
| 202 | MONITOR_FLUSH_ADAPTIVE_AVG_TIME_EST, |
| 203 | MONITOR_LRU_BATCH_FLUSH_AVG_TIME_EST, |
| 204 | MONITOR_FLUSH_AVG_TIME, |
| 205 | |
| 206 | MONITOR_FLUSH_ADAPTIVE_AVG_PASS, |
| 207 | MONITOR_LRU_BATCH_FLUSH_AVG_PASS, |
| 208 | MONITOR_FLUSH_AVG_PASS, |
| 209 | |
| 210 | MONITOR_LRU_GET_FREE_LOOPS, |
| 211 | MONITOR_LRU_GET_FREE_WAITS, |
| 212 | |
| 213 | MONITOR_FLUSH_AVG_PAGE_RATE, |
| 214 | MONITOR_FLUSH_LSN_AVG_RATE, |
| 215 | MONITOR_FLUSH_PCT_FOR_DIRTY, |
| 216 | MONITOR_FLUSH_PCT_FOR_LSN, |
| 217 | MONITOR_FLUSH_SYNC_WAITS, |
| 218 | MONITOR_FLUSH_ADAPTIVE_TOTAL_PAGE, |
| 219 | MONITOR_FLUSH_ADAPTIVE_COUNT, |
| 220 | MONITOR_FLUSH_ADAPTIVE_PAGES, |
| 221 | MONITOR_FLUSH_SYNC_TOTAL_PAGE, |
| 222 | MONITOR_FLUSH_SYNC_COUNT, |
| 223 | MONITOR_FLUSH_SYNC_PAGES, |
| 224 | MONITOR_FLUSH_BACKGROUND_TOTAL_PAGE, |
| 225 | MONITOR_FLUSH_BACKGROUND_COUNT, |
| 226 | MONITOR_FLUSH_BACKGROUND_PAGES, |
| 227 | MONITOR_LRU_BATCH_SCANNED, |
| 228 | MONITOR_LRU_BATCH_SCANNED_NUM_CALL, |
| 229 | MONITOR_LRU_BATCH_SCANNED_PER_CALL, |
| 230 | MONITOR_LRU_BATCH_FLUSH_TOTAL_PAGE, |
| 231 | MONITOR_LRU_BATCH_FLUSH_COUNT, |
| 232 | MONITOR_LRU_BATCH_FLUSH_PAGES, |
| 233 | MONITOR_LRU_BATCH_EVICT_TOTAL_PAGE, |
| 234 | MONITOR_LRU_BATCH_EVICT_COUNT, |
| 235 | MONITOR_LRU_BATCH_EVICT_PAGES, |
| 236 | MONITOR_LRU_SINGLE_FLUSH_SCANNED, |
| 237 | MONITOR_LRU_SINGLE_FLUSH_SCANNED_NUM_CALL, |
| 238 | MONITOR_LRU_SINGLE_FLUSH_SCANNED_PER_CALL, |
| 239 | MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT, |
| 240 | MONITOR_LRU_GET_FREE_SEARCH, |
| 241 | MONITOR_LRU_SEARCH_SCANNED, |
| 242 | MONITOR_LRU_SEARCH_SCANNED_NUM_CALL, |
| 243 | MONITOR_LRU_SEARCH_SCANNED_PER_CALL, |
| 244 | MONITOR_LRU_UNZIP_SEARCH_SCANNED, |
| 245 | MONITOR_LRU_UNZIP_SEARCH_SCANNED_NUM_CALL, |
| 246 | MONITOR_LRU_UNZIP_SEARCH_SCANNED_PER_CALL, |
| 247 | |
| 248 | /* Buffer Page I/O specific counters. */ |
| 249 | MONITOR_MODULE_BUF_PAGE, |
| 250 | MONITOR_INDEX_LEAF_PAGE_READ, |
| 251 | MONITOR_INDEX_NON_LEAF_PAGE_READ, |
| 252 | MONITOR_INDEX_IBUF_LEAF_PAGE_READ, |
| 253 | MONITOR_INDEX_IBUF_NON_LEAF_PAGE_READ, |
| 254 | MONITOR_UNDO_LOG_PAGE_READ, |
| 255 | MONITOR_INODE_PAGE_READ, |
| 256 | MONITOR_IBUF_FREELIST_PAGE_READ, |
| 257 | MONITOR_IBUF_BITMAP_PAGE_READ, |
| 258 | MONITOR_SYSTEM_PAGE_READ, |
| 259 | MONITOR_TRX_SYSTEM_PAGE_READ, |
| 260 | MONITOR_FSP_HDR_PAGE_READ, |
| 261 | MONITOR_XDES_PAGE_READ, |
| 262 | MONITOR_BLOB_PAGE_READ, |
| 263 | MONITOR_ZBLOB_PAGE_READ, |
| 264 | MONITOR_ZBLOB2_PAGE_READ, |
| 265 | MONITOR_OTHER_PAGE_READ, |
| 266 | MONITOR_INDEX_LEAF_PAGE_WRITTEN, |
| 267 | MONITOR_INDEX_NON_LEAF_PAGE_WRITTEN, |
| 268 | MONITOR_INDEX_IBUF_LEAF_PAGE_WRITTEN, |
| 269 | MONITOR_INDEX_IBUF_NON_LEAF_PAGE_WRITTEN, |
| 270 | MONITOR_UNDO_LOG_PAGE_WRITTEN, |
| 271 | MONITOR_INODE_PAGE_WRITTEN, |
| 272 | MONITOR_IBUF_FREELIST_PAGE_WRITTEN, |
| 273 | MONITOR_IBUF_BITMAP_PAGE_WRITTEN, |
| 274 | MONITOR_SYSTEM_PAGE_WRITTEN, |
| 275 | MONITOR_TRX_SYSTEM_PAGE_WRITTEN, |
| 276 | MONITOR_FSP_HDR_PAGE_WRITTEN, |
| 277 | MONITOR_XDES_PAGE_WRITTEN, |
| 278 | MONITOR_BLOB_PAGE_WRITTEN, |
| 279 | MONITOR_ZBLOB_PAGE_WRITTEN, |
| 280 | MONITOR_ZBLOB2_PAGE_WRITTEN, |
| 281 | MONITOR_OTHER_PAGE_WRITTEN, |
| 282 | |
| 283 | /* OS level counters (I/O) */ |
| 284 | MONITOR_MODULE_OS, |
| 285 | MONITOR_OVLD_OS_FILE_READ, |
| 286 | MONITOR_OVLD_OS_FILE_WRITE, |
| 287 | MONITOR_OVLD_OS_FSYNC, |
| 288 | MONITOR_OS_PENDING_READS, |
| 289 | MONITOR_OS_PENDING_WRITES, |
| 290 | MONITOR_OVLD_OS_LOG_WRITTEN, |
| 291 | MONITOR_OVLD_OS_LOG_FSYNC, |
| 292 | MONITOR_OVLD_OS_LOG_PENDING_FSYNC, |
| 293 | MONITOR_OVLD_OS_LOG_PENDING_WRITES, |
| 294 | |
| 295 | /* Transaction related counters */ |
| 296 | MONITOR_MODULE_TRX, |
| 297 | MONITOR_TRX_RW_COMMIT, |
| 298 | MONITOR_TRX_RO_COMMIT, |
| 299 | MONITOR_TRX_NL_RO_COMMIT, |
| 300 | MONITOR_TRX_COMMIT_UNDO, |
| 301 | MONITOR_TRX_ROLLBACK, |
| 302 | MONITOR_TRX_ROLLBACK_SAVEPOINT, |
| 303 | MONITOR_TRX_ROLLBACK_ACTIVE, |
| 304 | MONITOR_TRX_ACTIVE, |
| 305 | MONITOR_RSEG_HISTORY_LEN, |
| 306 | MONITOR_NUM_UNDO_SLOT_USED, |
| 307 | MONITOR_NUM_UNDO_SLOT_CACHED, |
| 308 | MONITOR_RSEG_CUR_SIZE, |
| 309 | |
| 310 | /* Purge related counters */ |
| 311 | MONITOR_MODULE_PURGE, |
| 312 | MONITOR_N_DEL_ROW_PURGE, |
| 313 | MONITOR_N_UPD_EXIST_EXTERN, |
| 314 | MONITOR_PURGE_INVOKED, |
| 315 | MONITOR_PURGE_N_PAGE_HANDLED, |
| 316 | MONITOR_DML_PURGE_DELAY, |
| 317 | MONITOR_PURGE_STOP_COUNT, |
| 318 | MONITOR_PURGE_RESUME_COUNT, |
| 319 | |
| 320 | /* Recovery related counters */ |
| 321 | MONITOR_MODULE_RECOVERY, |
| 322 | MONITOR_NUM_CHECKPOINT, |
| 323 | MONITOR_OVLD_LSN_FLUSHDISK, |
| 324 | MONITOR_OVLD_LSN_CHECKPOINT, |
| 325 | MONITOR_OVLD_LSN_CURRENT, |
| 326 | MONITOR_LSN_CHECKPOINT_AGE, |
| 327 | MONITOR_OVLD_BUF_OLDEST_LSN, |
| 328 | MONITOR_OVLD_MAX_AGE_ASYNC, |
| 329 | MONITOR_OVLD_MAX_AGE_SYNC, |
| 330 | MONITOR_PENDING_LOG_FLUSH, |
| 331 | MONITOR_PENDING_CHECKPOINT_WRITE, |
| 332 | MONITOR_LOG_IO, |
| 333 | MONITOR_OVLD_LOG_WAITS, |
| 334 | MONITOR_OVLD_LOG_WRITE_REQUEST, |
| 335 | MONITOR_OVLD_LOG_WRITES, |
| 336 | MONITOR_OVLD_LOG_PADDED, |
| 337 | |
| 338 | /* Page Manager related counters */ |
| 339 | MONITOR_MODULE_PAGE, |
| 340 | MONITOR_PAGE_COMPRESS, |
| 341 | MONITOR_PAGE_DECOMPRESS, |
| 342 | MONITOR_PAD_INCREMENTS, |
| 343 | MONITOR_PAD_DECREMENTS, |
| 344 | /* New monitor variables for page compression */ |
| 345 | MONITOR_OVLD_PAGE_COMPRESS_SAVED, |
| 346 | MONITOR_OVLD_PAGES_PAGE_COMPRESSED, |
| 347 | MONITOR_OVLD_PAGE_COMPRESSED_TRIM_OP, |
| 348 | MONITOR_OVLD_PAGES_PAGE_DECOMPRESSED, |
| 349 | MONITOR_OVLD_PAGES_PAGE_COMPRESSION_ERROR, |
| 350 | |
| 351 | /* New monitor variables for page encryption */ |
| 352 | MONITOR_OVLD_PAGES_ENCRYPTED, |
| 353 | MONITOR_OVLD_PAGES_DECRYPTED, |
| 354 | |
| 355 | /* Index related counters */ |
| 356 | MONITOR_MODULE_INDEX, |
| 357 | MONITOR_INDEX_SPLIT, |
| 358 | MONITOR_INDEX_MERGE_ATTEMPTS, |
| 359 | MONITOR_INDEX_MERGE_SUCCESSFUL, |
| 360 | MONITOR_INDEX_REORG_ATTEMPTS, |
| 361 | MONITOR_INDEX_REORG_SUCCESSFUL, |
| 362 | MONITOR_INDEX_DISCARD, |
| 363 | |
| 364 | #ifdef BTR_CUR_HASH_ADAPT |
| 365 | /* Adaptive Hash Index related counters */ |
| 366 | MONITOR_MODULE_ADAPTIVE_HASH, |
| 367 | MONITOR_OVLD_ADAPTIVE_HASH_SEARCH, |
| 368 | #endif /* BTR_CUR_HASH_ADAPT */ |
| 369 | MONITOR_OVLD_ADAPTIVE_HASH_SEARCH_BTREE, |
| 370 | #ifdef BTR_CUR_HASH_ADAPT |
| 371 | MONITOR_ADAPTIVE_HASH_PAGE_ADDED, |
| 372 | MONITOR_ADAPTIVE_HASH_PAGE_REMOVED, |
| 373 | MONITOR_ADAPTIVE_HASH_ROW_ADDED, |
| 374 | MONITOR_ADAPTIVE_HASH_ROW_REMOVED, |
| 375 | MONITOR_ADAPTIVE_HASH_ROW_REMOVE_NOT_FOUND, |
| 376 | MONITOR_ADAPTIVE_HASH_ROW_UPDATED, |
| 377 | #endif /* BTR_CUR_HASH_ADAPT */ |
| 378 | |
| 379 | /* Tablespace related counters */ |
| 380 | MONITOR_MODULE_FIL_SYSTEM, |
| 381 | MONITOR_OVLD_N_FILE_OPENED, |
| 382 | |
| 383 | /* InnoDB Change Buffer related counters */ |
| 384 | MONITOR_MODULE_IBUF_SYSTEM, |
| 385 | MONITOR_OVLD_IBUF_MERGE_INSERT, |
| 386 | MONITOR_OVLD_IBUF_MERGE_DELETE, |
| 387 | MONITOR_OVLD_IBUF_MERGE_PURGE, |
| 388 | MONITOR_OVLD_IBUF_MERGE_DISCARD_INSERT, |
| 389 | MONITOR_OVLD_IBUF_MERGE_DISCARD_DELETE, |
| 390 | MONITOR_OVLD_IBUF_MERGE_DISCARD_PURGE, |
| 391 | MONITOR_OVLD_IBUF_MERGES, |
| 392 | MONITOR_OVLD_IBUF_SIZE, |
| 393 | |
| 394 | /* Counters for server operations */ |
| 395 | MONITOR_MODULE_SERVER, |
| 396 | MONITOR_MASTER_THREAD_SLEEP, |
| 397 | MONITOR_OVLD_SERVER_ACTIVITY, |
| 398 | MONITOR_MASTER_ACTIVE_LOOPS, |
| 399 | MONITOR_MASTER_IDLE_LOOPS, |
| 400 | MONITOR_SRV_BACKGROUND_DROP_TABLE_MICROSECOND, |
| 401 | MONITOR_SRV_IBUF_MERGE_MICROSECOND, |
| 402 | MONITOR_SRV_LOG_FLUSH_MICROSECOND, |
| 403 | MONITOR_SRV_MEM_VALIDATE_MICROSECOND, |
| 404 | MONITOR_SRV_PURGE_MICROSECOND, |
| 405 | MONITOR_SRV_DICT_LRU_MICROSECOND, |
| 406 | MONITOR_SRV_DICT_LRU_EVICT_COUNT_ACTIVE, |
| 407 | MONITOR_SRV_DICT_LRU_EVICT_COUNT_IDLE, |
| 408 | MONITOR_SRV_CHECKPOINT_MICROSECOND, |
| 409 | MONITOR_OVLD_SRV_DBLWR_WRITES, |
| 410 | MONITOR_OVLD_SRV_DBLWR_PAGES_WRITTEN, |
| 411 | MONITOR_OVLD_SRV_PAGE_SIZE, |
| 412 | MONITOR_OVLD_RWLOCK_S_SPIN_WAITS, |
| 413 | MONITOR_OVLD_RWLOCK_X_SPIN_WAITS, |
| 414 | MONITOR_OVLD_RWLOCK_SX_SPIN_WAITS, |
| 415 | MONITOR_OVLD_RWLOCK_S_SPIN_ROUNDS, |
| 416 | MONITOR_OVLD_RWLOCK_X_SPIN_ROUNDS, |
| 417 | MONITOR_OVLD_RWLOCK_SX_SPIN_ROUNDS, |
| 418 | MONITOR_OVLD_RWLOCK_S_OS_WAITS, |
| 419 | MONITOR_OVLD_RWLOCK_X_OS_WAITS, |
| 420 | MONITOR_OVLD_RWLOCK_SX_OS_WAITS, |
| 421 | |
| 422 | /* Data DML related counters */ |
| 423 | MONITOR_MODULE_DML_STATS, |
| 424 | MONITOR_OLVD_ROW_READ, |
| 425 | MONITOR_OLVD_ROW_INSERTED, |
| 426 | MONITOR_OLVD_ROW_DELETED, |
| 427 | MONITOR_OLVD_ROW_UPDTATED, |
| 428 | MONITOR_OLVD_SYSTEM_ROW_READ, |
| 429 | MONITOR_OLVD_SYSTEM_ROW_INSERTED, |
| 430 | MONITOR_OLVD_SYSTEM_ROW_DELETED, |
| 431 | MONITOR_OLVD_SYSTEM_ROW_UPDATED, |
| 432 | |
| 433 | /* Data DDL related counters */ |
| 434 | MONITOR_MODULE_DDL_STATS, |
| 435 | MONITOR_BACKGROUND_DROP_INDEX, |
| 436 | MONITOR_BACKGROUND_DROP_TABLE, |
| 437 | MONITOR_ONLINE_CREATE_INDEX, |
| 438 | MONITOR_PENDING_ALTER_TABLE, |
| 439 | MONITOR_ALTER_TABLE_SORT_FILES, |
| 440 | MONITOR_ALTER_TABLE_LOG_FILES, |
| 441 | |
| 442 | MONITOR_MODULE_ICP, |
| 443 | MONITOR_ICP_ATTEMPTS, |
| 444 | MONITOR_ICP_NO_MATCH, |
| 445 | MONITOR_ICP_OUT_OF_RANGE, |
| 446 | MONITOR_ICP_MATCH, |
| 447 | |
| 448 | /* Mutex/RW-Lock related counters */ |
| 449 | MONITOR_MODULE_LATCHES, |
| 450 | MONITOR_LATCHES, |
| 451 | |
| 452 | /* This is used only for control system to turn |
| 453 | on/off and reset all monitor counters */ |
| 454 | MONITOR_ALL_COUNTER, |
| 455 | |
| 456 | /* This must be the last member */ |
| 457 | NUM_MONITOR |
| 458 | }; |
| 459 | |
| 460 | /** This informs the monitor control system to turn |
| 461 | on/off and reset monitor counters through wild card match */ |
| 462 | #define MONITOR_WILDCARD_MATCH (NUM_MONITOR + 1) |
| 463 | |
| 464 | /** Cannot find monitor counter with a specified name */ |
| 465 | #define MONITOR_NO_MATCH (NUM_MONITOR + 2) |
| 466 | |
| 467 | /** struct monitor_info describes the basic/static information |
| 468 | about each monitor counter. */ |
| 469 | struct monitor_info_t { |
| 470 | const char* monitor_name; /*!< Monitor name */ |
| 471 | const char* monitor_module; /*!< Sub Module the monitor |
| 472 | belongs to */ |
| 473 | const char* monitor_desc; /*!< Brief desc of monitor counter */ |
| 474 | monitor_type_t monitor_type; /*!< Type of Monitor Info */ |
| 475 | monitor_id_t monitor_related_id;/*!< Monitor ID of counter that |
| 476 | related to this monitor. This is |
| 477 | set when the monitor belongs to |
| 478 | a "monitor set" */ |
| 479 | monitor_id_t monitor_id; /*!< Monitor ID as defined in enum |
| 480 | monitor_id_t */ |
| 481 | }; |
| 482 | |
| 483 | /** Following are the "set_option" values allowed for |
| 484 | srv_mon_process_existing_counter() and srv_mon_process_existing_counter() |
| 485 | functions. To turn on/off/reset the monitor counters. */ |
| 486 | enum mon_option_t { |
| 487 | MONITOR_TURN_ON = 1, /*!< Turn on the counter */ |
| 488 | MONITOR_TURN_OFF, /*!< Turn off the counter */ |
| 489 | MONITOR_RESET_VALUE, /*!< Reset current values */ |
| 490 | MONITOR_RESET_ALL_VALUE, /*!< Reset all values */ |
| 491 | MONITOR_GET_VALUE /*!< Option for |
| 492 | srv_mon_process_existing_counter() |
| 493 | function */ |
| 494 | }; |
| 495 | |
| 496 | /** Number of bit in a ulint datatype */ |
| 497 | #define NUM_BITS_ULINT (sizeof(ulint) * CHAR_BIT) |
| 498 | |
| 499 | /** This "monitor_set_tbl" is a bitmap records whether a particular monitor |
| 500 | counter has been turned on or off */ |
| 501 | extern ulint monitor_set_tbl[(NUM_MONITOR + NUM_BITS_ULINT - 1) / |
| 502 | NUM_BITS_ULINT]; |
| 503 | |
| 504 | /** Macros to turn on/off the control bit in monitor_set_tbl for a monitor |
| 505 | counter option. */ |
| 506 | #define MONITOR_ON(monitor) \ |
| 507 | (monitor_set_tbl[unsigned(monitor) / NUM_BITS_ULINT] |= \ |
| 508 | (ulint(1) << (unsigned(monitor) % NUM_BITS_ULINT))) |
| 509 | |
| 510 | #define MONITOR_OFF(monitor) \ |
| 511 | (monitor_set_tbl[unsigned(monitor) / NUM_BITS_ULINT] &= \ |
| 512 | ~(ulint(1) << (unsigned(monitor) % NUM_BITS_ULINT))) |
| 513 | |
| 514 | /** Check whether the requested monitor is turned on/off */ |
| 515 | #define MONITOR_IS_ON(monitor) \ |
| 516 | (monitor_set_tbl[unsigned(monitor) / NUM_BITS_ULINT] & \ |
| 517 | (ulint(1) << (unsigned(monitor) % NUM_BITS_ULINT))) |
| 518 | |
| 519 | /** The actual monitor counter array that records each monintor counter |
| 520 | value */ |
| 521 | extern monitor_value_t innodb_counter_value[NUM_MONITOR]; |
| 522 | |
| 523 | /** Following are macro defines for basic montior counter manipulations. |
| 524 | Please note we do not provide any synchronization for these monitor |
| 525 | operations due to performance consideration. Most counters can |
| 526 | be placed under existing mutex protections in respective code |
| 527 | module. */ |
| 528 | |
| 529 | /** Macros to access various fields of a monitor counters */ |
| 530 | #define MONITOR_FIELD(monitor, field) \ |
| 531 | (innodb_counter_value[monitor].field) |
| 532 | |
| 533 | #define MONITOR_VALUE(monitor) \ |
| 534 | MONITOR_FIELD(monitor, mon_value) |
| 535 | |
| 536 | #define MONITOR_MAX_VALUE(monitor) \ |
| 537 | MONITOR_FIELD(monitor, mon_max_value) |
| 538 | |
| 539 | #define MONITOR_MIN_VALUE(monitor) \ |
| 540 | MONITOR_FIELD(monitor, mon_min_value) |
| 541 | |
| 542 | #define MONITOR_VALUE_RESET(monitor) \ |
| 543 | MONITOR_FIELD(monitor, mon_value_reset) |
| 544 | |
| 545 | #define MONITOR_MAX_VALUE_START(monitor) \ |
| 546 | MONITOR_FIELD(monitor, mon_max_value_start) |
| 547 | |
| 548 | #define MONITOR_MIN_VALUE_START(monitor) \ |
| 549 | MONITOR_FIELD(monitor, mon_min_value_start) |
| 550 | |
| 551 | #define MONITOR_LAST_VALUE(monitor) \ |
| 552 | MONITOR_FIELD(monitor, mon_last_value) |
| 553 | |
| 554 | #define MONITOR_START_VALUE(monitor) \ |
| 555 | MONITOR_FIELD(monitor, mon_start_value) |
| 556 | |
| 557 | #define MONITOR_VALUE_SINCE_START(monitor) \ |
| 558 | (MONITOR_VALUE(monitor) + MONITOR_VALUE_RESET(monitor)) |
| 559 | |
| 560 | #define MONITOR_STATUS(monitor) \ |
| 561 | MONITOR_FIELD(monitor, mon_status) |
| 562 | |
| 563 | #define MONITOR_SET_START(monitor) \ |
| 564 | do { \ |
| 565 | MONITOR_STATUS(monitor) = MONITOR_STARTED; \ |
| 566 | MONITOR_FIELD((monitor), mon_start_time) = time(NULL); \ |
| 567 | } while (0) |
| 568 | |
| 569 | #define MONITOR_SET_OFF(monitor) \ |
| 570 | do { \ |
| 571 | MONITOR_STATUS(monitor) = MONITOR_STOPPED; \ |
| 572 | MONITOR_FIELD((monitor), mon_stop_time) = time(NULL); \ |
| 573 | } while (0) |
| 574 | |
| 575 | #define MONITOR_INIT_ZERO_VALUE 0 |
| 576 | |
| 577 | /** Max and min values are initialized when we first turn on the monitor |
| 578 | counter, and set the MONITOR_STATUS. */ |
| 579 | #define MONITOR_MAX_MIN_NOT_INIT(monitor) \ |
| 580 | (MONITOR_STATUS(monitor) == MONITOR_INIT_ZERO_VALUE \ |
| 581 | && MONITOR_MIN_VALUE(monitor) == MONITOR_INIT_ZERO_VALUE \ |
| 582 | && MONITOR_MAX_VALUE(monitor) == MONITOR_INIT_ZERO_VALUE) |
| 583 | |
| 584 | #define MONITOR_INIT(monitor) \ |
| 585 | if (MONITOR_MAX_MIN_NOT_INIT(monitor)) { \ |
| 586 | MONITOR_MIN_VALUE(monitor) = MIN_RESERVED; \ |
| 587 | MONITOR_MIN_VALUE_START(monitor) = MIN_RESERVED; \ |
| 588 | MONITOR_MAX_VALUE(monitor) = MAX_RESERVED; \ |
| 589 | MONITOR_MAX_VALUE_START(monitor) = MAX_RESERVED; \ |
| 590 | } |
| 591 | |
| 592 | /** Macros to increment/decrement the counters. The normal |
| 593 | monitor counter operation expects appropriate synchronization |
| 594 | already exists. No additional mutex is necessary when operating |
| 595 | on the counters */ |
| 596 | #define MONITOR_INC(monitor) \ |
| 597 | if (MONITOR_IS_ON(monitor)) { \ |
| 598 | MONITOR_VALUE(monitor)++; \ |
| 599 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 600 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 601 | } \ |
| 602 | } |
| 603 | |
| 604 | /** Atomically increment a monitor counter. |
| 605 | Use MONITOR_INC if appropriate mutex protection exists. |
| 606 | @param monitor monitor to be incremented by 1 |
| 607 | @param enabled whether the monitor is enabled */ |
| 608 | #define MONITOR_ATOMIC_INC_LOW(monitor, enabled) \ |
| 609 | if (enabled) { \ |
| 610 | ib_uint64_t value; \ |
| 611 | value = my_atomic_add64_explicit( \ |
| 612 | (int64*) &MONITOR_VALUE(monitor), 1, \ |
| 613 | MY_MEMORY_ORDER_RELAXED) + 1; \ |
| 614 | /* Note: This is not 100% accurate because of the \ |
| 615 | inherent race, we ignore it due to performance. */ \ |
| 616 | if (value > (ib_uint64_t) MONITOR_MAX_VALUE(monitor)) { \ |
| 617 | MONITOR_MAX_VALUE(monitor) = value; \ |
| 618 | } \ |
| 619 | } |
| 620 | |
| 621 | /** Atomically decrement a monitor counter. |
| 622 | Use MONITOR_DEC if appropriate mutex protection exists. |
| 623 | @param monitor monitor to be decremented by 1 |
| 624 | @param enabled whether the monitor is enabled */ |
| 625 | #define MONITOR_ATOMIC_DEC_LOW(monitor, enabled) \ |
| 626 | if (enabled) { \ |
| 627 | ib_uint64_t value; \ |
| 628 | value = my_atomic_add64_explicit( \ |
| 629 | (int64*) &MONITOR_VALUE(monitor), -1, \ |
| 630 | MY_MEMORY_ORDER_RELAXED) - 1; \ |
| 631 | /* Note: This is not 100% accurate because of the \ |
| 632 | inherent race, we ignore it due to performance. */ \ |
| 633 | if (value < (ib_uint64_t) MONITOR_MIN_VALUE(monitor)) { \ |
| 634 | MONITOR_MIN_VALUE(monitor) = value; \ |
| 635 | } \ |
| 636 | } |
| 637 | |
| 638 | /** Atomically increment a monitor counter if it is enabled. |
| 639 | Use MONITOR_INC if appropriate mutex protection exists. |
| 640 | @param monitor monitor to be incremented by 1 */ |
| 641 | #define MONITOR_ATOMIC_INC(monitor) \ |
| 642 | MONITOR_ATOMIC_INC_LOW(monitor, MONITOR_IS_ON(monitor)) |
| 643 | /** Atomically decrement a monitor counter if it is enabled. |
| 644 | Use MONITOR_DEC if appropriate mutex protection exists. |
| 645 | @param monitor monitor to be decremented by 1 */ |
| 646 | #define MONITOR_ATOMIC_DEC(monitor) \ |
| 647 | MONITOR_ATOMIC_DEC_LOW(monitor, MONITOR_IS_ON(monitor)) |
| 648 | |
| 649 | #define MONITOR_DEC(monitor) \ |
| 650 | if (MONITOR_IS_ON(monitor)) { \ |
| 651 | MONITOR_VALUE(monitor)--; \ |
| 652 | if (MONITOR_VALUE(monitor) < MONITOR_MIN_VALUE(monitor)) { \ |
| 653 | MONITOR_MIN_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 654 | } \ |
| 655 | } |
| 656 | |
| 657 | #ifdef UNIV_DEBUG_VALGRIND |
| 658 | # define MONITOR_CHECK_DEFINED(value) do { \ |
| 659 | mon_type_t m = value; \ |
| 660 | UNIV_MEM_ASSERT_RW(&m, sizeof m); \ |
| 661 | } while (0) |
| 662 | #else /* UNIV_DEBUG_VALGRIND */ |
| 663 | # define MONITOR_CHECK_DEFINED(value) (void) 0 |
| 664 | #endif /* UNIV_DEBUG_VALGRIND */ |
| 665 | |
| 666 | #define MONITOR_INC_VALUE(monitor, value) \ |
| 667 | MONITOR_CHECK_DEFINED(value); \ |
| 668 | if (MONITOR_IS_ON(monitor)) { \ |
| 669 | MONITOR_VALUE(monitor) += (mon_type_t) (value); \ |
| 670 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 671 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 672 | } \ |
| 673 | } |
| 674 | |
| 675 | #define MONITOR_DEC_VALUE(monitor, value) \ |
| 676 | MONITOR_CHECK_DEFINED(value); \ |
| 677 | if (MONITOR_IS_ON(monitor)) { \ |
| 678 | ut_ad(MONITOR_VALUE(monitor) >= (mon_type_t) (value); \ |
| 679 | MONITOR_VALUE(monitor) -= (mon_type_t) (value); \ |
| 680 | if (MONITOR_VALUE(monitor) < MONITOR_MIN_VALUE(monitor)) { \ |
| 681 | MONITOR_MIN_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 682 | } \ |
| 683 | } |
| 684 | |
| 685 | /* Increment/decrement counter without check the monitor on/off bit, which |
| 686 | could already be checked as a module group */ |
| 687 | #define MONITOR_INC_NOCHECK(monitor) \ |
| 688 | do { \ |
| 689 | MONITOR_VALUE(monitor)++; \ |
| 690 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 691 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 692 | } \ |
| 693 | } while (0) \ |
| 694 | |
| 695 | #define MONITOR_DEC_NOCHECK(monitor) \ |
| 696 | do { \ |
| 697 | MONITOR_VALUE(monitor)--; \ |
| 698 | if (MONITOR_VALUE(monitor) < MONITOR_MIN_VALUE(monitor)) { \ |
| 699 | MONITOR_MIN_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 700 | } \ |
| 701 | } while (0) |
| 702 | |
| 703 | /** Directly set a monitor counter's value */ |
| 704 | #define MONITOR_SET(monitor, value) \ |
| 705 | MONITOR_CHECK_DEFINED(value); \ |
| 706 | if (MONITOR_IS_ON(monitor)) { \ |
| 707 | MONITOR_VALUE(monitor) = (mon_type_t) (value); \ |
| 708 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 709 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 710 | } \ |
| 711 | if (MONITOR_VALUE(monitor) < MONITOR_MIN_VALUE(monitor)) { \ |
| 712 | MONITOR_MIN_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 713 | } \ |
| 714 | } |
| 715 | |
| 716 | /** Add time difference between now and input "value" (in seconds) to the |
| 717 | monitor counter |
| 718 | @param monitor monitor to update for the time difference |
| 719 | @param value the start time value */ |
| 720 | #define MONITOR_INC_TIME_IN_MICRO_SECS(monitor, value) \ |
| 721 | MONITOR_CHECK_DEFINED(value); \ |
| 722 | if (MONITOR_IS_ON(monitor)) { \ |
| 723 | uintmax_t old_time = (value); \ |
| 724 | value = ut_time_us(NULL); \ |
| 725 | MONITOR_VALUE(monitor) += (mon_type_t) (value - old_time);\ |
| 726 | } |
| 727 | |
| 728 | /** This macro updates 3 counters in one call. However, it only checks the |
| 729 | main/first monitor counter 'monitor', to see it is on or off to decide |
| 730 | whether to do the update. |
| 731 | @param monitor the main monitor counter to update. It accounts for |
| 732 | the accumulative value for the counter. |
| 733 | @param monitor_n_calls counter that counts number of times this macro is |
| 734 | called |
| 735 | @param monitor_per_call counter that records the current and max value of |
| 736 | each incremental value |
| 737 | @param value incremental value to record this time */ |
| 738 | #define MONITOR_INC_VALUE_CUMULATIVE( \ |
| 739 | monitor, monitor_n_calls, monitor_per_call, value) \ |
| 740 | MONITOR_CHECK_DEFINED(value); \ |
| 741 | if (MONITOR_IS_ON(monitor)) { \ |
| 742 | MONITOR_VALUE(monitor_n_calls)++; \ |
| 743 | MONITOR_VALUE(monitor_per_call) = (mon_type_t) (value); \ |
| 744 | if (MONITOR_VALUE(monitor_per_call) \ |
| 745 | > MONITOR_MAX_VALUE(monitor_per_call)) { \ |
| 746 | MONITOR_MAX_VALUE(monitor_per_call) = \ |
| 747 | (mon_type_t) (value); \ |
| 748 | } \ |
| 749 | MONITOR_VALUE(monitor) += (mon_type_t) (value); \ |
| 750 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 751 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 752 | } \ |
| 753 | } |
| 754 | |
| 755 | /** Directly set a monitor counter's value, and if the value |
| 756 | is monotonically increasing, only max value needs to be updated */ |
| 757 | #define MONITOR_SET_UPD_MAX_ONLY(monitor, value) \ |
| 758 | MONITOR_CHECK_DEFINED(value); \ |
| 759 | if (MONITOR_IS_ON(monitor)) { \ |
| 760 | MONITOR_VALUE(monitor) = (mon_type_t) (value); \ |
| 761 | if (MONITOR_VALUE(monitor) > MONITOR_MAX_VALUE(monitor)) { \ |
| 762 | MONITOR_MAX_VALUE(monitor) = MONITOR_VALUE(monitor);\ |
| 763 | } \ |
| 764 | } |
| 765 | |
| 766 | /** Some values such as log sequence number are montomically increasing |
| 767 | number, do not need to record max/min values */ |
| 768 | #define MONITOR_SET_SIMPLE(monitor, value) \ |
| 769 | MONITOR_CHECK_DEFINED(value); \ |
| 770 | if (MONITOR_IS_ON(monitor)) { \ |
| 771 | MONITOR_VALUE(monitor) = (mon_type_t) (value); \ |
| 772 | } |
| 773 | |
| 774 | /** Reset the monitor value and max/min value to zero. The reset |
| 775 | operation would only be conducted when the counter is turned off */ |
| 776 | #define MONITOR_RESET_ALL(monitor) \ |
| 777 | do { \ |
| 778 | MONITOR_VALUE(monitor) = MONITOR_INIT_ZERO_VALUE; \ |
| 779 | MONITOR_MAX_VALUE(monitor) = MAX_RESERVED; \ |
| 780 | MONITOR_MIN_VALUE(monitor) = MIN_RESERVED; \ |
| 781 | MONITOR_VALUE_RESET(monitor) = MONITOR_INIT_ZERO_VALUE; \ |
| 782 | MONITOR_MAX_VALUE_START(monitor) = MAX_RESERVED; \ |
| 783 | MONITOR_MIN_VALUE_START(monitor) = MIN_RESERVED; \ |
| 784 | MONITOR_LAST_VALUE(monitor) = MONITOR_INIT_ZERO_VALUE; \ |
| 785 | MONITOR_FIELD(monitor, mon_start_time) = \ |
| 786 | MONITOR_INIT_ZERO_VALUE; \ |
| 787 | MONITOR_FIELD(monitor, mon_stop_time) = \ |
| 788 | MONITOR_INIT_ZERO_VALUE; \ |
| 789 | MONITOR_FIELD(monitor, mon_reset_time) = \ |
| 790 | MONITOR_INIT_ZERO_VALUE; \ |
| 791 | } while (0) |
| 792 | |
| 793 | /** Following four macros defines necessary operations to fetch and |
| 794 | consolidate information from existing system status variables. */ |
| 795 | |
| 796 | /** Save the passed-in value to mon_start_value field of monitor |
| 797 | counters */ |
| 798 | #define MONITOR_SAVE_START(monitor, value) do { \ |
| 799 | MONITOR_CHECK_DEFINED(value); \ |
| 800 | (MONITOR_START_VALUE(monitor) = \ |
| 801 | (mon_type_t) (value) - MONITOR_VALUE_RESET(monitor)); \ |
| 802 | } while (0) |
| 803 | |
| 804 | /** Save the passed-in value to mon_last_value field of monitor |
| 805 | counters */ |
| 806 | #define MONITOR_SAVE_LAST(monitor) \ |
| 807 | do { \ |
| 808 | MONITOR_LAST_VALUE(monitor) = MONITOR_VALUE(monitor); \ |
| 809 | MONITOR_START_VALUE(monitor) += MONITOR_VALUE(monitor); \ |
| 810 | } while (0) |
| 811 | |
| 812 | /** Set monitor value to the difference of value and mon_start_value |
| 813 | compensated by mon_last_value if accumulated value is required. */ |
| 814 | #define MONITOR_SET_DIFF(monitor, value) \ |
| 815 | MONITOR_SET_UPD_MAX_ONLY(monitor, ((value) \ |
| 816 | - MONITOR_VALUE_RESET(monitor) \ |
| 817 | - MONITOR_FIELD(monitor, mon_start_value) \ |
| 818 | + MONITOR_FIELD(monitor, mon_last_value))) |
| 819 | |
| 820 | /****************************************************************//** |
| 821 | Get monitor's monitor_info_t by its monitor id (index into the |
| 822 | innodb_counter_info array |
| 823 | @return Point to corresponding monitor_info_t, or NULL if no such |
| 824 | monitor */ |
| 825 | monitor_info_t* |
| 826 | srv_mon_get_info( |
| 827 | /*=============*/ |
| 828 | monitor_id_t monitor_id); /*!< id index into the |
| 829 | innodb_counter_info array */ |
| 830 | /****************************************************************//** |
| 831 | Get monitor's name by its monitor id (index into the |
| 832 | innodb_counter_info array |
| 833 | @return corresponding monitor name, or NULL if no such |
| 834 | monitor */ |
| 835 | const char* |
| 836 | srv_mon_get_name( |
| 837 | /*=============*/ |
| 838 | monitor_id_t monitor_id); /*!< id index into the |
| 839 | innodb_counter_info array */ |
| 840 | |
| 841 | /****************************************************************//** |
| 842 | Turn on/off/reset monitor counters in a module. If module_value |
| 843 | is NUM_MONITOR then turn on all monitor counters. |
| 844 | @return 0 if successful, or the first monitor that cannot be |
| 845 | turned on because it is already turned on. */ |
| 846 | void |
| 847 | srv_mon_set_module_control( |
| 848 | /*=======================*/ |
| 849 | monitor_id_t module_id, /*!< in: Module ID as in |
| 850 | monitor_counter_id. If it is |
| 851 | set to NUM_MONITOR, this means |
| 852 | we shall turn on all the counters */ |
| 853 | mon_option_t set_option); /*!< in: Turn on/off reset the |
| 854 | counter */ |
| 855 | /****************************************************************//** |
| 856 | This function consolidates some existing server counters used |
| 857 | by "system status variables". These existing system variables do not have |
| 858 | mechanism to start/stop and reset the counters, so we simulate these |
| 859 | controls by remembering the corresponding counter values when the |
| 860 | corresponding monitors are turned on/off/reset, and do appropriate |
| 861 | mathematics to deduct the actual value. */ |
| 862 | void |
| 863 | srv_mon_process_existing_counter( |
| 864 | /*=============================*/ |
| 865 | monitor_id_t monitor_id, /*!< in: the monitor's ID as in |
| 866 | monitor_counter_id */ |
| 867 | mon_option_t set_option); /*!< in: Turn on/off reset the |
| 868 | counter */ |
| 869 | /*************************************************************//** |
| 870 | This function is used to calculate the maximum counter value |
| 871 | since the start of monitor counter |
| 872 | @return max counter value since start. */ |
| 873 | UNIV_INLINE |
| 874 | mon_type_t |
| 875 | srv_mon_calc_max_since_start( |
| 876 | /*=========================*/ |
| 877 | monitor_id_t monitor); /*!< in: monitor id */ |
| 878 | /*************************************************************//** |
| 879 | This function is used to calculate the minimum counter value |
| 880 | since the start of monitor counter |
| 881 | @return min counter value since start. */ |
| 882 | UNIV_INLINE |
| 883 | mon_type_t |
| 884 | srv_mon_calc_min_since_start( |
| 885 | /*=========================*/ |
| 886 | monitor_id_t monitor); /*!< in: monitor id*/ |
| 887 | /*************************************************************//** |
| 888 | Reset a monitor, create a new base line with the current monitor |
| 889 | value. This baseline is recorded by MONITOR_VALUE_RESET(monitor) */ |
| 890 | void |
| 891 | srv_mon_reset( |
| 892 | /*==========*/ |
| 893 | monitor_id_t monitor); /*!< in: monitor id*/ |
| 894 | /*************************************************************//** |
| 895 | This function resets all values of a monitor counter */ |
| 896 | UNIV_INLINE |
| 897 | void |
| 898 | srv_mon_reset_all( |
| 899 | /*==============*/ |
| 900 | monitor_id_t monitor); /*!< in: monitor id*/ |
| 901 | /*************************************************************//** |
| 902 | Turn on monitor counters that are marked as default ON. */ |
| 903 | void |
| 904 | srv_mon_default_on(void); |
| 905 | /*====================*/ |
| 906 | |
| 907 | #include "srv0mon.ic" |
| 908 | |
| 909 | #endif |
| 910 | |