diff --git a/src/box/read_view.c b/src/box/read_view.c
index c5cdf169cb6c6c9cd07966eb8e40995fc333fffd..c9abf4ae829e26f69df5973c1dff34f4359997ec 100644
--- a/src/box/read_view.c
+++ b/src/box/read_view.c
@@ -126,6 +126,7 @@ read_view_open(struct read_view *rv, const struct read_view_opts *opts)
 			engine_create_read_view(engine);
 		if (engine_rv == NULL)
 			goto fail;
+		rlist_add_tail_entry(&rv->engines, engine_rv, link);
 	}
 	struct read_view_add_space_cb_arg add_space_cb_arg = {
 		.rv = rv,
diff --git a/test/box-luatest/memtx_gc_after_snapshot_test.lua b/test/box-luatest/memtx_gc_after_snapshot_test.lua
new file mode 100644
index 0000000000000000000000000000000000000000..c63d9b58b520578e600c9ac5707d2fd8d17e3c68
--- /dev/null
+++ b/test/box-luatest/memtx_gc_after_snapshot_test.lua
@@ -0,0 +1,38 @@
+local server = require('test.luatest_helpers.server')
+local t = require('luatest')
+local g = t.group()
+
+g.before_all = function(cg)
+    cg.server = server:new({alias = 'master'})
+    cg.server:start()
+end
+
+g.after_all = function(cg)
+    cg.server:stop()
+end
+
+-- Checks that memtx tuple garbage collection is resumed after snapshot.
+g.test_memtx_gc_after_snapshot = function(cg)
+    cg.server:exec(function()
+        local t = require('luatest')
+        box.schema.space.create('test')
+        box.space.test:create_index('primary')
+        local mem_used_1 = box.info.memory().data
+        box.begin()
+        for i = 1, 100 do
+            box.space.test:insert({i, string.rep('x', 10000)})
+        end
+        box.commit()
+        local mem_used_2 = box.info.memory().data
+        t.assert_gt(mem_used_2 - mem_used_1, 1000000)
+        box.snapshot()
+        box.begin()
+        for i = 1, 100 do
+            box.space.test:delete(i)
+        end
+        box.commit()
+        collectgarbage('collect') -- drop Lua refs
+        local mem_used_3 = box.info.memory().data
+        t.assert_gt(mem_used_2 - mem_used_3, 1000000)
+    end)
+end