5
5
6
6
import redis
7
7
8
+ from celery .exceptions import SoftTimeLimitExceeded
8
9
from celery .result import AsyncResult
9
10
from celery .utils .log import get_task_logger
10
11
from redash import models , redis_connection , settings , statsd_client , utils
@@ -234,9 +235,7 @@ def enqueue_query(query, data_source, user_id, scheduled_query=None, metadata={}
234
235
queue_name = data_source .queue_name
235
236
scheduled_query_id = None
236
237
237
- result = execute_query .apply_async (args = (
238
- query , data_source .id , metadata , user_id ,
239
- scheduled_query_id ),
238
+ result = execute_query .apply_async (args = (query , data_source .id , metadata , user_id , scheduled_query_id ),
240
239
queue = queue_name )
241
240
job = QueryTask (async_result = result )
242
241
tracker = QueryTaskTracker .create (
@@ -342,14 +341,30 @@ def cleanup_query_results():
342
341
logger .info ("Deleted %d unused query results." , deleted_count )
343
342
344
343
344
+ @celery .task (name = "redash.tasks.refresh_schema" , soft_time_limit = 60 )
345
+ def refresh_schema (data_source_id ):
346
+ ds = models .DataSource .get_by_id (data_source_id )
347
+ logger .info (u"task=refresh_schema state=start ds_id=%s" , ds .id )
348
+ start_time = time .time ()
349
+ try :
350
+ ds .get_schema (refresh = True )
351
+ logger .info (u"task=refresh_schema state=finished ds_id=%s runtime=%.2f" , ds .id , time .time () - start_time )
352
+ statsd_client .incr ('refresh_schema.success' )
353
+ except SoftTimeLimitExceeded :
354
+ logger .info (u"task=refresh_schema state=timeout ds_id=%s runtime=%.2f" , ds .id , time .time () - start_time )
355
+ statsd_client .incr ('refresh_schema.timeout' )
356
+ except Exception :
357
+ logger .warning (u"Failed refreshing schema for the data source: %s" , ds .name , exc_info = 1 )
358
+ statsd_client .incr ('refresh_schema.error' )
359
+ logger .info (u"task=refresh_schema state=failed ds_id=%s runtime=%.2f" , ds .id , time .time () - start_time )
360
+
361
+
345
362
@celery .task (name = "redash.tasks.refresh_schemas" )
346
363
def refresh_schemas ():
347
364
"""
348
365
Refreshes the data sources schemas.
349
366
"""
350
-
351
367
blacklist = [int (ds_id ) for ds_id in redis_connection .smembers ('data_sources:schema:blacklist' ) if ds_id ]
352
-
353
368
global_start_time = time .time ()
354
369
355
370
logger .info (u"task=refresh_schemas state=start" )
@@ -360,14 +375,7 @@ def refresh_schemas():
360
375
elif ds .id in blacklist :
361
376
logger .info (u"task=refresh_schema state=skip ds_id=%s reason=blacklist" , ds .id )
362
377
else :
363
- logger .info (u"task=refresh_schema state=start ds_id=%s" , ds .id )
364
- start_time = time .time ()
365
- try :
366
- ds .get_schema (refresh = True )
367
- logger .info (u"task=refresh_schema state=finished ds_id=%s runtime=%.2f" , ds .id , time .time () - start_time )
368
- except Exception :
369
- logger .exception (u"Failed refreshing schema for the data source: %s" , ds .name )
370
- logger .info (u"task=refresh_schema state=failed ds_id=%s runtime=%.2f" , ds .id , time .time () - start_time )
378
+ refresh_schema .apply_async (args = (ds .id ,), queue = "schemas" )
371
379
372
380
logger .info (u"task=refresh_schemas state=finish total_runtime=%.2f" , time .time () - global_start_time )
373
381
0 commit comments