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.command.coord; 016 017 import java.sql.Timestamp; 018 019 import org.apache.oozie.CoordinatorJobBean; 020 import org.apache.oozie.client.CoordinatorJob; 021 import org.apache.oozie.command.CommandException; 022 import org.apache.oozie.store.CoordinatorStore; 023 import org.apache.oozie.store.StoreException; 024 import org.apache.oozie.util.DateUtils; 025 import org.apache.oozie.util.XLog; 026 027 public class CoordJobMatLookupCommand extends CoordinatorCommand<Void> { 028 private final XLog log = XLog.getLog(getClass()); 029 private int materializationWindow; 030 private String jobId; 031 032 public CoordJobMatLookupCommand(String id, int materializationWindow) { 033 super("materialization_lookup", "materialization_lookup", 1, XLog.STD); 034 this.jobId = id; 035 this.materializationWindow = materializationWindow; 036 } 037 038 @Override 039 protected Void call(CoordinatorStore store) throws StoreException, CommandException { 040 //CoordinatorJobBean coordJob = store.getCoordinatorJob(jobId, true); 041 CoordinatorJobBean coordJob = store.getEntityManager().find(CoordinatorJobBean.class, jobId); 042 setLogInfo(coordJob); 043 044 if (!(coordJob.getStatus() == CoordinatorJobBean.Status.PREP || coordJob.getStatus() == CoordinatorJobBean.Status.RUNNING)) { 045 log.debug("CoordJobMatLookupCommand for jobId=" + jobId + " job is not in PREP or RUNNING but in " 046 + coordJob.getStatus()); 047 return null; 048 } 049 050 if (coordJob.getNextMaterializedTimestamp() != null 051 && coordJob.getNextMaterializedTimestamp().compareTo(coordJob.getEndTimestamp()) >= 0) { 052 log.debug("CoordJobMatLookupCommand for jobId=" + jobId + " job is already materialized"); 053 return null; 054 } 055 056 if (coordJob.getNextMaterializedTimestamp() != null 057 && coordJob.getNextMaterializedTimestamp().compareTo(new Timestamp(System.currentTimeMillis())) >= 0) { 058 log.debug("CoordJobMatLookupCommand for jobId=" + jobId + " job is already materialized"); 059 return null; 060 } 061 062 Timestamp startTime = coordJob.getNextMaterializedTimestamp(); 063 if (startTime == null) { 064 startTime = coordJob.getStartTimestamp(); 065 } 066 // calculate end time by adding materializationWindow to start time. 067 // need to convert materializationWindow from secs to milliseconds 068 long startTimeMilli = startTime.getTime(); 069 long endTimeMilli = startTimeMilli + (materializationWindow * 1000); 070 Timestamp endTime = new Timestamp(endTimeMilli); 071 // if MaterializationWindow end time is greater than endTime 072 // for job, then set it to endTime of job 073 Timestamp jobEndTime = coordJob.getEndTimestamp(); 074 if (endTime.compareTo(jobEndTime) > 0) { 075 endTime = jobEndTime; 076 } 077 // update status of job from PREP or RUNNING to PREMATER in coordJob 078 coordJob.setStatus(CoordinatorJob.Status.PREMATER); 079 store.updateCoordinatorJobStatus(coordJob); 080 081 log.debug("Materializing coord job id=" + jobId + ", start=" + DateUtils.toDate(startTime) + ", end=" + DateUtils.toDate(endTime) 082 + ", window=" + materializationWindow + ", status=PREMATER"); 083 queueCallable(new CoordActionMaterializeCommand(jobId, DateUtils.toDate(startTime), DateUtils.toDate(endTime)), 084 100); 085 return null; 086 } 087 088 @Override 089 protected Void execute(CoordinatorStore store) throws StoreException, CommandException { 090 log.info("STARTED CoordJobMatLookupCommand jobId=" + jobId + ", materializationWindow=" 091 + materializationWindow); 092 try { 093 if (lock(jobId)) { 094 call(store); 095 } 096 else { 097 queueCallable(new CoordJobMatLookupCommand(jobId, materializationWindow), LOCK_FAILURE_REQUEUE_INTERVAL); 098 log.warn("CoordJobMatLookupCommand lock was not acquired - failed jobId=" + jobId 099 + ". Requeing the same."); 100 } 101 } 102 catch (InterruptedException e) { 103 queueCallable(new CoordJobMatLookupCommand(jobId, materializationWindow), LOCK_FAILURE_REQUEUE_INTERVAL); 104 log.warn("CoordJobMatLookupCommand lock acquiring failed with exception " + e.getMessage() + " for jobId=" 105 + jobId + " Requeing the same."); 106 } 107 finally { 108 log.info("ENDED CoordJobMatLookupCommand jobId=" + jobId + ", materializationWindow=" 109 + materializationWindow); 110 } 111 return null; 112 } 113 }