Search in sources :

Example 11 with Lock

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);
    }
}
Also used : IJob(org.jumpmind.symmetric.job.IJob) FileWriter(java.io.FileWriter) INodeService(org.jumpmind.symmetric.service.INodeService) IJobManager(org.jumpmind.symmetric.job.IJobManager) File(java.io.File) IClusterService(org.jumpmind.symmetric.service.IClusterService) IoException(org.jumpmind.exception.IoException) IOException(java.io.IOException) Lock(org.jumpmind.symmetric.model.Lock)

Example 12 with Lock

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);
    }
}
Also used : FileAlterationObserver(org.apache.commons.io.monitor.FileAlterationObserver) FileTriggerRouter(org.jumpmind.symmetric.model.FileTriggerRouter) FileTriggerFileModifiedListener(org.jumpmind.symmetric.file.FileTriggerFileModifiedListener) FileModifiedCallback(org.jumpmind.symmetric.file.FileTriggerFileModifiedListener.FileModifiedCallback) FileConflictException(org.jumpmind.symmetric.file.FileConflictException) NoContentException(org.jumpmind.symmetric.transport.NoContentException) SymmetricException(org.jumpmind.symmetric.SymmetricException) IoException(org.jumpmind.exception.IoException) IOException(java.io.IOException) Lock(org.jumpmind.symmetric.model.Lock) DirectorySnapshot(org.jumpmind.symmetric.file.DirectorySnapshot)

Example 13 with Lock

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);
            }
        }
    }
}
Also used : CronTrigger(org.springframework.scheduling.support.CronTrigger) Date(java.util.Date) Lock(org.jumpmind.symmetric.model.Lock)

Example 14 with Lock

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;
}
Also used : Date(java.util.Date) Lock(org.jumpmind.symmetric.model.Lock)

Example 15 with Lock

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);
    }
}
Also used : Lock(org.jumpmind.symmetric.model.Lock)

Aggregations

Lock (org.jumpmind.symmetric.model.Lock)18 Date (java.util.Date)4 IOException (java.io.IOException)2 IoException (org.jumpmind.exception.IoException)2 File (java.io.File)1 FileWriter (java.io.FileWriter)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 FileAlterationObserver (org.apache.commons.io.monitor.FileAlterationObserver)1 ConcurrencySqlException (org.jumpmind.db.sql.ConcurrencySqlException)1 Row (org.jumpmind.db.sql.Row)1 SymmetricException (org.jumpmind.symmetric.SymmetricException)1 DirectorySnapshot (org.jumpmind.symmetric.file.DirectorySnapshot)1 FileConflictException (org.jumpmind.symmetric.file.FileConflictException)1 FileTriggerFileModifiedListener (org.jumpmind.symmetric.file.FileTriggerFileModifiedListener)1 FileModifiedCallback (org.jumpmind.symmetric.file.FileTriggerFileModifiedListener.FileModifiedCallback)1 IJob (org.jumpmind.symmetric.job.IJob)1 IJobManager (org.jumpmind.symmetric.job.IJobManager)1 FileTriggerRouter (org.jumpmind.symmetric.model.FileTriggerRouter)1 Monitor (org.jumpmind.symmetric.model.Monitor)1