From fb65bb3967549910b0b9ad7e7f8ebc713a2ecc43 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Sun, 11 Nov 2018 23:11:30 +0200 Subject: [PATCH] state: add workaround for VACUUM bug on python 3.6 (#1315) Fixes #1314 Signed-off-by: Ruslan Kuprieiev --- dvc/state.py | 8 +++++++- tests/test_state.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/dvc/state.py b/dvc/state.py index dded8444f..dcb95c34b 100644 --- a/dvc/state.py +++ b/dvc/state.py @@ -190,6 +190,12 @@ class State(object): else: raise + def _vacuum(self): + # NOTE: see https://bugs.python.org/issue28518 + self.db.isolation_level = None + self._execute("VACUUM") + self.db.isolation_level = '' + def dump(self): assert self.db is not None @@ -213,7 +219,7 @@ class State(object): self.STATE_TABLE, delete)) - self._execute("VACUUM") + self._vacuum() cmd = "SELECT COUNT(*) FROM {}" diff --git a/tests/test_state.py b/tests/test_state.py index fa7894db2..94e90c19d 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -5,6 +5,7 @@ import time from dvc.system import System from dvc.state import State from dvc.utils import file_md5 +from dvc.main import main from tests.basic_env import TestDvc @@ -39,3 +40,20 @@ class TestState(TestDvc): entry_md5 = state.update(path) self.assertEqual(entry_md5, md5) + + +class TestStateOverflow(TestDvc): + def test(self): + # NOTE: trying to add more entries than state can handle, + # to see if it will clean up and vacuum successfully + ret = main(['config', 'state.row_limit', '10']) + self.assertEqual(ret, 0) + + dname = 'dir' + os.mkdir(dname) + for i in range(20): + with open(os.path.join(dname, str(i)), 'w+') as fobj: + fobj.write(str(i)) + + ret = main(['add', 'dir']) + self.assertEqual(ret, 0)