Skip to content
Snippets Groups Projects
Commit e8c2aaf9 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#9 - perform database vaccum after deletion

parent ad6c776f
No related branches found
No related tags found
No related merge requests found
...@@ -184,5 +184,9 @@ def get_total_number_of_measurements(db: Session) -> List[int]: ...@@ -184,5 +184,9 @@ def get_total_number_of_measurements(db: Session) -> List[int]:
return db.query(Models.Measurement).count() return db.query(Models.Measurement).count()
def perform_vacuum(db: Session):
db.execute('VACUUM')
def __get_current_datetime(): def __get_current_datetime():
return datetime.strftime(datetime.now(), DATE_FORMAT) return datetime.strftime(datetime.now(), DATE_FORMAT)
...@@ -14,6 +14,8 @@ LOGGER = logging.getLogger(Constants.APP_NAME) ...@@ -14,6 +14,8 @@ LOGGER = logging.getLogger(Constants.APP_NAME)
class DatabaseCleaner: class DatabaseCleaner:
MIN_DATE = datetime(year=1970, month=1, day=1).date() MIN_DATE = datetime(year=1970, month=1, day=1).date()
DATE_FORMAT = "%Y-%m-%d"
def __init__(self, retentionPolicies: List[RetentionPolicy], forceBackupAfterCleanup: bool): def __init__(self, retentionPolicies: List[RetentionPolicy], forceBackupAfterCleanup: bool):
self._policies = retentionPolicies self._policies = retentionPolicies
self._forceBackupAfterCleanup = forceBackupAfterCleanup self._forceBackupAfterCleanup = forceBackupAfterCleanup
...@@ -28,10 +30,11 @@ class DatabaseCleaner: ...@@ -28,10 +30,11 @@ class DatabaseCleaner:
allSensors = Crud.get_sensors(db, skip=0, limit=1000000) allSensors = Crud.get_sensors(db, skip=0, limit=1000000)
for sensor in allSensors: for sensor in allSensors:
LOGGER.debug(f'Cleaning measurements for sensor "{sensor.name}" '
f'(id: {sensor.id}, device_id: {sensor.device_id})')
self._cleanup_measurements_for_sensor(sensor, db, policy, policyStart) self._cleanup_measurements_for_sensor(sensor, db, policy, policyStart)
LOGGER.debug('Performing database vacuum...')
Crud.perform_vacuum(db)
LOGGER.info('Database cleanup done') LOGGER.info('Database cleanup done')
if self._forceBackupAfterCleanup: if self._forceBackupAfterCleanup:
...@@ -45,10 +48,13 @@ class DatabaseCleaner: ...@@ -45,10 +48,13 @@ class DatabaseCleaner:
return return
minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date() minDate = datetime.strptime(firstMeasurement.timestamp, Crud.DATE_FORMAT).date()
LOGGER.debug(f'Cleaning measurements for sensor "{sensor.name}" '
f'from now to {minDate.strftime(DatabaseCleaner.DATE_FORMAT)} '
f'(id: {sensor.id}, device_id: {sensor.device_id})')
processedDate = policyStart processedDate = policyStart
while processedDate > minDate: while processedDate > minDate:
LOGGER.debug(f'Cleaning {processedDate.strftime("%Y-%m-%d")}...') LOGGER.debug(f'Cleaning {processedDate.strftime(DatabaseCleaner.DATE_FORMAT)}...')
DatabaseCleaner._cleanup_measurements_for_day(db, processedDate, policy, sensor.id) DatabaseCleaner._cleanup_measurements_for_day(db, processedDate, policy, sensor.id)
processedDate = processedDate - timedelta(days=1) processedDate = processedDate - timedelta(days=1)
......
...@@ -35,13 +35,15 @@ async def databaseInfo(db: Session = Depends(get_database)): ...@@ -35,13 +35,15 @@ async def databaseInfo(db: Session = Depends(get_database)):
async def databaseCleanup(db: Session = Depends(get_database)): async def databaseCleanup(db: Session = Depends(get_database)):
infoBefore = DatabaseInfoProvider.get_database_info(db) infoBefore = DatabaseInfoProvider.get_database_info(db)
retentionPolicies = SETTINGS['database']['cleanup']['retentionPolicies'] cleanupSettings = SETTINGS['database']['cleanup']
retentionPolicies = cleanupSettings['retentionPolicies']
policies = [] policies = []
for item in retentionPolicies: for item in retentionPolicies:
policies.append(RetentionPolicy(numberOfMeasurementsPerDay=item['numberOfMeasurementsPerDay'], policies.append(RetentionPolicy(numberOfMeasurementsPerDay=item['numberOfMeasurementsPerDay'],
ageInDays=item['ageInDays'])) ageInDays=item['ageInDays']))
DatabaseCleaner(policies).clean(db, datetime.now().date()) DatabaseCleaner(policies, cleanupSettings['forceBackupAfterCleanup']).clean(db, datetime.now().date())
infoAfter = DatabaseInfoProvider.get_database_info(db) infoAfter = DatabaseInfoProvider.get_database_info(db)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment