Class: PoolLint::Inspectors::MySQL

Inherits:
Object
  • Object
show all
Defined in:
lib/poollint/inspectors/mysql.rb

Defined Under Namespace

Classes: PerformanceSchemaUnavailable, Snapshot

Constant Summary collapse

SETTING_NAME =
/\A[a-z_][a-z0-9_]*\z/
INSTRUMENT_SQL =
"SELECT /*+ MAX_EXECUTION_TIME(%<timeout_ms>d) */ COUNT(*)\n  FROM performance_schema.setup_instruments\n WHERE NAME = 'wait/lock/metadata/sql/mdl'\n   AND ENABLED = 'YES'\n"
USER_LOCKS_SQL =
"SELECT /*+ MAX_EXECUTION_TIME(%<timeout_ms>d) */\n       ml.OBJECT_NAME AS name,\n       ml.LOCK_TYPE AS mode,\n       ml.LOCK_STATUS AS status\n  FROM performance_schema.metadata_locks ml\n  JOIN performance_schema.threads t\n    ON t.THREAD_ID = ml.OWNER_THREAD_ID\n WHERE ml.OBJECT_TYPE = 'USER LEVEL LOCK'\n   AND ml.LOCK_STATUS = 'GRANTED'\n   AND t.PROCESSLIST_ID = CONNECTION_ID()\n ORDER BY ml.OBJECT_NAME\n"

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ MySQL

Returns a new instance of MySQL.



32
33
34
35
# File 'lib/poollint/inspectors/mysql.rb', line 32

def initialize(configuration)
  @configuration = configuration
  @allowed_settings = AllowedSettings.new(configuration.allowed_settings)
end

Instance Method Details

#establish_baseline(connection, state) ⇒ Object



37
38
39
40
41
42
# File 'lib/poollint/inspectors/mysql.rb', line 37

def establish_baseline(connection, state)
  snapshot = capture_snapshot(connection, state)
  state.capture_baseline(snapshot)
  ConnectionState.attach(connection, state)
  snapshot
end

#inspect(connection, state, inspection_point:) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/poollint/inspectors/mysql.rb', line 44

def inspect(connection, state, inspection_point:)
  baseline = state.baseline
  return establish_baseline(connection, state) unless baseline
  return unless state.dirty?

  snapshot = capture_snapshot(connection, state)
  unless state_attached?(connection, state)
    return reattach_after_reconnect(connection, state, snapshot)
  end

  report = build_report(baseline, snapshot, state, inspection_point)
  state.finish_inspection(
    snapshot: snapshot,
    rebaseline: report.leak? && @configuration.rebaseline_after_report
  )
  report if report.leak?
end