use of org.jumpmind.symmetric.model.Lock in project symmetric-ds by JumpMind.
the class SnapshotUtil method writeJobsStats.
protected static void writeJobsStats(ISymmetricEngine engine, File tmpDir) {
FileWriter writer = null;
try {
writer = new FileWriter(new File(tmpDir, "jobs.txt"));
IJobManager jobManager = engine.getJobManager();
IClusterService clusterService = engine.getClusterService();
INodeService nodeService = engine.getNodeService();
writer.write("Clustering is " + (clusterService.isClusteringEnabled() ? "" : "not ") + "enabled and there are " + nodeService.findNodeHosts(nodeService.findIdentityNodeId()).size() + " instances in the cluster\n\n");
writer.write(StringUtils.rightPad("Job Name", 30) + StringUtils.rightPad("Schedule", 20) + StringUtils.rightPad("Status", 10) + StringUtils.rightPad("Server Id", 30) + StringUtils.rightPad("Last Server Id", 30) + StringUtils.rightPad("Last Finish Time", 30) + StringUtils.rightPad("Last Run Period", 20) + StringUtils.rightPad("Avg. Run Period", 20) + "\n");
List<IJob> jobs = jobManager.getJobs();
Map<String, Lock> locks = clusterService.findLocks();
for (IJob job : jobs) {
Lock lock = locks.get(job.getClusterLockName());
String status = getJobStatus(job, lock);
String runningServerId = lock != null ? lock.getLockingServerId() : "";
String lastServerId = clusterService.getServerId();
if (lock != null) {
lastServerId = lock.getLastLockingServerId();
}
String schedule = StringUtils.isBlank(job.getCronExpression()) ? Long.toString(job.getTimeBetweenRunsInMs()) : job.getCronExpression();
String lastFinishTime = getLastFinishTime(job, lock);
writer.write(StringUtils.rightPad(job.getClusterLockName().replace("_", " "), 30) + StringUtils.rightPad(schedule, 20) + StringUtils.rightPad(status, 10) + StringUtils.rightPad(runningServerId == null ? "" : runningServerId, 30) + StringUtils.rightPad(lastServerId == null ? "" : lastServerId, 30) + StringUtils.rightPad(lastFinishTime == null ? "" : lastFinishTime, 30) + StringUtils.rightPad(job.getLastExecutionTimeInMs() + "", 20) + StringUtils.rightPad(job.getAverageExecutionTimeInMs() + "", 20) + "\n");
}
} catch (Exception e) {
log.warn("Failed to write jobs information", e);
} finally {
IOUtils.closeQuietly(writer);
}
}
use of org.jumpmind.symmetric.model.Lock in project symmetric-ds by JumpMind.
the class FileSyncService method trackChangesFastScan.
protected void trackChangesFastScan(ProcessInfo processInfo, boolean useCrc) {
boolean isLocked = engine.getClusterService().lock(ClusterConstants.FILE_SYNC_SCAN);
Lock lock = engine.getClusterService().findLocks().get(ClusterConstants.FILE_SYNC_SCAN);
log.debug("File tracker range of " + lock.getLastLockTime() + " to " + lock.getLockTime() + ", isLocked=" + isLocked);
int maxRowsBeforeCommit = engine.getParameterService().getInt(ParameterConstants.DATA_LOADER_MAX_ROWS_BEFORE_COMMIT);
try {
List<FileTriggerRouter> fileTriggerRouters = getFileTriggerRoutersForCurrentNode();
for (final FileTriggerRouter fileTriggerRouter : fileTriggerRouters) {
if (fileTriggerRouter.isEnabled()) {
FileAlterationObserver observer = new FileAlterationObserver(fileTriggerRouter.getFileTrigger().getBaseDir(), fileTriggerRouter.getFileTrigger().createIOFileFilter());
FileTriggerFileModifiedListener listener = new FileTriggerFileModifiedListener(fileTriggerRouter, lock.getLastLockTime(), lock.getLockTime(), processInfo, useCrc, new FileModifiedCallback(maxRowsBeforeCommit) {
public void commit(DirectorySnapshot dirSnapshot) {
saveDirectorySnapshot(fileTriggerRouter, dirSnapshot);
}
public DirectorySnapshot getLastDirectorySnapshot(String relativeDir) {
return getDirectorySnapshot(fileTriggerRouter, relativeDir);
}
}, engine);
observer.addListener(listener);
observer.checkAndNotify();
}
}
engine.getClusterService().unlock(ClusterConstants.FILE_SYNC_SCAN);
} catch (Exception ex) {
log.error("Failed to track changes", ex);
}
}
use of org.jumpmind.symmetric.model.Lock in project symmetric-ds by JumpMind.
the class AbstractJob method start.
public void start() {
if (this.scheduledJob == null && engine != null && !engine.getClusterService().isInfiniteLocked(getClusterLockName())) {
String cronExpression = engine.getParameterService().getString(jobName + ".cron", null);
int timeBetweenRunsInMs = engine.getParameterService().getInt(jobName + ".period.time.ms", -1);
if (!StringUtils.isBlank(cronExpression)) {
log.info("Starting {} with cron expression: {}", jobName, cronExpression);
this.scheduledJob = taskScheduler.schedule(this, new CronTrigger(cronExpression));
started = true;
} else {
int startDelay = randomTimeSlot.getRandomValueSeededByExternalId();
long currentTimeMillis = System.currentTimeMillis();
long lastRunTime = currentTimeMillis - timeBetweenRunsInMs;
Lock lock = engine.getClusterService().findLocks().get(getClusterLockName());
if (lock != null && lock.getLastLockTime() != null) {
long newRunTime = lock.getLastLockTime().getTime();
if (lastRunTime < newRunTime) {
lastRunTime = newRunTime;
}
}
Date firstRun = new Date(lastRunTime + timeBetweenRunsInMs + startDelay);
log.info("Starting {} on periodic schedule: every {}ms with the first run at {}", new Object[] { jobName, timeBetweenRunsInMs, firstRun });
if (timeBetweenRunsInMs > 0) {
this.scheduledJob = taskScheduler.scheduleWithFixedDelay(this, firstRun, timeBetweenRunsInMs);
started = true;
} else {
log.error("Failed to schedule this job, {}", jobName);
}
}
}
}
use of org.jumpmind.symmetric.model.Lock in project symmetric-ds by JumpMind.
the class ClusterService method lockExclusive.
protected boolean lockExclusive(final String action) {
final Date timeout = DateUtils.addMilliseconds(new Date(), (int) -parameterService.getLong(ParameterConstants.LOCK_TIMEOUT_MS));
if (isClusteringEnabled()) {
return sqlTemplate.update(getSql("acquireExclusiveLockSql"), new Object[] { TYPE_EXCLUSIVE, getServerId(), new Date(), action, TYPE_SHARED, timeout }) == 1;
} else {
Lock lock = lockCache.get(action);
if (lock != null) {
synchronized (lock) {
if ((lock.getLockType().equals(TYPE_SHARED) && lock.getSharedCount() == 0) || lock.getLockTime() == null || lock.getLockTime().before(timeout)) {
lock.setLockType(TYPE_EXCLUSIVE);
lock.setLockingServerId(getServerId());
lock.setLockTime(new Date());
lock.setSharedCount(0);
return true;
}
}
}
}
return false;
}
use of org.jumpmind.symmetric.model.Lock in project symmetric-ds by JumpMind.
the class ClusterService method persistToTableForSnapshot.
@Override
public synchronized void persistToTableForSnapshot() {
sqlTemplate.update(getSql("deleteSql"));
Collection<Lock> values = lockCache.values();
for (Lock lock : values) {
insertLock(lock);
}
}
Aggregations