8000 new: `put /_admin/compact` (#308) · arangodb/python-arango@cb338b6 · GitHub
[go: up one dir, main page]

Skip to content

Commit cb338b6

Browse files
authored
new: put /_admin/compact (#308)
* new: `Database.compact()` * fix typo * remove useless `compact()` * assert empty `result`
1 parent 8127f33 commit cb338b6

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed

arango/database.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
CollectionCreateError,
2828
CollectionDeleteError,
2929
CollectionListError,
30+
DatabaseCompactError,
3031
DatabaseCreateError,
3132
DatabaseDeleteError,
3233
DatabaseListError,
@@ -441,6 +442,47 @@ def response_handler(resp: Response) -> Json:
441442

442443
return self._execute(request, response_handler)
443444

445+
def compact(
446+
self,
447+
change_level: Optional[bool] = None,
448+
compact_bottom_most_level: Optional[bool] = None,
449+
) -> Result[Json]:
450+
"""Compact all databases.
451+
452+
NOTE: This command can cause a full rewrite of all data in all databases,
453+
which may take very long for large databases. It should thus only be used with
454+
care and only when additional I/O load can be tolerated for a prolonged time.
455+
456+
This method can be used to reclaim disk space after substantial data deletions
457+
have taken place, by compacting the entire database system data.
458+
459+
This method requires superuser access.
460+
461+
:param change_level: Whether or not compacted data should be moved to
462+
the minimum possible level. Default value is False.
463+
:type change_level: bool | None
464+
:param compact_bottom_most_level: Whether or not to compact the
465+
bottom-most level of data. Default value is False.
466+
:type compact_bottom_most_level: bool | None
467+
:return: Collection compact.
468+
:rtype: dict
469+
:raise arango.exceptions.CollectionCompactError: If retrieval fails.
470+
"""
471+
data = {}
472+
if change_level is not None:
473+
data["changeLevel"] = change_level
474+
if compact_bottom_most_level is not None:
475+
data["compactBottomMostLevel"] = compact_bottom_most_level
476+
477+
request = Request(method="put", endpoint="/_admin/compact", data=data)
478+
479+
def response_handler(resp: Response) -> Json:
480+
if resp.is_success:
481+
return format_body(resp.body)
482+
raise DatabaseCompactError(resp, request)
483+
484+
return self._execute(request, response_handler)
485+
444486
def required_db_version(self) -> Result[str]:
445487
"""Return required version of target database.
446488

arango/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ class DatabaseDeleteError(ArangoServerError):
360360
"""Failed to delete database."""
361361

362362

363+
class DatabaseCompactError(ArangoServerError):
364+
"""Failed to compact databases."""
365+
366+
363367
#######################
364368
# Document Exceptions #
365369
#######################

tests/test_database.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
USE_SYSTEM_DATABASE,
1414
)
1515
from arango.exceptions import (
16+
DatabaseCompactError,
1617
DatabaseCreateError,
1718
DatabaseDeleteError,
1819
DatabaseListError,
@@ -37,7 +38,12 @@
3738
from arango.pregel import Pregel
3839
from arango.replication import Replication
3940
from arango.wal import WAL
40-
from tests.helpers import assert_raises, generate_db_name
41+
from tests.helpers import (
42+
assert_raises,
43+
generate_col_name,
44+
generate_db_name,
45+
generate_jwt,
46+
)
4147

4248

4349
def test_database_attributes(db, username):
@@ -57,7 +63,7 @@ def test_database_attributes(db, username):
5763
assert isinstance(db.wal, WAL)
5864

5965

60-
def test_database_misc_methods(sys_db, db, bad_db, cluster):
66+
def test_database_misc_methods(client, sys_db, db, bad_db, cluster, secret):
6167
# Test get properties
6268
properties = db.properties()
6369
assert "id" in properties
@@ -279,6 +285,18 @@ def test_database_misc_methods(sys_db, db, bad_db, cluster):
279285
bad_db.engine()
280286
assert err.value.error_code in {11, 1228}
281287

288+
# Test database compact
289+
with assert_raises(DatabaseCompactError) as err:
290+
db.compact()
291+
292+
collection = db.create_collection(generate_col_name())
293+
collection.insert({"foo": "bar"})
294+
295+
token = generate_jwt(secret)
296+
db_superuser = client.db(db.name, superuser_token=token)
297+
result = db_superuser.compact()
298+
assert result == {}
299+
282300

283301
def test_database_management(db, sys_db, bad_db):
284302
# Test list databases

0 commit comments

Comments
 (0)
0