Просмотр исходного кода

fix(snuba): Only shrink the 'start' parameter based on Group state (#10973)

Brett Hoerner 6 лет назад
Родитель
Сommit
823f55c9fa
2 измененных файлов с 16 добавлено и 11 удалено
  1. 11 5
      src/sentry/utils/snuba.py
  2. 5 6
      tests/snuba/test_util.py

+ 11 - 5
src/sentry/utils/snuba.py

@@ -372,8 +372,7 @@ def raw_query(start, end, groupby=None, conditions=None, filter_keys=None,
         if start > end:
             raise QueryOutsideRetentionError
 
-    if referrer != 'tsdb':
-        start, end = shrink_time_window(filter_keys.get('issue'), start, end)
+    start = shrink_time_window(filter_keys.get('issue'), start)
 
     # if `shrink_time_window` pushed `start` after `end` it means the user queried
     # a Group for T1 to T2 when the group was only active for T3 to T4, so the query
@@ -642,13 +641,20 @@ def insert_raw(data):
         raise SnubaError(err)
 
 
-def shrink_time_window(issues, start, end):
+def shrink_time_window(issues, start):
+    """\
+    If a single issue is passed in, shrink the `start` parameter to be briefly before
+    the `first_seen` in order to hopefully eliminate a large percentage of rows scanned.
+
+    Note that we don't shrink `end` based on `last_seen` because that value is updated
+    asynchronously by buffers, and will cause queries to skip recently seen data on
+    stale groups.
+    """
     if issues and len(issues) == 1:
         group = Group.objects.get(pk=issues[0])
         start = max(start, naiveify_datetime(group.first_seen) - timedelta(minutes=5))
-        end = min(end, naiveify_datetime(group.last_seen) + timedelta(minutes=5))
 
-    return start, end
+    return start
 
 
 def naiveify_datetime(dt):

+ 5 - 6
tests/snuba/test_util.py

@@ -25,13 +25,12 @@ class SnubaUtilTest(TestCase):
     def test_shrink_timeframe(self):
         now = datetime.now()
         year_ago = now - timedelta(days=365)
-        year_ahead = now + timedelta(days=365)
 
         issues = None
-        assert snuba.shrink_time_window(issues, year_ago, year_ahead) == (year_ago, year_ahead)
+        assert snuba.shrink_time_window(issues, year_ago) == year_ago
 
         issues = []
-        assert snuba.shrink_time_window(issues, year_ago, year_ahead) == (year_ago, year_ahead)
+        assert snuba.shrink_time_window(issues, year_ago) == year_ago
 
         group1 = self.create_group()
         group1.first_seen = now - timedelta(hours=1)
@@ -43,11 +42,11 @@ class SnubaUtilTest(TestCase):
         GroupHash.objects.create(project_id=group2.project_id, group=group2, hash='b' * 32)
 
         issues = [group1.id]
-        assert snuba.shrink_time_window(issues, year_ago, year_ahead) == \
-            (now - timedelta(hours=1, minutes=5), now + timedelta(minutes=5))
+        assert snuba.shrink_time_window(issues, year_ago) == \
+            now - timedelta(hours=1, minutes=5)
 
         issues = [group1.id, group2.id]
-        assert snuba.shrink_time_window(issues, year_ago, year_ahead) == (year_ago, year_ahead)
+        assert snuba.shrink_time_window(issues, year_ago) == year_ago
 
         with pytest.raises(snuba.QueryOutsideGroupActivityError):
             # query a group for a time range before it had any activity