Skip to content

Commit e170df3

Browse files
committed
Merge pull request #2984 from getsentry/fix-merge
Handle GroupTagKey and GroupTagValue when merging issues Conflicts: src/sentry/tasks/merge.py tests/sentry/tasks/test_merge.py
1 parent 08dca05 commit e170df3

File tree

2 files changed

+52
-16
lines changed

2 files changed

+52
-16
lines changed

src/sentry/tasks/merge.py

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ def _rehash_group_events(group, limit=100):
153153

154154
def merge_objects(models, group, new_group, limit=1000,
155155
logger=None):
156+
from sentry.models import GroupTagKey, GroupTagValue
156157

157158
has_more = False
158159
for model in models:
@@ -161,7 +162,6 @@ def merge_objects(models, group, new_group, limit=1000,
161162
new_group)
162163
all_fields = model._meta.get_all_field_names()
163164
has_group = 'group' in all_fields
164-
has_values_seen = 'values_seen' in all_fields
165165
if has_group:
166166
queryset = model.objects.filter(group=group)
167167
else:
@@ -184,20 +184,23 @@ def merge_objects(models, group, new_group, limit=1000,
184184

185185
if delete:
186186
# Before deleting, we want to merge in counts
187-
if has_values_seen:
188-
try:
187+
try:
188+
if model == GroupTagKey:
189189
with transaction.atomic(using=router.db_for_write(model)):
190-
if has_group:
191-
model.objects.filter(
192-
group=new_group,
193-
).update(values_seen=F('values_seen') + obj.values_seen)
194-
else:
195-
model.objects.filter(
196-
group_id=new_group.id,
197-
).update(values_seen=F('values_seen') + obj.values_seen)
198-
except DataError:
199-
# it's possible to hit an out of range value for counters
200-
pass
190+
model.objects.filter(
191+
group=new_group,
192+
key=obj.key,
193+
).update(values_seen=F('values_seen') + obj.values_seen)
194+
elif model == GroupTagValue:
195+
with transaction.atomic(using=router.db_for_write(model)):
196+
model.objects.filter(
197+
group=new_group,
198+
key=obj.key,
199+
value=obj.value,
200+
).update(times_seen=F('times_seen') + obj.times_seen)
201+
except DataError:
202+
# it's possible to hit an out of range value for counters
203+
pass
201204
obj.delete()
202205
has_more = True
203206

tests/sentry/tasks/test_merge.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import absolute_import
22

33
from sentry.tasks.merge import merge_group, rehash_group_events
4-
from sentry.models import Event, Group, GroupRedirect, GroupTagKey
4+
from sentry.models import Event, Group, GroupRedirect, GroupTagKey, GroupTagValue
55
from sentry.testutils import TestCase
66

77

@@ -62,16 +62,49 @@ def test_merge_updates_tag_values_seen(self):
6262
key='sentry:user',
6363
values_seen=1,
6464
)
65+
GroupTagKey.objects.create(
66+
project=project,
67+
group=group,
68+
key='foo',
69+
values_seen=5,
70+
)
71+
GroupTagValue.objects.create(
72+
project=project,
73+
group=group,
74+
key='key1',
75+
times_seen=1,
76+
)
77+
GroupTagValue.objects.create(
78+
project=project,
79+
group=group,
80+
key='key2',
81+
times_seen=5,
82+
)
6583

6684
with self.tasks():
6785
merge_group(groups[0].id, groups[1].id)
6886

6987
assert not Group.objects.filter(id=groups[0].id).exists()
7088
assert not GroupTagKey.objects.filter(group_id=groups[0].id).exists()
89+
assert not GroupTagValue.objects.filter(group_id=groups[0].id).exists()
7190

7291
assert GroupTagKey.objects.get(
73-
group_id=groups[1].id, key='sentry:user',
92+
group_id=groups[1].id,
93+
key='sentry:user',
7494
).values_seen == 2
95+
assert GroupTagKey.objects.get(
96+
group_id=groups[1].id,
97+
key='foo',
98+
).values_seen == 10
99+
100+
assert GroupTagValue.objects.get(
101+
group_id=groups[1].id,
102+
key='key1',
103+
).times_seen == 2
104+
assert GroupTagValue.objects.get(
105+
group_id=groups[1].id,
106+
key='key2',
107+
).times_seen == 10
75108

76109

77110
class RehashGroupEventsTest(TestCase):

0 commit comments

Comments
 (0)