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 org.apache.oozie.CoordinatorActionBean; 018 import org.apache.oozie.WorkflowJobBean; 019 import org.apache.oozie.XException; 020 import org.apache.oozie.store.CoordinatorStore; 021 import org.apache.oozie.store.StoreException; 022 import org.apache.oozie.util.XLog; 023 import org.apache.oozie.util.db.SLADbOperations; 024 import org.apache.oozie.client.CoordinatorAction; 025 import org.apache.oozie.client.WorkflowJob; 026 import org.apache.oozie.client.SLAEvent.SlaAppType; 027 import org.apache.oozie.client.SLAEvent.Status; 028 import org.apache.oozie.command.CommandException; 029 030 public class CoordActionUpdateCommand extends CoordinatorCommand<Void> { 031 private final XLog log = XLog.getLog(getClass()); 032 private WorkflowJobBean workflow; 033 private CoordinatorActionBean caction = null; 034 035 public CoordActionUpdateCommand(WorkflowJobBean workflow) { 036 super("coord-action-update", "coord-action-update", 1, XLog.OPS); 037 this.workflow = workflow; 038 } 039 040 @Override 041 protected Void call(CoordinatorStore cstore) throws StoreException, CommandException { 042 try { 043 if (workflow.getStatus() == WorkflowJob.Status.RUNNING 044 || workflow.getStatus() == WorkflowJob.Status.SUSPENDED) { 045 //update lastModifiedTime 046 cstore.updateCoordinatorAction(caction); 047 return null; 048 } 049 // CoordinatorActionBean caction = 050 // cstore.getCoordinatorActionForExternalId(workflow.getId()); 051 Status slaStatus = null; 052 if (caction != null) { 053 if (workflow.getStatus() == WorkflowJob.Status.SUCCEEDED) { 054 caction.setStatus(CoordinatorAction.Status.SUCCEEDED); 055 slaStatus = Status.SUCCEEDED; 056 } 057 else { 058 if (workflow.getStatus() == WorkflowJob.Status.FAILED) { 059 caction.setStatus(CoordinatorAction.Status.FAILED); 060 slaStatus = Status.FAILED; 061 } 062 else { 063 if (workflow.getStatus() == WorkflowJob.Status.KILLED) { 064 caction.setStatus(CoordinatorAction.Status.KILLED); 065 slaStatus = Status.KILLED; 066 } 067 else { 068 log.warn( 069 "Unexpected workflow " + workflow.getId() + " STATUS " + workflow.getStatus()); 070 //update lastModifiedTime 071 cstore.updateCoordinatorAction(caction); 072 return null; 073 } 074 } 075 } 076 077 log.info( 078 "Updating Coordintaor id :" + caction.getId() + "status to =" + caction.getStatus()); 079 cstore.updateCoordinatorAction(caction); 080 if (slaStatus != null) { 081 SLADbOperations.writeStausEvent(caction.getSlaXml(), caction.getId(), cstore, slaStatus, 082 SlaAppType.COORDINATOR_ACTION); 083 } 084 queueCallable(new CoordActionReadyCommand(caction.getJobId())); 085 } 086 } 087 catch (XException ex) { 088 log.warn("CoordActionUpdate Failed ", ex.getMessage()); 089 throw new CommandException(ex); 090 } 091 return null; 092 } 093 094 @Override 095 protected Void execute(CoordinatorStore store) throws StoreException, CommandException { 096 log.info("STARTED CoordActionUpdateCommand for wfId=" + workflow.getId()); 097 caction = store.getCoordinatorActionForExternalId(workflow.getId()); 098 if (caction == null) { 099 log.info("ENDED CoordActionUpdateCommand for wfId=" + workflow.getId() + ", coord action is null"); 100 return null; 101 } 102 setLogInfo(caction); 103 String jobId = caction.getJobId(); 104 try { 105 if (lock(jobId)) { 106 call(store); 107 } 108 else { 109 queueCallable(new CoordActionUpdateCommand(workflow), LOCK_FAILURE_REQUEUE_INTERVAL); 110 log.warn("CoordActionUpdateCommand lock was not acquired - failed JobId=" + jobId + ", wfId=" 111 + workflow.getId() + ". Requeing the same."); 112 } 113 } 114 catch (InterruptedException e) { 115 queueCallable(new CoordActionUpdateCommand(workflow), LOCK_FAILURE_REQUEUE_INTERVAL); 116 log.warn("CoordActionUpdateCommand lock acquiring failed with exception " + e.getMessage() + " for jobId=" 117 + jobId + ", wfId=" + workflow.getId() + ". Requeing the same."); 118 } 119 finally { 120 log.info("ENDED CoordActionUpdateCommand for wfId=" + workflow.getId() + ", jobId=" + jobId); 121 } 122 return null; 123 } 124 }