This mixin is to prepend to 3rd party plugins of v0.12 APIs. In past, there were not strong rule to call super in start, before_shutdown and shutdown. But v0.14 API requires to call super in these methods to setup/teardown plugin helpers and others. This mixin prepends method calls to call super forcedly if checker returns false (it shows Fluent::Plugin::Base#methods wasn't called)
# File lib/fluent/compat/call_super_mixin.rb, line 25 def self.prepended(klass) @@_super_start ||= {} @@_super_before_shutdown ||= {} @@_super_shutdown ||= {} # ancestors[0]: this module # ancestors[1]: prepended class (plugin itself) method_search = ->(ancestors, method){ closest = ancestors[2, ancestors.size - 2].index{|m| m.method_defined?(method) } ancestors[2 + closest].instance_method(method) } @@_super_start[klass] = method_search.call(klass.ancestors, :start) # this returns Fluent::Compat::*#start (or helpers on it) @@_super_before_shutdown[klass] = method_search.call(klass.ancestors, :before_shutdown) @@_super_shutdown[klass] = method_search.call(klass.ancestors, :shutdown) end
# File lib/fluent/compat/call_super_mixin.rb, line 50 def before_shutdown super unless self.before_shutdown? log.warn "super was not called in #before_shutdown: calling it forcedly", plugin: self.class @@_super_before_shutdown[self.class].bind(self).call end end
# File lib/fluent/compat/call_super_mixin.rb, line 58 def shutdown super unless self.shutdown? log.warn "super was not called in #shutdown: calling it forcedly", plugin: self.class @@_super_shutdown[self.class].bind(self).call end end
# File lib/fluent/compat/call_super_mixin.rb, line 41 def start super unless self.started? @@_super_start[self.class].bind(self).call # #super will reset logdev (especially in test), so this warn should be after calling it log.warn "super was not called in #start: called it forcedly", plugin: self.class end end