Skip to content

Commit 3d6b45c

Browse files
authored
handle error with error handler in async scheduler (#248)
1 parent 1c19b8e commit 3d6b45c

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

lib/optimizely/config_manager/async_scheduler.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2019, Optimizely and contributors
4+
# Copyright 2019-2020, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -19,20 +19,22 @@ module Optimizely
1919
class AsyncScheduler
2020
attr_reader :running
2121

22-
def initialize(callback, interval, auto_update, logger = nil)
22+
def initialize(callback, interval, auto_update, logger = nil, error_handler = nil)
2323
# Sets up AsyncScheduler to execute a callback periodically.
2424
#
2525
# callback - Main function to be executed periodically.
2626
# interval - How many seconds to wait between executions.
2727
# auto_update - boolean indicates to run infinitely or only once.
2828
# logger - Optional Provides a logger instance.
29+
# error_handler - Optional Provides a handle_error method to handle exceptions.
2930

3031
@callback = callback
3132
@interval = interval
3233
@auto_update = auto_update
3334
@running = false
3435
@thread = nil
3536
@logger = logger || NoOpLogger.new
37+
@error_handler = error_handler || NoOpErrorHandler.new
3638
end
3739

3840
def start!
@@ -54,6 +56,7 @@ def start!
5456
Logger::ERROR,
5557
"Couldn't create a new thread for async scheduler. #{e.message}"
5658
)
59+
@error_handler.handle_error(e)
5760
end
5861
end
5962

@@ -80,6 +83,7 @@ def execution_wrapper(callback)
8083
Logger::ERROR,
8184
"Something went wrong when executing passed callback. #{e.message}"
8285
)
86+
@error_handler.handle_error(e)
8387
stop!
8488
end
8589
break unless @auto_update

spec/config_manager/async_scheduler_spec.rb

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2019, Optimizely and contributors
4+
# Copyright 2019-2020, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -17,21 +17,36 @@
1717
#
1818
require 'spec_helper'
1919
require 'optimizely/config_manager/async_scheduler'
20+
require 'optimizely/error_handler'
2021
require 'optimizely/logger'
2122

2223
describe Optimizely::AsyncScheduler do
24+
let(:error_handler) { Optimizely::RaiseErrorHandler.new }
25+
let(:spy_logger) { spy('logger') }
26+
2327
it 'should log error trace when callback fails to execute' do
28+
allow(Thread).to receive(:new).and_yield
2429
def some_callback(_args); end
2530

26-
spy_logger = spy('logger')
27-
28-
scheduler = Optimizely::AsyncScheduler.new(method(:some_callback), 10, false, spy_logger)
29-
scheduler.start!
31+
scheduler = Optimizely::AsyncScheduler.new(method(:some_callback), 10, false, spy_logger, error_handler)
3032

31-
while scheduler.running; end
33+
expect { scheduler.start! }.to raise_error(StandardError)
3234
expect(spy_logger).to have_received(:log).with(
3335
Logger::ERROR,
3436
'Something went wrong when executing passed callback. wrong number of arguments (given 0, expected 1)'
3537
)
3638
end
39+
40+
it 'should log error trace when new thread creation fails' do
41+
allow(Thread).to receive(:new).and_raise
42+
def some_callback(_args); end
43+
44+
scheduler = Optimizely::AsyncScheduler.new(method(:some_callback), 10, false, spy_logger, error_handler)
45+
46+
expect { scheduler.start! }.to raise_error(StandardError)
47+
expect(spy_logger).to have_received(:log).with(
48+
Logger::ERROR,
49+
"Couldn't create a new thread for async scheduler. "
50+
)
51+
end
3752
end

0 commit comments

Comments
 (0)