Skip to content

Commit 148fa6e

Browse files
committed
add timeout for user playground queries
1 parent c7ff2f7 commit 148fa6e

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

app/models/background_job/db_query.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ def process
88
begin
99
# run the SQL Query
1010
db = Util::DbManager.new
11+
timeout = Support::Setting.playground_query_limit
12+
Rails.logger.info("Setting query timeout to #{timeout}ms")
13+
14+
db.public_connection.execute("SET statement_timeout = '#{timeout}'")
1115
@results = db.public_connection.execute(data['query'])
1216

1317
# write out the query result to a csv file
@@ -41,6 +45,13 @@ def process
4145
completed_at: Time.now,
4246
url: result.service.send(:object_for, result.key).public_url
4347
)
48+
49+
rescue ActiveRecord::QueryCanceled => e
50+
update(
51+
status: "error",
52+
logs: "Query timeout after #{timeout/1000} seconds: #{e.message}",
53+
user_error_message: "Query exceeded maximum execution time of #{timeout/1000} seconds. Please optimize your query."
54+
)
4455

4556
# if there is an error in the SQL Query, show the error message
4657
rescue ActiveRecord::StatementInvalid => e
@@ -50,6 +61,9 @@ def process
5061
# if the background job status is "error", show the user error message
5162
rescue StandardError => e
5263
update(status: "error", logs: e.message, user_error_message: "There was an error, please contact us.")
53-
end
64+
65+
ensure
66+
Rails.logger.info("DB Query job #{id} completed with status: #{status}")
67+
end
5468
end
5569
end

app/models/support/setting.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@ module Support
22
class Setting < ApplicationRecord
33
self.table_name = 'support.settings'
44

5+
REGISTRY = {
6+
export_search_results: false,
7+
playground_query_limit: 120_000
8+
}.freeze
9+
510
validates :key, presence: true, uniqueness: true
611
validates :value, presence: true
712

813
def self.get(key)
914
setting = find_by(key: key)
10-
setting&.value
15+
return setting.value if setting.present?
16+
17+
symbolized_key = key.to_sym
18+
raise KeyError, "Unknown Setting Key: #{key}" unless REGISTRY.key?(symbolized_key)
19+
20+
REGISTRY[symbolized_key]
1121
end
1222

1323
def self.set(key, value)
@@ -18,8 +28,11 @@ def self.set(key, value)
1828

1929
# helper settings methods
2030
def self.export_search_results?
21-
get('export_search_results').to_s == 'true'
31+
get(:export_search_results).to_s == 'true'
32+
end
33+
34+
def self.playground_query_limit
35+
get(:playground_query_limit).to_i
2236
end
23-
2437
end
2538
end

0 commit comments

Comments
 (0)