From 75d2f995e2d223c6633abedb5677ee42a4e0b9e4 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Wed, 10 Feb 2021 13:18:45 +0000 Subject: [PATCH] [FIX] *: query counts Adapt some query counts to their optimal value, in order to measure the effect of the following commits on queries. In module test_performance, some query counts were actually not correct: the initial flush() done by the context manager assertQueryCount() may prefetch some data to the cache, and that prefetching is not accounted for in the query count. This is very true when assertQueryCount() is preceded by a cache invalidation. We have to move the invalidation inside the context manager, so that the prefetching is now counted. --- .../hr_holidays/tests/test_company_leave.py | 3 +- addons/test_mail/tests/test_performance.py | 4 +- .../tests/test_performance.py | 2 +- odoo/addons/base/tests/test_ir_actions.py | 4 +- .../tests/test_performance.py | 90 ++++++++++--------- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/addons/hr_holidays/tests/test_company_leave.py b/addons/hr_holidays/tests/test_company_leave.py index 11462de358b..486c353425c 100644 --- a/addons/hr_holidays/tests/test_company_leave.py +++ b/addons/hr_holidays/tests/test_company_leave.py @@ -313,8 +313,7 @@ class TestCompanyLeave(TransactionCase): }) company_leave._compute_date_from_to() - count = 865 - with self.assertQueryCount(__system__=count, admin=count): + with self.assertQueryCount(__system__=735, admin=865): # Original query count: 1987 # Without tracking/activity context keys: 5154 company_leave.action_validate() diff --git a/addons/test_mail/tests/test_performance.py b/addons/test_mail/tests/test_performance.py index 424a465cd51..ecc2b110715 100644 --- a/addons/test_mail/tests/test_performance.py +++ b/addons/test_mail/tests/test_performance.py @@ -281,7 +281,7 @@ class TestMailAPIPerformance(BaseMailPerformance): test_record = self.env['mail.test.ticket'].browse(self.test_record_full.id) test_template = self.env['mail.template'].browse(self.test_template_full.id) # TODO FIXME non deterministic, last check 25 Mar 2020. Runbot at most +7 compared to local. - with self.assertQueryCount(__system__=12, emp=14): + with self.assertQueryCount(__system__=11, emp=13): composer = self.env['mail.compose.message'].with_context({ 'default_composition_mode': 'comment', 'default_model': test_record._name, @@ -602,7 +602,7 @@ class TestMailComplexPerformance(BaseMailPerformance): customer_id = self.customer.id user_id = self.user_portal.id - with self.assertQueryCount(__system__=109, emp=110): + with self.assertQueryCount(__system__=108, emp=109): rec = self.env['mail.test.ticket'].create({ 'name': 'Test', 'container_id': container_id, diff --git a/addons/test_mass_mailing/tests/test_performance.py b/addons/test_mass_mailing/tests/test_performance.py index 5ae91d52aa6..85fdf26bae8 100644 --- a/addons/test_mass_mailing/tests/test_performance.py +++ b/addons/test_mass_mailing/tests/test_performance.py @@ -91,7 +91,7 @@ class TestMassMailBlPerformance(TestMassMailPerformanceBase): }) # runbot needs +62 compared to local - with self.assertQueryCount(__system__=1993, marketing=1994): + with self.assertQueryCount(__system__=1992, marketing=1993): mailing.action_send_mail() self.assertEqual(mailing.sent, 50) diff --git a/odoo/addons/base/tests/test_ir_actions.py b/odoo/addons/base/tests/test_ir_actions.py index 7228c0d8d3f..29d2f890038 100644 --- a/odoo/addons/base/tests/test_ir_actions.py +++ b/odoo/addons/base/tests/test_ir_actions.py @@ -510,8 +510,8 @@ class TestCustomFields(common.TransactionCase): }) query_count = self.cr.sql_log_count - query_count - # create the related field, and assert it only takes 3 extra queries - with self.assertQueryCount(query_count + 3): + # create the related field, and assert it only takes 1 extra query + with self.assertQueryCount(query_count + 1): self.env['ir.model.fields'].create({ 'model_id': self.env['ir.model']._get_id('res.partner'), 'name': 'x_oh_boy', diff --git a/odoo/addons/test_performance/tests/test_performance.py b/odoo/addons/test_performance/tests/test_performance.py index 17ee6459b1a..d95f51c7d8b 100644 --- a/odoo/addons/test_performance/tests/test_performance.py +++ b/odoo/addons/test_performance/tests/test_performance.py @@ -112,37 +112,37 @@ class TestPerformance(SavepointCaseWithUserDemo): rec1 = self.env['test_performance.base'].create({'name': 'X'}) # create N lines on rec1: O(N) queries - rec1.invalidate_cache() - with self.assertQueryCount(2): + with self.assertQueryCount(3): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.create({'value': 0})]}) self.assertEqual(len(rec1.line_ids), 1) - rec1.invalidate_cache() with self.assertQueryCount(15): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.create({'value': val}) for val in range(1, 12)]}) self.assertEqual(len(rec1.line_ids), 12) lines = rec1.line_ids # update N lines: O(N) queries - rec1.invalidate_cache() with self.assertQueryCount(6): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.update(line.id, {'value': 42}) for line in lines[0]]}) self.assertEqual(rec1.line_ids, lines) - rec1.invalidate_cache() with self.assertQueryCount(26): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.update(line.id, {'value': 42 + line.id}) for line in lines[1:]]}) self.assertEqual(rec1.line_ids, lines) # delete N lines: O(1) queries - rec1.invalidate_cache() - with self.assertQueryCount(__system__=14, demo=14): + with self.assertQueryCount(14): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.delete(line.id) for line in lines[0]]}) self.assertEqual(rec1.line_ids, lines[1:]) - rec1.invalidate_cache() - with self.assertQueryCount(__system__=12, demo=12): + with self.assertQueryCount(12): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.delete(line.id) for line in lines[1:]]}) self.assertFalse(rec1.line_ids) self.assertFalse(lines.exists()) @@ -151,13 +151,13 @@ class TestPerformance(SavepointCaseWithUserDemo): lines = rec1.line_ids # unlink N lines: O(1) queries - rec1.invalidate_cache() - with self.assertQueryCount(__system__=11, demo=11): + with self.assertQueryCount(14): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[0]]}) self.assertEqual(rec1.line_ids, lines[1:]) - rec1.invalidate_cache() - with self.assertQueryCount(__system__=12, demo=12): + with self.assertQueryCount(12): + rec1.invalidate_cache() rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[1:]]}) self.assertFalse(rec1.line_ids) self.assertFalse(lines.exists()) @@ -167,36 +167,36 @@ class TestPerformance(SavepointCaseWithUserDemo): rec2 = self.env['test_performance.base'].create({'name': 'X'}) # link N lines from rec1 to rec2: O(1) queries - rec1.invalidate_cache() - with self.assertQueryCount(2): + with self.assertQueryCount(7): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]}) self.assertEqual(rec1.line_ids, lines[1:]) self.assertEqual(rec2.line_ids, lines[0]) - rec1.invalidate_cache() with self.assertQueryCount(7): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]}) self.assertFalse(rec1.line_ids) self.assertEqual(rec2.line_ids, lines) - rec1.invalidate_cache() with self.assertQueryCount(5): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]}) self.assertEqual(rec2.line_ids, lines) - rec1.invalidate_cache() with self.assertQueryCount(5): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]}) self.assertEqual(rec2.line_ids, lines) # empty N lines in rec2: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(__system__=13, demo=13): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.clear()]}) self.assertFalse(rec2.line_ids) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.clear()]}) self.assertFalse(rec2.line_ids) @@ -204,18 +204,20 @@ class TestPerformance(SavepointCaseWithUserDemo): lines = rec1.line_ids # set N lines in rec2: O(1) queries - rec1.invalidate_cache() - with self.assertQueryCount(4): + with self.assertQueryCount(8): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.set(lines[0].ids)]}) self.assertEqual(rec1.line_ids, lines[1:]) self.assertEqual(rec2.line_ids, lines[0]) - with self.assertQueryCount(5): + with self.assertQueryCount(7): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.set(lines.ids)]}) self.assertFalse(rec1.line_ids) self.assertEqual(rec2.line_ids, lines) - with self.assertQueryCount(3): + with self.assertQueryCount(5): + rec1.invalidate_cache() rec2.write({'line_ids': [Command.set(lines.ids)]}) self.assertEqual(rec2.line_ids, lines) @@ -238,37 +240,37 @@ class TestPerformance(SavepointCaseWithUserDemo): rec1 = self.env['test_performance.base'].create({'name': 'X'}) # create N tags on rec1: O(N) queries - rec1.invalidate_cache() with self.assertQueryCount(4): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.create({'name': 0})]}) self.assertEqual(len(rec1.tag_ids), 1) - rec1.invalidate_cache() with self.assertQueryCount(14): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.create({'name': val}) for val in range(1, 12)]}) self.assertEqual(len(rec1.tag_ids), 12) tags = rec1.tag_ids # update N tags: O(N) queries - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[0]]}) self.assertEqual(rec1.tag_ids, tags) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[1:]]}) self.assertEqual(rec1.tag_ids, tags) # delete N tags: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(__system__=8, demo=8): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[0]]}) self.assertEqual(rec1.tag_ids, tags[1:]) - rec1.invalidate_cache() with self.assertQueryCount(__system__=8, demo=8): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[1:]]}) self.assertFalse(rec1.tag_ids) self.assertFalse(tags.exists()) @@ -277,13 +279,13 @@ class TestPerformance(SavepointCaseWithUserDemo): tags = rec1.tag_ids # unlink N tags: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[0]]}) self.assertEqual(rec1.tag_ids, tags[1:]) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[1:]]}) self.assertFalse(rec1.tag_ids) self.assertTrue(tags.exists()) @@ -291,56 +293,56 @@ class TestPerformance(SavepointCaseWithUserDemo): rec2 = self.env['test_performance.base'].create({'name': 'X'}) # link N tags from rec1 to rec2: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[0]]}) self.assertEqual(rec2.tag_ids, tags[0]) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]}) self.assertEqual(rec2.tag_ids, tags) - rec1.invalidate_cache() with self.assertQueryCount(2): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]}) self.assertEqual(rec2.tag_ids, tags) # empty N tags in rec2: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.clear()]}) self.assertFalse(rec2.tag_ids) self.assertTrue(tags.exists()) - rec1.invalidate_cache() with self.assertQueryCount(2): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.clear()]}) self.assertFalse(rec2.tag_ids) # set N tags in rec2: O(1) queries - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.set(tags.ids)]}) self.assertEqual(rec2.tag_ids, tags) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.set(tags[:8].ids)]}) self.assertEqual(rec2.tag_ids, tags[:8]) - rec1.invalidate_cache() with self.assertQueryCount(4): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.set(tags[4:].ids)]}) self.assertEqual(rec2.tag_ids, tags[4:]) - rec1.invalidate_cache() with self.assertQueryCount(3): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.set(tags.ids)]}) self.assertEqual(rec2.tag_ids, tags) - rec1.invalidate_cache() with self.assertQueryCount(2): + rec1.invalidate_cache() rec2.write({'tag_ids': [Command.set(tags.ids)]}) self.assertEqual(rec2.tag_ids, tags) @@ -412,12 +414,12 @@ class TestPerformance(SavepointCaseWithUserDemo): with self.assertQueryCount(__system__=2, demo=2): records.mapped('value') - records.invalidate_cache(['value']) with self.assertQueryCount(__system__=2, demo=2): + records.invalidate_cache(['value']) records.mapped('value') - records.invalidate_cache(['value']) with self.assertQueryCount(__system__=2, demo=2): + records.invalidate_cache(['value']) new_recs = records.browse(records.new(origin=record).id for record in records) new_recs.mapped('value')