Class: CanvasSync::JobBatches::RedisScript

Inherits:
Object
  • Object
show all
Defined in:
lib/canvas_sync/job_batches/redis_script.rb

Overview

RedisScript represents a lua script in the filesystem. It loads the script from disk and handles talking to redis to execute it. Error handling is handled by LuaError.

Defined Under Namespace

Classes: LuaError, TemplateContext

Instance Method Summary collapse

Constructor Details

#initialize(file) ⇒ RedisScript

Loads the script file from disk and calculates its SHA1 sum.

Parameters:

  • file (Pathname)

    the full path to the indicated file

[View source]

16
17
18
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 16

def initialize(file)
  @file = Pathname.new(file)
end

Instance Method Details

#call(redis, *args) ⇒ Object

Passes the script and supplied arguments to redis for evaulation. It first attempts to use a script redis has already cached by using the EVALSHA command, but falls back to providing the full script text via EVAL if redis has not seen this script before. Future invocations will then use EVALSHA without erroring.

Parameters:

  • redis (Redis)

    the redis connection to run against

  • args (*Objects)

    the arguments to the script

Returns:

  • (Object)

    the value passed back by redis after script execution

Raises:

  • (LuaError)

    if the script failed to compile of encountered a runtime error

[View source]

31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 31

def call(redis, *args)
  t = Time.now
  begin
    redis.evalsha(digest, *args)
  rescue => e
    e.message =~ /NOSCRIPT/ ? redis.eval(content, *args) : raise
  end
rescue => e
  if LuaError.intercepts?(e)
    raise LuaError.new(e, @file, content)
  else
    raise
  end
end

#contentObject

[View source]

46
47
48
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 46

def content
  @content ||= load_lua(@file)
end

#digestObject

[View source]

50
51
52
# File 'lib/canvas_sync/job_batches/redis_script.rb', line 50

def digest
  @digest ||= Digest::SHA1.hexdigest content
end