001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.service;
016
017 import org.apache.hadoop.conf.Configuration;
018 import org.apache.oozie.command.coord.CoordPurgeCommand;
019 import org.apache.oozie.command.wf.PurgeCommand;
020 import org.apache.oozie.service.CallableQueueService;
021 import org.apache.oozie.service.SchedulerService;
022 import org.apache.oozie.service.Service;
023 import org.apache.oozie.service.Services;
024
025 /**
026 * The PurgeService schedules purging of completed jobs and associated action older than a specified age.
027 */
028 public class PurgeService implements Service {
029
030 public static final String CONF_PREFIX = Service.CONF_PREFIX + "PurgeService.";
031 /**
032 * Age of completed jobs to be deleted, in days.
033 */
034 public static final String CONF_OLDER_THAN = CONF_PREFIX + "older.than";
035 public static final String COORD_CONF_OLDER_THAN = CONF_PREFIX + "coord.older.than";
036 /**
037 * Time interval, in seconds, at which the purge jobs service will be scheduled to run.
038 */
039 public static final String CONF_PURGE_INTERVAL = CONF_PREFIX + "purge.interval";
040 private static final String COORD_PURGE_LIMIT = CONF_PREFIX + "coord.purge.limit";
041
042 /**
043 * PurgeRunnable is the runnable which is scheduled to run at the configured interval. PurgeCommand is queued to
044 * remove completed jobs and associated actions older than the configured age.
045 */
046 static class PurgeRunnable implements Runnable {
047 private int olderThan;
048 private int coordOlderThan;
049 private int limit;
050
051 public PurgeRunnable(int olderThan, int coordOlderThan, int limit) {
052 this.olderThan = olderThan;
053 this.coordOlderThan = coordOlderThan;
054 this.limit = limit;
055 }
056
057 public void run() {
058 Services.get().get(CallableQueueService.class).queue(new PurgeCommand(olderThan));
059 Services.get().get(CallableQueueService.class).queue(new CoordPurgeCommand(coordOlderThan, limit));
060 }
061
062 }
063
064 /**
065 * Initializes the {@link PurgeService}.
066 *
067 * @param services services instance.
068 */
069 @Override
070 public void init(Services services) {
071 Configuration conf = services.getConf();
072 Runnable purgeJobsRunnable = new PurgeRunnable(conf.getInt(
073 CONF_OLDER_THAN, 30), conf.getInt(COORD_CONF_OLDER_THAN, 7),
074 conf.getInt(COORD_PURGE_LIMIT, 100));
075 services.get(SchedulerService.class).schedule(purgeJobsRunnable, 10, conf.getInt(CONF_PURGE_INTERVAL, 3600),
076 SchedulerService.Unit.SEC);
077 }
078
079 /**
080 * Destroy the Purge Jobs Service.
081 */
082 @Override
083 public void destroy() {
084 }
085
086 /**
087 * Return the public interface for the purge jobs service.
088 *
089 * @return {@link PurgeService}.
090 */
091 @Override
092 public Class<? extends Service> getInterface() {
093 return PurgeService.class;
094 }
095 }