summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarten Kenbeek <marten.knbk@gmail.com>2015-02-20 05:43:45 +0100
committerMarkus Holtermann <info@markusholtermann.eu>2015-02-23 12:55:43 +0100
commit980dfca7174a3e00a214ad554bb9199529139796 (patch)
treea5c5954377992cace273c243d934c3ec3f281a64 /tests
parented941ef2d0c0560e4eb98e0801e698d18f01d77b (diff)
[1.8.x] Fixed #24366 -- Optimized traversal of large migration dependency graphs.
Switched from an adjancency list and uncached, iterative depth-first search to a Node-based design with direct parent/child links and a cached, recursive depth-first search. With this change, calculating a migration plan for a large graph takes several seconds instead of several hours. Marked test `migrations.test_graph.GraphTests.test_dfs` as an expected failure due to reaching the maximum recursion depth. Backport of 78d43a5e1064b63db1c486516c4263ef1c4c975c from master
Diffstat (limited to 'tests')
-rw-r--r--tests/migrations/test_graph.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/tests/migrations/test_graph.py b/tests/migrations/test_graph.py
index cfb61d355f..50a8314c8b 100644
--- a/tests/migrations/test_graph.py
+++ b/tests/migrations/test_graph.py
@@ -1,3 +1,5 @@
+from unittest import expectedFailure
+
from django.db.migrations.graph import (
CircularDependencyError, MigrationGraph, NodeNotFoundError,
)
@@ -151,7 +153,23 @@ class GraphTests(TestCase):
graph.forwards_plan, ('C', '0001')
)
- def test_dfs(self):
+ def test_deep_graph(self):
+ graph = MigrationGraph()
+ root = ("app_a", "1")
+ graph.add_node(root, None)
+ expected = [root]
+ for i in range(2, 750):
+ parent = ("app_a", str(i - 1))
+ child = ("app_a", str(i))
+ graph.add_node(child, None)
+ graph.add_dependency(str(i), child, parent)
+ expected.append(child)
+
+ actual = graph.node_map[root].descendants()
+ self.assertEqual(expected[::-1], actual)
+
+ @expectedFailure
+ def test_recursion_depth(self):
graph = MigrationGraph()
root = ("app_a", "1")
graph.add_node(root, None)
@@ -163,7 +181,7 @@ class GraphTests(TestCase):
graph.add_dependency(str(i), child, parent)
expected.append(child)
- actual = graph.dfs(root, lambda x: graph.dependents.get(x, set()))
+ actual = graph.node_map[root].descendants()
self.assertEqual(expected[::-1], actual)
def test_plan_invalid_node(self):