diff options
| author | Teddy Wing | 2018-04-30 18:33:49 +0200 | 
|---|---|---|
| committer | Teddy Wing | 2018-05-02 17:20:11 +0200 | 
| commit | b6c0477552576e7f8575bf2dca6e7899b640c012 (patch) | |
| tree | 4328a671e4214433cce857bbb2b4ce15f3ed529c /lib | |
| parent | 6779a070b8d5d6d738539f84e4405a86337f7dfb (diff) | |
| download | chouette-core-b6c0477552576e7f8575bf2dca6e7899b640c012.tar.bz2 | |
TomTom::Matrix: Handle error responses from TomTom
Occasionally, the following error would appear in our logs:
    NoMethodError
    RouteWayCostWorker/perform
    Error message
    NoMethodError: undefined method `each_with_index' for nil:NilClass
    Stack trace (show Rails)
                                 /app/lib/tom_tom/matrix.rb:  83:in `extract_costs_to_way_costs!'
                                 /app/lib/tom_tom/matrix.rb:  23:in `matrix'
                                        /app/lib/tom_tom.rb:  24:in `matrix'
             /app/app/services/route_way_cost_calculator.rb:   8:in `calculate!'
                  /app/app/workers/route_way_cost_worker.rb:  12:in `perform'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 167:in `execute_job'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 139:in `block (5 levels) in process'
     /var/lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq.rb:  36:in `block in <module:Sidekiq>'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 135:in `block (4 levels) in process'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 128:in `block in invoke'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
    …-4.2.10/lib/sidekiq/middleware/server/active_record.rb:   6:in `call'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
    …idekiq-4.2.10/lib/sidekiq/middleware/server/logging.rb:  10:in `call'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
    …kiq-4.2.10/lib/sidekiq/middleware/server/retry_jobs.rb:  74:in `call'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 130:in `block in invoke'
    ….0/gems/sidekiq-4.2.10/lib/sidekiq/middleware/chain.rb: 133:in `invoke'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 134:in `block (3 levels) in process'
    …/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/logging.rb:  32:in `with_context'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 132:in `block (2 levels) in process'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 183:in `stats'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 131:in `block in process'
     /var/lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq.rb:  35:in `block in <module:Sidekiq>'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb: 126:in `process'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb:  82:in `process_one'
    …ems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/processor.rb:  70:in `run'
    …lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/util.rb:  17:in `watchdog'
    …lib/gems/2.3.0/gems/sidekiq-4.2.10/lib/sidekiq/util.rb:  26:in `block in safe_thread'
My best guess is that this was caused by TomTom responding with an
error, which we weren't handling previously. In that case, the response
would be a JSON string, but include an `'error'` field instead of
`'matrix'` and `'summary'`. Thus, when we'd try to
`matrix_json['matrix']`, it would fail.
Add a new method that checks for errors before we try to parse
`WayCost`s. If a server error is detected, we log the message to the
Rails log and return an empty array.
Refs #6884
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/tom_tom/matrix.rb | 19 | 
1 files changed, 18 insertions, 1 deletions
| diff --git a/lib/tom_tom/matrix.rb b/lib/tom_tom/matrix.rb index b0c8cc335..b57495f3f 100644 --- a/lib/tom_tom/matrix.rb +++ b/lib/tom_tom/matrix.rb @@ -20,11 +20,19 @@ module TomTom          req.body = build_request_body(points)        end +      matrix_json = JSON.parse(response.body) + +      check_for_error_response(matrix_json) +        extract_costs_to_way_costs!(          way_costs,          points_with_ids, -        JSON.parse(response.body) +        matrix_json        ) +    rescue RemoteError => e +      Rails.logger.error "TomTom::Matrix server error: #{e}" + +      []      end      def points_from_way_costs(way_costs) @@ -76,6 +84,12 @@ module TomTom        })      end +    def check_for_error_response(matrix_json) +      if matrix_json.has_key?('error') +        raise RemoteError, matrix_json['error']['description'] +      end +    end +      def extract_costs_to_way_costs!(way_costs, points, matrix_json)        way_costs = [] @@ -110,5 +124,8 @@ module TomTom        way_costs      end + + +    class RemoteError < RuntimeError; end    end  end | 
