class Fluent::Plugin::LocalStorage

Constants

DEFAULT_DIR_MODE
DEFAULT_FILE_MODE

Public Class Methods

new() click to toggle source
Calls superclass method Fluent::Plugin::Base.new
# File lib/fluent/plugin/storage_local.rb, line 36
def initialize
  super
  @store = {}
end

Public Instance Methods

configure(conf) click to toggle source
Calls superclass method Fluent::Plugin::Base#configure
# File lib/fluent/plugin/storage_local.rb, line 41
def configure(conf)
  super

  @on_memory = false
  if !@path && !@_plugin_id_configured
    if @persistent
      raise Fluent::ConfigError, "Plugin @id or path for <storage> required to save data"
    else
      if @autosave
        log.warn "both of Plugin @id and path for <storage> are not specified. Using on-memory store."
      else
        log.info "both of Plugin @id and path for <storage> are not specified. Using on-memory store."
      end
      @on_memory = true
    end
  elsif @path
    # ok
  else # @_plugin_id_configured is true
    log.warn "path for <storage> is not specified. Using on-memory store temporarily, but will use file store after support global storage path"
    @on_memory = true
    ## TODO: get process-wide directory for plugin storage, and generate path for this plugin storage instance
    # path = 
  end

  if !@on_memory
    dir = File.dirname(@path)
    FileUtils.mkdir_p(dir, mode: @dir_mode) unless File.exist?(dir)
    if File.exist?(@path)
      raise Fluent::ConfigError, "Plugin storage path '#{@path}' is not readable/writable" unless File.readable?(@path) && File.writable?(@path)
      begin
        data = Yajl::Parser.parse(open(@path, 'r:utf-8'){ |io| io.read })
        raise Fluent::ConfigError, "Invalid contents (not object) in plugin storage file: '#{@path}'" unless data.is_a?(Hash)
      rescue => e
        log.error "failed to read data from plugin storage file", path: @path, error: e
        raise Fluent::ConfigError, "Unexpected error: failed to read data from plugin storage file: '#{@path}'"
      end
    else
      raise Fluent::ConfigError, "Directory is not writable for plugin storage file '#{dir}'" unless File.writable?(dir)
    end
  end
end
delete(key) click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 124
def delete(key)
  @store.delete(key.to_s)
end
fetch(key, defval) click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 116
def fetch(key, defval)
  @store.fetch(key.to_s, defval)
end
get(key) click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 112
def get(key)
  @store[key.to_s]
end
load() click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 83
def load
  return if @on_memory
  return unless File.exist?(@path)
  begin
    json_string = open(@path, 'r:utf-8'){ |io| io.read }
    json = Yajl::Parser.parse(json_string)
    unless json.is_a?(Hash)
      log.error "broken content for plugin storage (Hash required: ignored)", type: json.class
      log.debug "broken content", content: json_string
      return
    end
    @store = json
  rescue => e
    log.error "failed to load data for plugin storage from file", path: @path, error: e
  end
end
put(key, value) click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 120
def put(key, value)
  @store[key.to_s] = value
end
save() click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 100
def save
  return if @on_memory
  tmp_path = @path + '.tmp'
  begin
    json_string = Yajl::Encoder.encode(@store, pretty: @pretty_print)
    open(tmp_path, 'w:utf-8', @mode){ |io| io.write json_string }
    File.rename(tmp_path, @path)
  rescue => e
    log.error "failed to save data for plugin storage to file", path: @path, tmp: tmp_path, error: e
  end
end
update(key, &block) click to toggle source
# File lib/fluent/plugin/storage_local.rb, line 128
def update(key, &block)
  @store[key.to_s] = block.call(@store[key.to_s])
end