def refresh_queries(): logger.info("Refreshing queries...") enqueued = [] for query in models.Query.outdated_queries(): if not _should_refresh_query(query): continue try: enqueue_query( _apply_default_parameters(query), query.data_source, query.user_id, scheduled_query=query, metadata={ "Query ID": query.id, "Username": "******" }, ) enqueued.append(query) except Exception as e: message = "Could not enqueue query %d due to %s" % (query.id, repr(e)) logging.info(message) sentry.capture_message(message) status = { "outdated_queries_count": len(enqueued), "last_refresh_at": time.time(), "query_ids": json_dumps([q.id for q in enqueued]), } redis_connection.hmset("redash:status", status) logger.info("Done refreshing queries: %s" % status)
def outdated_queries(cls): queries = ( Query.query.options( joinedload(Query.latest_query_data).load_only("retrieved_at") ) .filter(Query.schedule.isnot(None)) .order_by(Query.id) ) now = utils.utcnow() outdated_queries = {} scheduled_queries_executions.refresh() for query in queries: try: if query.schedule.get("disabled"): continue if query.schedule["until"]: schedule_until = pytz.utc.localize( datetime.datetime.strptime(query.schedule["until"], "%Y-%m-%d") ) if schedule_until <= now: continue retrieved_at = scheduled_queries_executions.get(query.id) or ( query.latest_query_data and query.latest_query_data.retrieved_at ) if should_schedule_next( retrieved_at or now, now, query.schedule["interval"], query.schedule["time"], query.schedule["day_of_week"], query.schedule_failures, ): key = "{}:{}".format(query.query_hash, query.data_source_id) outdated_queries[key] = query except Exception as e: query.schedule["disabled"] = True db.session.commit() message = "Could not determine if query %d is outdated due to %s. The schedule for this query has been disabled." % (query.id, repr(e)) logging.info(message) sentry.capture_message(message) return list(outdated_queries.values())