Skip to content

Commit cb2024b

Browse files
authored
Merge pull request pandas-dev#532 from manahl/issue-531
Clean orphaned versions before prune (issue pandas-dev#531)
2 parents 88f485b + aa53f6d commit cb2024b

File tree

3 files changed

+51
-8
lines changed

3 files changed

+51
-8
lines changed

CHANGES.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
## Changelog
22

3-
### 1.63
3+
### 1.64
4+
* Bugfix: #531 arctic_prune_versions: clean broken snapshot references before pruning
5+
6+
### 1.63 (2018-04-06)
47
* Bugfix: #521 Clang 6.0 compiler support on macOS
58
* Feature: #510 VersionStore: support multi column in pandas DataFrames
69

arctic/scripts/arctic_prune_versions.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@
1010
logger = logging.getLogger(__name__)
1111

1212

13-
def prune_versions(lib, symbol, keep_mins):
14-
lib._prune_previous_versions(symbol, keep_mins=keep_mins)
13+
def prune_versions(lib, symbols, keep_mins):
14+
logger.info("Fixing snapshot pointers")
15+
lib._cleanup_orphaned_versions(dry_run=False)
16+
for symbol in symbols:
17+
logger.info("Pruning %s" % symbol)
18+
lib._prune_previous_versions(symbol, keep_mins=keep_mins)
1519

1620

1721
def main():
@@ -52,9 +56,7 @@ def main():
5256
symbols = lib.list_symbols(all_symbols=True)
5357
logger.info("Found %s symbols" % len(symbols))
5458

55-
for s in symbols:
56-
logger.info("Pruning %s" % s)
57-
prune_versions(lib, s, opts.keep_mins)
59+
prune_versions(lib, symbols, opts.keep_mins)
5860
logger.info("Done")
5961

6062

tests/integration/scripts/test_prune_versions.py

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import time
2+
13
from mock import patch, ANY, call
24

35
from arctic.auth import Credential
@@ -12,8 +14,7 @@ def test_prune_versions_symbol(mongo_host, library, library_name):
1214
patch('pymongo.database.Database.authenticate', return_value=True):
1315

1416
run_as_main(mpv.main, '--host', mongo_host, '--library', library_name, '--symbols', 'sym1,sym2')
15-
prune_versions.assert_has_calls([call(ANY, 'sym1', 10),
16-
call(ANY, 'sym2', 10), ])
17+
prune_versions.assert_has_calls([call(ANY, ['sym1', 'sym2'], 10)])
1718

1819

1920
def test_prune_versions_full(mongo_host, library, library_name):
@@ -37,3 +38,40 @@ def test_prune_versions_full(mongo_host, library, library_name):
3738
library.delete_snapshot('snap1')
3839
run_as_main(mpv.main, '--host', mongo_host, '--library', library_name, '--keep-mins', 0)
3940
assert [x['version'] for x in library.list_versions('symbol')] == [3]
41+
42+
43+
def test_keep_recent_snapshots(library):
44+
library.write("cherry", "blob")
45+
half_a_day_ago = time.time() - (3600 * 12.)
46+
with patch('time.time', return_value=half_a_day_ago):
47+
library.snapshot("snappy")
48+
library._snapshots.delete_one({"name": "snappy"})
49+
50+
mpv.prune_versions(library, ["cherry"], 10)
51+
52+
assert len(library._versions.find_one({"symbol": "cherry"}).get("parent", [])) == 1
53+
54+
55+
def test_fix_broken_snapshot_references(library):
56+
library.write("cherry", "blob")
57+
one_day_ago = time.time() - (3600 * 24.) - 10 # make sure we are a few seconds before 24 hours
58+
with patch('time.time', return_value=one_day_ago):
59+
library.snapshot("snappy")
60+
library._snapshots.delete_one({"name": "snappy"})
61+
62+
mpv.prune_versions(library, ["cherry"], 10)
63+
64+
assert library._versions.find_one({"symbol": "cherry"}).get("parent", []) == []
65+
66+
67+
def test_keep_only_one_version(library):
68+
library.write("cherry", "blob")
69+
library.write("cherry", "blob")
70+
one_day_ago = time.time() - (3600 * 24.) - 10 # make sure we are a few seconds before 24 hours
71+
with patch('time.time', return_value=one_day_ago):
72+
library.snapshot("snappy")
73+
library._snapshots.delete_one({"name": "snappy"})
74+
75+
mpv.prune_versions(library, ["cherry"], 0)
76+
77+
assert len(list(library._versions.find({"symbol": "cherry"}))) == 1

0 commit comments

Comments
 (0)