package com.yahoo.sherlock.scheduler; import com.yahoo.sherlock.settings.CLISettings; import com.yahoo.sherlock.store.JobMetadataAccessor; import com.yahoo.sherlock.store.Store; import com.yahoo.sherlock.utils.BackupUtils; import com.yahoo.sherlock.utils.TimeUtils; import java.io.IOException; import java.time.ZonedDateTime; import lombok.extern.slf4j.Slf4j; /** * Class for redis data back up runnable task. */ @Slf4j public class BackupTask implements Runnable { /** Thread name prefix. */ private static final String THREAD_NAME_PREFIX = "BackupTask-"; /** * {@code JobMetadataAccessor} instance. */ private JobMetadataAccessor jobMetadataAccessor; /** * Constructor for initializing. */ public BackupTask() { jobMetadataAccessor = Store.getJobMetadataAccessor(); } @Override public void run() { try { String name = THREAD_NAME_PREFIX + Thread.currentThread().getName(); log.info("Running thread {}", name); backupRedisDB(TimeUtils.getTimestampMinutes()); } catch (IOException e) { log.error("Error while running backup task!", e); } } /** * Method to backup redis data as redis local dump and (as json dump if specified). * @param timestampMinutes ping timestamp (in minutes) of backup task thread * @throws IOException exception */ public void backupRedisDB(long timestampMinutes) throws IOException { ZonedDateTime date = TimeUtils.zonedDateTimeFromMinutes(timestampMinutes); // save redis snapshot if (date.getMinute() == 0 && date.getHour() == 0) { jobMetadataAccessor.saveRedisJobsMetadata(); // save redis data as json file if path is specified if (CLISettings.BACKUP_REDIS_DB_PATH != null) { BackupUtils.startBackup(); } } } }