Add --purge helper flag to archive_deleted_rows

Since many people will want to fully purge shadow table data after archiving,
this adds a --purge flag to archive_deleted_rows which will automatically do
a full db purge when complete.

Related to blueprint purge-db

Change-Id: Ibd824a77b32cbceb60973a89a93ce09fe6d1050d
This commit is contained in:
Dan Smith 2018-03-06 09:44:38 -08:00
parent 83caaae547
commit ff47787e11
4 changed files with 26 additions and 6 deletions

View File

@ -60,7 +60,7 @@ Nova Database
determined by ``[database]/connection`` in the configuration file passed to
nova-manage.
``nova-manage db archive_deleted_rows [--max_rows <number>] [--verbose] [--until-complete]``
``nova-manage db archive_deleted_rows [--max_rows <number>] [--verbose] [--until-complete] [--purge]``
Move deleted rows from production tables to shadow tables. Note that the
corresponding rows in the instance_mappings and request_specs tables of the
@ -68,7 +68,10 @@ Nova Database
--verbose will print the results of the archive operation for any tables that
were changed. Specifying --until-complete will make the command run
continuously until all deleted rows are archived. Use the --max_rows option,
which defaults to 1000, as a batch size for each iteration.
which defaults to 1000, as a batch size for each iteration. Specifying --purge
will cause a `full` DB purge to be completed after archival. If a date range
is desired for the purge, then run ``nova-manage db purge --before
<date>`` manually after archiving is complete.
``nova-manage db purge [--all] [--before <date>] [--verbose]``

View File

@ -488,8 +488,10 @@ Error: %s""") % six.text_type(e))
default=False,
help=('Run continuously until all deleted rows are archived. Use '
'max_rows as a batch size for each iteration.'))
@args('--purge', action='store_true', dest='purge', default=False,
help='Purge all data from shadow tables after archive completes')
def archive_deleted_rows(self, max_rows=1000, verbose=False,
until_complete=False):
until_complete=False, purge=False):
"""Move deleted rows from production tables to shadow tables.
Returns 0 if nothing was archived, 1 if some number of rows were
@ -544,6 +546,12 @@ Error: %s""") % six.text_type(e))
dict_value=_('Number of Rows Archived'))
else:
print(_('Nothing was archived.'))
if table_to_rows_archived and purge:
if verbose:
print(_('Rows were archived, running purge...'))
self.purge(purge_all=True, verbose=verbose)
# NOTE(danms): Return nonzero if we archived something
return int(bool(table_to_rows_archived))

View File

@ -447,15 +447,18 @@ Archiving.....complete
def test_archive_deleted_rows_until_complete_quiet(self):
self.test_archive_deleted_rows_until_complete(verbose=False)
@mock.patch('nova.db.sqlalchemy.api.purge_shadow_tables')
@mock.patch.object(db, 'archive_deleted_rows')
def test_archive_deleted_rows_until_stopped(self, mock_db_archive,
mock_db_purge,
verbose=True):
mock_db_archive.side_effect = [
({'instances': 10, 'instance_extra': 5}, list()),
({'instances': 5, 'instance_faults': 1}, list()),
KeyboardInterrupt]
result = self.commands.archive_deleted_rows(20, verbose=verbose,
until_complete=True)
until_complete=True,
purge=True)
self.assertEqual(1, result)
if verbose:
expected = """\
@ -467,6 +470,7 @@ Archiving.....stopped
| instance_faults | 1 |
| instances | 15 |
+-----------------+-------------------------+
Rows were archived, running purge...
"""
else:
expected = ''
@ -475,15 +479,18 @@ Archiving.....stopped
mock_db_archive.assert_has_calls([mock.call(20),
mock.call(20),
mock.call(20)])
mock_db_purge.assert_called_once_with(None, status_fn=mock.ANY)
def test_archive_deleted_rows_until_stopped_quiet(self):
self.test_archive_deleted_rows_until_stopped(verbose=False)
@mock.patch.object(db, 'archive_deleted_rows', return_value=({}, []))
def test_archive_deleted_rows_verbose_no_results(self, mock_db_archive):
result = self.commands.archive_deleted_rows(20, verbose=True)
result = self.commands.archive_deleted_rows(20, verbose=True,
purge=True)
mock_db_archive.assert_called_once_with(20)
output = self.output.getvalue()
# If nothing was archived, there should be no purge messages
self.assertIn('Nothing was archived.', output)
self.assertEqual(0, result)

View File

@ -2,4 +2,6 @@
features:
- |
The nova-manage command now has a 'db purge' command that will delete data
from the shadow tables after 'db archive_deleted_rows' has been run.
from the shadow tables after 'db archive_deleted_rows' has been run. There
is also now a ``--purge`` option for 'db archive_deleted_rows' that will
automatically do a full purge after archiving.