lib/embulk/input/jira_api/client.rb in embulk-input-jira-0.1.2 vs lib/embulk/input/jira_api/client.rb in embulk-input-jira-0.2.0
- old
+ new
@@ -18,10 +18,12 @@
end
def search_issues(jql, options={})
timeout_and_retry(SEARCH_ISSUES_TIMEOUT_SECONDS) do
issues_raw = search(jql, options).issues_raw
+
+ # TODO: below code has race-conditon.
Parallel.map(issues_raw, in_threads: PARALLEL_THREAD_COUNT) do |issue_raw|
# https://github.com/dorack/jiralicious/blob/v0.4.0/lib/jiralicious/search_result.rb#L32-34
issue = Jiralicious::Issue.find(issue_raw["key"])
JiraApi::Issue.new(issue)
end
@@ -43,9 +45,29 @@
def timeout_and_retry(wait, retry_times = DEFAULT_SEARCH_RETRY_TIMES, &block)
count = 1
begin
Timeout.timeout(wait) do
yield
+ end
+ rescue Jiralicious::JqlError, Jiralicious::AuthenticationError, Jiralicious::NotLoggedIn, Jiralicious::InvalidLogin => e
+ raise Embulk::ConfigError.new(e.message)
+ rescue ::SocketError => e
+ # wrong `uri` option given
+ raise Embulk::ConfigError.new(e.message)
+ rescue MultiJson::ParseError => e
+ # same as this Mailchimp plugin issue: https://github.com/treasure-data/embulk-output-mailchimp/issues/10
+ # (a) JIRA returns error as HTML, but HTTParty try to parse it as JSON.
+ # And (b) `search_issues` method has race-condition bug. If it occurred, MultiJson::ParseError raised too.
+ html = e.message
+ title = html[%r|<title>(.*?)</title>|, 1] #=> e.g. "Unauthorized (401)"
+ if title
+ # (a)
+ Embulk.logger.warn "JIRA returns HTML: #{html}"
+ raise Embulk::ConfigError.new("JIRA returns error: #{title}")
+ else
+ # (b)
+ count += 1
+ retry
end
rescue Timeout::Error => e
count += 1
sleep count # retry after some seconds for JIRA API perhaps under the overload
raise e if count > retry_times