/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gobblin.compliance.retention; import com.google.common.base.Preconditions; import gobblin.compliance.ComplianceConfigurationKeys; import gobblin.compliance.HivePartitionDataset; import gobblin.compliance.HivePartitionVersion; import gobblin.compliance.HivePartitionVersionPolicy; import gobblin.configuration.State; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; /** * A retention version policy for the {@link HivePartitionRetentionVersion}. * * @author adsharma */ @Slf4j public class HivePartitionVersionRetentionCleanerPolicy extends HivePartitionVersionPolicy { /** * Maximum number of backups to be retained. */ private int backupRetentionVersions; /** * Maximum age for a retained backup. */ private int backupRetentionDays; /** * Maximum age for a retained trash partition. */ private int trashRetentionDays; public HivePartitionVersionRetentionCleanerPolicy(State state, HivePartitionDataset dataset) { super(state, dataset); Preconditions.checkArgument(this.state.contains(ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_VERSIONS), "Missing required property " + ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_VERSIONS); Preconditions.checkArgument(this.state.contains(ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_DAYS), "Missing required property " + ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_DAYS); Preconditions.checkArgument(this.state.contains(ComplianceConfigurationKeys.CLEANER_TRASH_RETENTION_DAYS), "Missing required property " + ComplianceConfigurationKeys.CLEANER_TRASH_RETENTION_DAYS); this.backupRetentionVersions = this.state.getPropAsInt(ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_VERSIONS); this.backupRetentionDays = this.state.getPropAsInt(ComplianceConfigurationKeys.CLEANER_BACKUP_RETENTION_DAYS); this.trashRetentionDays = this.state.getPropAsInt(ComplianceConfigurationKeys.CLEANER_TRASH_RETENTION_DAYS); } @Override public boolean shouldSelect(HivePartitionVersion version) { // not implemented by this class return false; } @Override public List<HivePartitionVersion> selectedList(List<HivePartitionVersion> versions) { if (versions.isEmpty()) { return versions; } List<HivePartitionRetentionVersion> backupVersions = new ArrayList<>(); List<HivePartitionRetentionVersion> trashVersions = new ArrayList<>(); List<HivePartitionVersion> selectedVersions = new ArrayList<>(); for (HivePartitionVersion version : versions) { String prefix = this.dataset.getDbName() + ComplianceConfigurationKeys.DBNAME_SEPARATOR; if (!version.getTableName().startsWith(prefix)) { continue; } if (version.getTableName().contains(ComplianceConfigurationKeys.BACKUP)) { backupVersions.add((HivePartitionRetentionVersion) version); } if (version.getTableName().contains(ComplianceConfigurationKeys.TRASH)) { trashVersions.add((HivePartitionRetentionVersion) version); } } for (HivePartitionRetentionVersion version : trashVersions) { long ageInDays = TimeUnit.MILLISECONDS.toDays(version.getAgeInMilliSeconds()); if (ageInDays >= this.trashRetentionDays) { selectedVersions.add(version); } } if (backupVersions.isEmpty()) { return selectedVersions; } Collections.sort(backupVersions); selectedVersions.addAll(backupVersions.subList(this.backupRetentionVersions, versions.size())); if (this.backupRetentionVersions == 0) { return selectedVersions; } for (HivePartitionRetentionVersion version : backupVersions.subList(0, this.backupRetentionVersions)) { long ageInDays = TimeUnit.MILLISECONDS.toDays(version.getAgeInMilliSeconds()); if (ageInDays >= this.backupRetentionDays) { selectedVersions.add(version); } } return selectedVersions; } }