java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java | 93 +++++----
java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java | 98 +++++-----
java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml | 4
java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java | 37 +--
java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml | 12 +
java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java | 36 ++-
java/code/src/com/redhat/rhn/taskomatic/task/ClearLogHistory.java | 80 ++++++++
java/code/src/com/redhat/rhn/taskomatic/task/RhnExtCmdJob.java | 68 ++++++
java/code/src/com/redhat/rhn/taskomatic/task/RhnJavaJob.java | 50 +++++
java/code/src/com/redhat/rhn/taskomatic/task/RhnJob.java | 17 +
java/code/src/com/redhat/rhn/taskomatic/task/RhnJobAppender.java | 65 ++++++
java/code/src/com/redhat/rhn/taskomatic/task/SatSyncTask.java | 14 -
schema/spacewalk/common/data/rhnTaskoBunch.sql | 3
schema/spacewalk/common/data/rhnTaskoTask.sql | 3
schema/spacewalk/common/data/rhnTaskoTemplate.sql | 7
15 files changed, 453 insertions(+), 134 deletions(-)
New commits:
commit eb826c50e3dcf22de6307af427f5d2b742152144
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 30 14:44:17 2010 +0200
update SatSyncTask task
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/SatSyncTask.java
b/java/code/src/com/redhat/rhn/taskomatic/task/SatSyncTask.java
index 42961f9..95f9c05 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/task/SatSyncTask.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/SatSyncTask.java
@@ -14,9 +14,7 @@
*/
package com.redhat.rhn.taskomatic.task;
-import com.redhat.rhn.manager.satellite.SystemCommandExecutor;
-
-import org.quartz.Job;
+import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
@@ -25,7 +23,9 @@ import org.quartz.JobExecutionException;
* SatSyncTask
* @version $Rev$
*/
-public class SatSyncTask implements Job {
+public class SatSyncTask extends RhnExtCmdJob {
+
+ private Logger log = getLogger(SatSyncTask.class);
/**
* {@inheritDoc}
@@ -36,10 +36,6 @@ public class SatSyncTask implements Job {
args[1] = "satellite-sync";
args[2] = "-l";
- SystemCommandExecutor ce = new SystemCommandExecutor();
- ce.execute(args);
-
- ctx.getJobDetail().getJobDataMap().put("stdOutput",
ce.getLastCommandOutput());
- ctx.getJobDetail().getJobDataMap().put("stdError",
ce.getLastCommandErrorMessage());
+ executeExtCmd(args);
}
}
commit c3e2f0589883f0af323ae630f59fb93b5d3169ac
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 30 14:40:19 2010 +0200
adding ClearLogHistory satellite task
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/ClearLogHistory.java
b/java/code/src/com/redhat/rhn/taskomatic/task/ClearLogHistory.java
new file mode 100644
index 0000000..8c65ecd
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/ClearLogHistory.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.taskomatic.task;
+
+import com.redhat.rhn.common.localization.LocalizationService;
+import com.redhat.rhn.taskomatic.TaskoFactory;
+import com.redhat.rhn.taskomatic.TaskoRun;
+import com.redhat.rhn.taskomatic.TaskoSchedule;
+
+import org.apache.log4j.Logger;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * ClearRunHistory
+ * @version $Rev$
+ */
+public class ClearLogHistory extends RhnJavaJob {
+ private Logger log = getLogger(ClearLogHistory.class);
+ /**
+ * {@inheritDoc}
+ * @throws InvalidParamException
+ */
+ public void execute(JobExecutionContext context)
+ throws JobExecutionException {
+ Integer days = null;
+ try {
+ days = context.getJobDetail().getJobDataMap().getInt("days");
+ }
+ catch (java.lang.ClassCastException cce) {
+ // do nothing, days stays unset
+ }
+ if (days == null) {
+ throw new JobExecutionException("Invalid argument: days");
+ }
+ Calendar now = Calendar.getInstance();
+ now.add(Calendar.DATE, -days);
+ now.set(Calendar.HOUR_OF_DAY, 0);
+ now.set(Calendar.MINUTE, 0);
+ now.set(Calendar.SECOND, 0);
+ now.set(Calendar.MILLISECOND, 0);
+ Date limitTime = now.getTime();
+
+ log.info("Clearing log history older than: " +
+ LocalizationService.getInstance().formatCustomDate(limitTime));
+ // loop accross all the orgs
+ List<TaskoRun> runList = TaskoFactory.listRunsOlderThan(limitTime);
+ for (TaskoRun run : runList) {
+ // delete history of runs
+ TaskoFactory.deleteLogFiles(run);
+ TaskoFactory.delete(run);
+ }
+
+ // delete outdated schedules
+ List<TaskoSchedule> scheduleList =
TaskoFactory.listSchedulesOlderThan(limitTime);
+ for (TaskoSchedule schedule : scheduleList) {
+ Date endTime = schedule.getActiveTill();
+ if (TaskoFactory.listRunsBySchedule(schedule.getId()).isEmpty()) {
+ TaskoFactory.delete(schedule);
+ }
+ }
+ }
+}
diff --git a/schema/spacewalk/common/data/rhnTaskoBunch.sql
b/schema/spacewalk/common/data/rhnTaskoBunch.sql
index 9f83e28..b833a76 100644
--- a/schema/spacewalk/common/data/rhnTaskoBunch.sql
+++ b/schema/spacewalk/common/data/rhnTaskoBunch.sql
@@ -20,4 +20,7 @@ INSERT INTO rhnTaskoBunch (id, name, description, org_bunch,
active_from)
INSERT INTO rhnTaskoBunch (id, name, description, org_bunch, active_from)
VALUES (rhn_tasko_bunch_id_seq.nextval, 'sat-sync', 'sat-sync
description', 'Y', sysdate);
+INSERT INTO rhnTaskoBunch (id, name, description, org_bunch, active_from)
+ VALUES (rhn_tasko_bunch_id_seq.nextval, 'clear-tasko-log-history',
'Clears taskomatic run log history', '', sysdate);
+
commit;
diff --git a/schema/spacewalk/common/data/rhnTaskoTask.sql
b/schema/spacewalk/common/data/rhnTaskoTask.sql
index fb4d0fc..7d6e07e 100644
--- a/schema/spacewalk/common/data/rhnTaskoTask.sql
+++ b/schema/spacewalk/common/data/rhnTaskoTask.sql
@@ -68,4 +68,7 @@ INSERT INTO rhnTaskoTask (id, name, class)
INSERT INTO rhnTaskoTask (id, name, class)
VALUES (rhn_tasko_task_id_seq.nextval, 'sat-cert-check',
'com.redhat.rhn.taskomatic.task.SatelliteCertificateCheck');
+INSERT INTO rhnTaskoTask (id, name, class)
+ VALUES (rhn_tasko_task_id_seq.nextval, 'clear-log-history',
'com.redhat.rhn.taskomatic.task.ClearLogHistory');
+
commit;
diff --git a/schema/spacewalk/common/data/rhnTaskoTemplate.sql
b/schema/spacewalk/common/data/rhnTaskoTemplate.sql
index 2f6b351..903009f 100644
--- a/schema/spacewalk/common/data/rhnTaskoTemplate.sql
+++ b/schema/spacewalk/common/data/rhnTaskoTemplate.sql
@@ -34,4 +34,11 @@ INSERT INTO rhnTaskoTemplate (id, bunch_id, task_id, ordering,
start_if)
(SELECT id FROM rhnTaskoTask WHERE
name='satellite-sync'),
0,
'');
+
+INSERT INTO rhnTaskoTemplate (id, bunch_id, task_id, ordering, start_if)
+ VALUES (rhn_tasko_template_id_seq.nextval,
+ (SELECT id FROM rhnTaskoBunch WHERE
name='clear-tasko-log-history'),
+ (SELECT id FROM rhnTaskoTask WHERE
name='clear-log-history'),
+ 0,
+ '');
commit;
commit d1871887c80cc00db6ef1ef11bb858505002adba
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 30 14:39:40 2010 +0200
make satellite tasks working
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
index c39f04b..91986b7 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoFactory.java
@@ -16,12 +16,13 @@ package com.redhat.rhn.taskomatic;
import com.redhat.rhn.common.hibernate.HibernateFactory;
+import com.redhat.rhn.taskomatic.core.SchedulerKernel;
import org.apache.log4j.Logger;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
@@ -52,6 +53,13 @@ public class TaskoFactory extends HibernateFactory {
"TaskoBunch.lookupOrgBunchByName",
params);
}
+ public static TaskoBunch lookupSatBunchByName(String bunchName) {
+ Map params = new HashMap();
+ params.put("name", bunchName);
+ return (TaskoBunch) singleton.lookupObjectByNamedQuery(
+ "TaskoBunch.lookupSatBunchByName",
params);
+ }
+
public static TaskoTemplate lookupTemplateByBunchAndOrder(Long bunchId, Long order)
{
Map params = new HashMap();
params.put("bunch_id", bunchId);
@@ -104,20 +112,27 @@ public class TaskoFactory extends HibernateFactory {
"TaskoTask.listTasks", new HashMap());
}
- public static List<TaskoRun> listRunsOlderThan(Integer orgId, Date limitTime)
{
+ public static List<TaskoRun> listRunsOlderThan(Date limitTime) {
Map params = new HashMap();
- params.put("org_id", orgId);
params.put("limit_time", limitTime);
return (List<TaskoRun>) singleton.listObjectsByNamedQuery(
"TaskoRun.listOlderThan", params);
}
+ public static List<TaskoRun> listOrgRunsOlderThan(Integer orgId, Date
limitTime) {
+ Map params = new HashMap();
+ params.put("org_id", orgId);
+ params.put("limit_time", limitTime);
+ return (List<TaskoRun>) singleton.listObjectsByNamedQuery(
+ "TaskoRun.listOrgRunsOlderThan", params);
+ }
+
public static void clearOrgRunHistory(Integer orgId, Date limitTime)
throws InvalidParamException {
if (limitTime == null) {
throw new InvalidParamException("Invalid limit date");
}
- List<TaskoRun> runList = listRunsOlderThan(orgId, limitTime);
+ List<TaskoRun> runList = listOrgRunsOlderThan(orgId, limitTime);
for (TaskoRun run : runList) {
// delete history of runs
TaskoFactory.deleteLogFiles(run);
@@ -158,20 +173,32 @@ public class TaskoFactory extends HibernateFactory {
public static List<TaskoSchedule> listActiveSchedulesByOrg(Integer orgId) {
Map params = new HashMap();
- params.put("org_id", orgId);
params.put("timestamp", new Date()); // use server time, not DB
time
- return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
+ if (orgId == null) {
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.listActiveInSat", params);
+ }
+ else {
+ params.put("org_id", orgId);
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
"TaskoSchedule.listActiveByOrg", params);
+ }
}
public static List<TaskoSchedule> listActiveSchedulesByOrgAndLabel(Integer
orgId,
String jobLabel) {
Map params = new HashMap();
- params.put("org_id", orgId);
params.put("job_label", jobLabel);
params.put("timestamp", new Date()); // use server time, not DB
time
- return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
- "TaskoSchedule.listActiveByOrgAndLabel", params);
+ if (orgId == null) {
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.listActiveInSatByLabel", params);
+ }
+ else {
+ params.put("org_id", orgId);
+ return (List<TaskoSchedule>) singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.listActiveByOrgAndLabel", params);
+ }
}
public static TaskoSchedule lookupScheduleById(Long scheduleId) {
@@ -195,6 +222,13 @@ public class TaskoFactory extends HibernateFactory {
"TaskoRun.listBySchedule", params);
}
+ public static List<TaskoSchedule> listSchedulesOlderThan(Date limitTime) {
+ Map params = new HashMap();
+ params.put("limit_time", limitTime);
+ return singleton.listObjectsByNamedQuery(
+ "TaskoSchedule.listOlderThan", params);
+ }
+
public static List<TaskoSchedule> listSchedulesByOrgAndBunch(Integer orgId,
TaskoBunch bunch) {
Map params = new HashMap();
@@ -220,34 +254,6 @@ public class TaskoFactory extends HibernateFactory {
"TaskoRun.lookupById", params);
}
- public static Boolean isTaskParalelizable(TaskoTask task) {
- Class taskClass;
- try {
- taskClass = Class.forName(task.getTaskClass());
- Method isParallelizableMethod =
taskClass.getMethod("isParallelizable",
- (Class[]) null);
- return (Boolean) isParallelizableMethod.invoke(null, (Object[]) null);
- }
- catch (ClassNotFoundException e) {
- return false;
- }
- catch (SecurityException e) {
- return false;
- }
- catch (NoSuchMethodException e) {
- return false;
- }
- catch (IllegalArgumentException e) {
- return false;
- }
- catch (IllegalAccessException e) {
- return false;
- }
- catch (InvocationTargetException e) {
- return false;
- }
- }
-
public static TaskoRun getRunByOrgAndId(Integer orgId, Long runId)
throws InvalidParamException {
TaskoRun run = lookupRunById(runId);
@@ -277,4 +283,15 @@ public class TaskoFactory extends HibernateFactory {
}
return runs;
}
+
+ public static void unscheduleTrigger(Trigger trigger) {
+ try {
+ log.warn("Removing trigger " + trigger.getGroup() + "." +
trigger.getName());
+ SchedulerKernel.getScheduler().unscheduleJob(trigger.getName(),
+ trigger.getGroup());
+ }
+ catch (SchedulerException e) {
+ // be silent
+ }
+ }
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
index f3b4058..852d8ef 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.hbm.xml
@@ -46,6 +46,10 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
</query>
<query name="TaskoRun.listOlderThan">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE endTime <
:limit_time]]>
+ </query>
+
+ <query name="TaskoRun.listOrgRunsOlderThan">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoRun WHERE orgId = :org_id AND
endTime < :limit_time]]>
</query>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
index f8312f8..8009d15 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoSchedule.hbm.xml
@@ -36,6 +36,10 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE id =
:schedule_id]]>
</query>
+ <query name="TaskoSchedule.listOlderThan">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE activeTill
< :limit_time]]>
+ </query>
+
<query name="TaskoSchedule.listByOrg">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id]]>
</query>
@@ -52,8 +56,16 @@ PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND (activeFrom < :timestamp AND (activeTill is null OR :timestamp <
activeTill))]]>
</query>
+ <query name="TaskoSchedule.listActiveInSat">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId is null
AND activeFrom < :timestamp AND (activeTill is null OR :timestamp <
activeTill)]]>
+ </query>
+
<query name="TaskoSchedule.listActiveByOrgAndLabel">
<![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId =
:org_id AND jobLabel = :job_label AND (activeFrom < :timestamp AND (activeTill is null
OR :timestamp < activeTill))]]>
</query>
+ <query name="TaskoSchedule.listActiveInSatByLabel">
+ <![CDATA[FROM com.redhat.rhn.taskomatic.TaskoSchedule WHERE orgId is null
AND jobLabel = :job_label AND activeFrom < :timestamp AND (activeTill is null OR
:timestamp < activeTill)]]>
+ </query>
+
</hibernate-mapping>
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
index 73d5421..5d142d6 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoXmlRpcHandler.java
@@ -88,10 +88,12 @@ public class TaskoXmlRpcHandler {
private TaskoBunch doBasicCheck(Integer orgId, String bunchName,
String jobLabel)
throws NoSuchBunchTaskException, InvalidParamException, SchedulerException {
- TaskoBunch bunch = checkBunchName(bunchName);
+ TaskoBunch bunch = checkBunchName(orgId, bunchName);
if (!TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel).isEmpty() ||
- (SchedulerKernel.getScheduler().getTrigger(jobLabel, orgId.toString())
!=
+ (SchedulerKernel.getScheduler().getTrigger(jobLabel, getGroupName(orgId))
!=
null)) {
+ String[] triggerNames =
+ SchedulerKernel.getScheduler().getTriggerNames(getGroupName(orgId));
throw new InvalidParamException("jobLabel already in use");
}
return bunch;
@@ -103,7 +105,8 @@ public class TaskoXmlRpcHandler {
TaskoFactory.listActiveSchedulesByOrgAndLabel(orgId, jobLabel);
Trigger trigger;
try {
- trigger = SchedulerKernel.getScheduler().getTrigger(jobLabel,
orgId.toString());
+ trigger = SchedulerKernel.getScheduler().getTrigger(jobLabel,
+ getGroupName(orgId));
}
catch (SchedulerException e) {
trigger = null;
@@ -165,7 +168,7 @@ public class TaskoXmlRpcHandler {
while (!TaskoFactory.listSchedulesByOrgAndLabel(orgId,
jobLabel + count.toString()).isEmpty() ||
(SchedulerKernel.getScheduler().getTrigger(jobLabel + count.toString(),
- orgId.toString()) != null)) {
+ getGroupName(orgId)) != null)) {
count++;
}
return jobLabel + count.toString();
@@ -176,13 +179,13 @@ public class TaskoXmlRpcHandler {
Trigger trigger = null;
if (schedule.getCronExpr().isEmpty()) {
trigger = new SimpleTrigger(schedule.getJobLabel(),
- schedule.getOrgId().toString(), 1, 1);
+ getGroupName(schedule.getOrgId()), 1, 1);
trigger.setEndTime(new Date());
}
else {
try {
trigger = new CronTrigger(schedule.getJobLabel(),
- schedule.getOrgId().toString(), schedule.getCronExpr());
+ getGroupName(schedule.getOrgId()), schedule.getCronExpr());
trigger.setStartTime(schedule.getActiveFrom());
trigger.setEndTime(schedule.getActiveTill());
}
@@ -193,7 +196,7 @@ public class TaskoXmlRpcHandler {
}
// create job
JobDetail jobDetail = new JobDetail(schedule.getJobLabel(),
- schedule.getOrgId().toString(), TaskoJob.class);
+ getGroupName(schedule.getOrgId()), TaskoJob.class);
// set job params
jobDetail.getJobDataMap().putAll(schedule.getDataMap());
jobDetail.getJobDataMap().put("schedule_id", schedule.getId());
@@ -209,7 +212,7 @@ public class TaskoXmlRpcHandler {
private Integer destroyJob(Integer orgId, String jobLabel) {
try {
- SchedulerKernel.getScheduler().unscheduleJob(jobLabel, orgId.toString());
+ SchedulerKernel.getScheduler().unscheduleJob(jobLabel, getGroupName(orgId));
return 1;
}
catch (SchedulerException e) {
@@ -217,9 +220,15 @@ public class TaskoXmlRpcHandler {
}
}
- private TaskoBunch checkBunchName(String bunchName)
+ private TaskoBunch checkBunchName(Integer orgId, String bunchName)
throws NoSuchBunchTaskException {
- TaskoBunch bunch = TaskoFactory.lookupOrgBunchByName(bunchName);
+ TaskoBunch bunch = null;
+ if (orgId == null) {
+ bunch = TaskoFactory.lookupSatBunchByName(bunchName);
+ }
+ else {
+ bunch = TaskoFactory.lookupOrgBunchByName(bunchName);
+ }
if (bunch == null) {
throw new NoSuchBunchTaskException(bunchName);
}
@@ -281,4 +290,11 @@ public class TaskoXmlRpcHandler {
throws InvalidParamException {
return getRunStdErrorLog(null, runId, nBytes);
}
+
+ private String getGroupName(Integer orgId) {
+ if (orgId == null) {
+ return null;
+ }
+ return orgId.toString();
+ }
}
commit 63d9f782a572797b99a887b7d891661bb63df3e2
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 30 14:38:13 2010 +0200
enhance task synchronization
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
index 26752a9..2df4614 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
@@ -49,16 +49,17 @@ public class TaskoJob implements Job {
}
private boolean isTaskThreadAvailable(TaskoTask task) {
- return tasks.get(task.getName()) < Config.get().getInt("taskomatic."
+ task.getTaskClass() + ".parallel_threads", 1);
+ return tasks.get(task.getName()) < Config.get().getInt("taskomatic."
+
+ task.getTaskClass() + ".parallel_threads", 1);
}
- synchronized private static void markTaskRunning(TaskoTask task) {
+ private static synchronized void markTaskRunning(TaskoTask task) {
int count = tasks.get(task.getName());
count++;
tasks.put(task.getName(), count);
}
- synchronized private static void unmarkTaskRunning(TaskoTask task) {
+ private static synchronized void unmarkTaskRunning(TaskoTask task) {
int count = tasks.get(task.getName());
count--;
tasks.put(task.getName(), count);
@@ -73,8 +74,10 @@ public class TaskoJob implements Job {
TaskoSchedule schedule = TaskoFactory.lookupScheduleById(scheduleId);
if (schedule == null) {
- log.error("No such schedule with id " + scheduleId);
- return;
+ // means, that schedule was deleted (in the DB), but quartz still schedules
it
+ log.error("No such schedule with id " + scheduleId);
+ TaskoFactory.unscheduleTrigger(context.getTrigger());
+ return;
}
log.info(schedule.getJobLabel() + ":" + " bunch " +
schedule.getBunch().getName() +
@@ -88,27 +91,30 @@ public class TaskoJob implements Job {
Object lock = locks.get(task.getName());
synchronized (lock) {
while (!isTaskThreadAvailable(task)) {
- log.debug(schedule.getJobLabel() + ":" + " task
" + task.getName() +
- " all allowed threads running ... WAITING");
+ log.debug(schedule.getJobLabel() + ":" + " task
" +
+ task.getName() +
+ " all allowed threads running ... WAITING");
try {
lock.wait();
- log.debug(schedule.getJobLabel() + ":" + "
task " + task.getName() +
- " ... AWAKE");
+ log.debug(schedule.getJobLabel() + ":" + "
task " +
+ task.getName() + " ... AWAKE");
}
catch (InterruptedException e) {
// ok
}
}
markTaskRunning(task);
- log.debug(schedule.getJobLabel() + ":" + " task "
+ task.getName() +
- " STARTED");
- TaskoRun taskRun = new TaskoRun(schedule.getOrgId(), template,
scheduleId);
- TaskoFactory.save(taskRun);
- taskRun.execute(context);
- TaskoFactory.commitTransaction();
- log.debug(task.getName() +
- " (" + schedule.getJobLabel() + ") ... "
+ taskRun.getStatus());
- previousRun = taskRun;
+ }
+ log.debug(schedule.getJobLabel() + ":" + " task " +
task.getName() +
+ " STARTED");
+ TaskoRun taskRun = new TaskoRun(schedule.getOrgId(), template,
scheduleId);
+ TaskoFactory.save(taskRun);
+ taskRun.execute(context);
+ TaskoFactory.commitTransaction();
+ log.debug(task.getName() +
+ " (" + schedule.getJobLabel() + ") ... " +
taskRun.getStatus());
+ previousRun = taskRun;
+ synchronized (lock) {
unmarkTaskRunning(task);
lock.notify();
}
@@ -125,7 +131,7 @@ public class TaskoJob implements Job {
}
/**
- * @param scheduleId The scheduleId to set.
+ * @param scheduleIdIn The scheduleId to set.
*/
public void setScheduleId(Long scheduleIdIn) {
this.scheduleId = scheduleIdIn;
commit 4cf1e3f7fd4fd3579dcaf911aa4721593ffbeef0
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Wed Jun 30 14:35:29 2010 +0200
add logging support
- differentiate internal java and external command tasks
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
index 387fe89..ebb6fda 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoRun.java
@@ -14,6 +14,8 @@
*/
package com.redhat.rhn.taskomatic;
+import com.redhat.rhn.taskomatic.task.RhnJob;
+
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
@@ -75,9 +77,9 @@ public class TaskoRun implements Job {
saveStatus(STATUS_RUNNING);
}
- public void finished(JobExecutionContext context) {
+ public void finished(RhnJob job) {
setEndTime(new Date());
- String out = (String)
context.getJobDetail().getJobDataMap().get("stdOutput");
+ String out = job.getLogOutput();
if (new File(getStdLogDirName(orgId)).isDirectory()) {
if ((out != null) && (!out.isEmpty())) {
setStdOutputPath(getStdOutputLog(orgId, template, this));
@@ -86,7 +88,7 @@ public class TaskoRun implements Job {
else {
setStdOutputPath("");
}
- String err = (String)
context.getJobDetail().getJobDataMap().get("stdError");
+ String err = job.getLogError();
if ((err != null) && (!err.isEmpty())) {
setStdErrorPath(getStdErrorLog(orgId, template, this));
saveLogToFile(getStdErrorPath(), err);
@@ -98,39 +100,24 @@ public class TaskoRun implements Job {
else {
log.warn("Logging disabled. No directory " +
getStdLogDirName(orgId));
}
- saveStatus(STATUS_FINISHED);
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
start();
Class jobClass = null;
- Job job = null;
+ RhnJob job = null;
try {
jobClass = Class.forName(template.getTask().getTaskClass());
- job = (Job) jobClass.newInstance();
- }
- catch (ClassNotFoundException cnfe) {
- log.warn("Internal task error.");
- saveToStdError(cnfe.toString());
- saveStatus(STATUS_FAILED);
- return;
+ job = (RhnJob) jobClass.newInstance();
+ job.execute(context);
+ saveStatus(STATUS_FINISHED);
}
- catch (InstantiationException ie) {
- log.warn("Internal task error.");
- saveToStdError(ie.toString());
+ catch (Exception e) {
+ job.appendExceptionToLogError(e);
saveStatus(STATUS_FAILED);
- return;
}
- catch (IllegalAccessException iae) {
- log.warn("Internal task error.");
- saveToStdError(iae.toString());
- saveStatus(STATUS_FAILED);
- return;
- }
-
- job.execute(context);
- finished(context);
+ finished(job);
}
private void saveToStdError(String message) {
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/RhnExtCmdJob.java
b/java/code/src/com/redhat/rhn/taskomatic/task/RhnExtCmdJob.java
new file mode 100644
index 0000000..5173363
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RhnExtCmdJob.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.taskomatic.task;
+
+import com.redhat.rhn.manager.satellite.SystemCommandExecutor;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * RhnExtCmdJob
+ * @version $Rev$
+ */
+public abstract class RhnExtCmdJob implements RhnJob {
+
+ protected Logger log = null;
+ private String stdOutput;
+ private String stdError;
+
+ public Logger getLogger(Class clazz) {
+ if (log == null) {
+ log = Logger.getLogger(clazz);
+ }
+ return log;
+ }
+
+ protected void executeExtCmd(String[] args) {
+ SystemCommandExecutor ce = new SystemCommandExecutor();
+ ce.execute(args);
+
+ setStdOutput(ce.getLastCommandOutput());
+ setStdError(ce.getLastCommandErrorMessage());
+ }
+
+ private void setStdError(String stdErrorIn) {
+ stdError = stdErrorIn;
+ }
+
+ private void setStdOutput(String stdOutputIn) {
+ stdOutput = stdOutputIn;
+ }
+
+ public String getLogOutput() {
+ return stdOutput;
+ }
+
+ public String getLogError() {
+ return stdError;
+ }
+
+ public void appendExceptionToLogError(Exception e) {
+ e.printStackTrace();
+ stdError += e.getMessage();
+ stdError += e.getCause();
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/RhnJavaJob.java
b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJavaJob.java
new file mode 100644
index 0000000..52ddbdc
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJavaJob.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.taskomatic.task;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * RhnJavaJob
+ * @version $Rev$
+ */
+public abstract class RhnJavaJob implements RhnJob {
+
+ private Logger log = null;
+ private RhnJobAppender appender = null;
+
+ public Logger getLogger(Class clazz) {
+ if (log == null) {
+ log = Logger.getLogger(clazz);
+ appender = new RhnJobAppender();
+ log.addAppender(appender);
+ }
+ return log;
+ }
+
+ public String getLogOutput() {
+ return appender.getOutputContent();
+ }
+
+ public String getLogError() {
+ return appender.getErrorContent();
+ }
+
+ public void appendExceptionToLogError(Exception e) {
+ log.error(e.getMessage());
+ log.error(e.getCause());
+ }
+}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/RhnJob.java
b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJob.java
index 9d39292..9e9e77b 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/task/RhnJob.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJob.java
@@ -14,17 +14,22 @@
*/
package com.redhat.rhn.taskomatic.task;
+import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
-public abstract class RhnJob implements Job {
+public abstract interface RhnJob extends Job {
- public static boolean isParallelizable() {
- return false;
- }
-
- public abstract void execute(JobExecutionContext context)
+ void execute(JobExecutionContext context)
throws JobExecutionException;
+
+ Logger getLogger(Class clazz);
+
+ String getLogOutput();
+
+ String getLogError();
+
+ void appendExceptionToLogError(Exception e);
}
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/RhnJobAppender.java
b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJobAppender.java
new file mode 100644
index 0000000..c88b084
--- /dev/null
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RhnJobAppender.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * This software is licensed to you under the GNU General Public License,
+ * version 2 (GPLv2). There is NO WARRANTY for this software, express or
+ * implied, including the implied warranties of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
+ * along with this software; if not, see
+ *
http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
+ *
+ * Red Hat trademarks are not licensed under GPLv2. No permission is
+ * granted to use or replicate Red Hat trademarks that are incorporated
+ * in this software or its documentation.
+ */
+package com.redhat.rhn.taskomatic.task;
+
+import com.redhat.rhn.common.localization.LocalizationService;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.Level;
+import org.apache.log4j.spi.LoggingEvent;
+
+import java.util.Date;
+
+
+/**
+ * RhnJobAppender
+ * @version $Rev$
+ */
+public class RhnJobAppender extends AppenderSkeleton {
+ private StringBuffer outputBuffer = new StringBuffer();
+ private StringBuffer errorBuffer = new StringBuffer();
+
+ public String getOutputContent() {
+ return outputBuffer.toString();
+ }
+
+ public String getErrorContent() {
+ return errorBuffer.toString();
+ }
+
+ @Override
+ protected void append(LoggingEvent event) {
+ if (Level.INFO.isGreaterOrEqual(event.getLevel())) {
+ outputBuffer.append(logEvent(event));
+ }
+ else {
+ errorBuffer.append(logEvent(event));
+ }
+ }
+
+ private String logEvent(LoggingEvent event) {
+ return LocalizationService.getInstance().formatCustomDate(
+ new Date(LoggingEvent.getStartTime())) + " [" +
event.getThreadName() +
+ "] " + event.getLevel() + " " +
event.getClass().getName() + " " +
+ event.getRenderedMessage() + '\n';
+ }
+
+ public void close() {
+ }
+
+ public boolean requiresLayout() {
+ return false;
+ }
+}
commit 9abf02eda0f17adb6302e1d0ee771dc75b35eac6
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Mon Jun 28 14:22:57 2010 +0200
make number of threads per task configurable
diff --git a/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
index 3b9ae41..26752a9 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/TaskoJob.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2008 Red Hat, Inc.
+ * Copyright (c) 2010 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
@@ -14,6 +14,7 @@
*/
package com.redhat.rhn.taskomatic;
+import com.redhat.rhn.common.conf.Config;
import com.redhat.rhn.common.hibernate.HibernateFactory;
import org.apache.log4j.Logger;
@@ -47,6 +48,10 @@ public class TaskoJob implements Job {
return tasks.get(task.getName()) > 0;
}
+ private boolean isTaskThreadAvailable(TaskoTask task) {
+ return tasks.get(task.getName()) < Config.get().getInt("taskomatic."
+ task.getTaskClass() + ".parallel_threads", 1);
+ }
+
synchronized private static void markTaskRunning(TaskoTask task) {
int count = tasks.get(task.getName());
count++;
@@ -69,57 +74,52 @@ public class TaskoJob implements Job {
TaskoSchedule schedule = TaskoFactory.lookupScheduleById(scheduleId);
if (schedule == null) {
log.error("No such schedule with id " + scheduleId);
+ return;
}
log.info(schedule.getJobLabel() + ":" + " bunch " +
schedule.getBunch().getName() +
" started");
- // wait until the same schedule finishes
- //synchronized (schedule) {
- for (TaskoTemplate template : schedule.getBunch().getTemplates()) {
- if ((previousRun == null) ||
- (previousRun.getStatus() == template.getStartIf())) {
- TaskoTask task = template.getTask();
-
- Object lock = locks.get(task.getName());
- synchronized (lock) {
- if (!TaskoFactory.isTaskParalelizable(task)) {
- while (isTaskRunning(task)) {
- log.debug(schedule.getJobLabel() + ":" + "
task " + task.getName() +
- " currenty running ... WAITING");
- // TaskoFactory.sleep(10000);
- try {
- lock.wait();
- log.debug(schedule.getJobLabel() + ":" +
" task " + task.getName() +
- " ... AWAKE");
- }
- catch (InterruptedException e) {
- // ok
- }
- }
- }
- markTaskRunning(task);
+ for (TaskoTemplate template : schedule.getBunch().getTemplates()) {
+ if ((previousRun == null) ||
+ (previousRun.getStatus() == template.getStartIf())) {
+ TaskoTask task = template.getTask();
+
+ Object lock = locks.get(task.getName());
+ synchronized (lock) {
+ while (!isTaskThreadAvailable(task)) {
log.debug(schedule.getJobLabel() + ":" + " task
" + task.getName() +
- " STARTED");
- TaskoRun taskRun = new TaskoRun(schedule.getOrgId(), template,
scheduleId);
- TaskoFactory.save(taskRun);
- taskRun.execute(context);
- TaskoFactory.commitTransaction();
- log.debug(task.getName() +
- " (" + schedule.getJobLabel() + ") ...
" + taskRun.getStatus());
- previousRun = taskRun;
- unmarkTaskRunning(task);
- lock.notify();
+ " all allowed threads running ... WAITING");
+ try {
+ lock.wait();
+ log.debug(schedule.getJobLabel() + ":" + "
task " + task.getName() +
+ " ... AWAKE");
+ }
+ catch (InterruptedException e) {
+ // ok
+ }
}
- }
- else {
- log.info("Interrupting " + schedule.getBunch().getName() +
- " (" + schedule.getJobLabel() + ")");
- break;
+ markTaskRunning(task);
+ log.debug(schedule.getJobLabel() + ":" + " task "
+ task.getName() +
+ " STARTED");
+ TaskoRun taskRun = new TaskoRun(schedule.getOrgId(), template,
scheduleId);
+ TaskoFactory.save(taskRun);
+ taskRun.execute(context);
+ TaskoFactory.commitTransaction();
+ log.debug(task.getName() +
+ " (" + schedule.getJobLabel() + ") ... "
+ taskRun.getStatus());
+ previousRun = taskRun;
+ unmarkTaskRunning(task);
+ lock.notify();
}
}
- HibernateFactory.closeSession();
- //}
+ else {
+ log.info("Interrupting " + schedule.getBunch().getName() +
+ " (" + schedule.getJobLabel() + ")");
+ break;
+ }
+ }
+ HibernateFactory.closeSession();
log.info(schedule.getJobLabel() + ":" + " bunch " +
schedule.getBunch().getName() +
" finished");
}