Search in sources :

Example 1 with IParameterService

use of org.jumpmind.symmetric.service.IParameterService in project symmetric-ds by JumpMind.

the class ConfigurationChangedDatabaseWriterFilter method batchCommitted.

@Override
public void batchCommitted(DataContext context) {
    IParameterService parameterService = engine.getParameterService();
    INodeService nodeService = engine.getNodeService();
    if (context.getBatch().getBatchId() == Constants.VIRTUAL_BATCH_FOR_REGISTRATION) {
        // mark registration as complete
        String nodeId = nodeService.findIdentityNodeId();
        if (nodeId != null) {
            NodeSecurity security = nodeService.findNodeSecurity(nodeId);
            if (security != null && (security.isRegistrationEnabled() || security.getRegistrationTime() == null)) {
                engine.getRegistrationService().markNodeAsRegistered(nodeId);
            }
        }
    }
    if (context.get(CTX_KEY_FLUSH_GROUPLETS_NEEDED) != null) {
        log.info("Grouplets flushed because new grouplet config came through the data loader");
        engine.getGroupletService().clearCache();
        context.remove(CTX_KEY_FLUSH_GROUPLETS_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_LOADFILTERS_NEEDED) != null) {
        log.info("Load filters flushed because new filter config came through the data loader");
        engine.getLoadFilterService().clearCache();
        context.remove(CTX_KEY_FLUSH_LOADFILTERS_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_CHANNELS_NEEDED) != null) {
        log.info("Channels flushed because new channels came through the data loader");
        engine.getConfigurationService().clearCache();
        context.remove(CTX_KEY_FLUSH_CHANNELS_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_CONFLICTS_NEEDED) != null) {
        log.info("About to refresh the cache of conflict settings because new configuration came through the data loader");
        engine.getDataLoaderService().clearCache();
        context.remove(CTX_KEY_FLUSH_CONFLICTS_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_PARAMETERS_NEEDED) != null) {
        log.info("About to refresh the cache of parameters because new configuration came through the data loader");
        parameterService.rereadParameters();
        context.remove(CTX_KEY_FLUSH_PARAMETERS_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_NODE_SECURITY_NEEDED) != null) {
        log.info("About to refresh the cache of node security because new configuration came through the data loader");
        nodeService.flushNodeAuthorizedCache();
        context.remove(CTX_KEY_FLUSH_NODE_SECURITY_NEEDED);
    }
    if (context.get(CTX_KEY_FLUSH_NODE_NEEDED) != null) {
        log.info("About to refresh the cache of nodes because new configuration came through the data loader");
        nodeService.flushNodeCache();
        nodeService.flushNodeGroupCache();
        context.remove(CTX_KEY_FLUSH_NODE_NEEDED);
    }
}
Also used : NodeSecurity(org.jumpmind.symmetric.model.NodeSecurity) INodeService(org.jumpmind.symmetric.service.INodeService) IParameterService(org.jumpmind.symmetric.service.IParameterService)

Example 2 with IParameterService

use of org.jumpmind.symmetric.service.IParameterService in project symmetric-ds by JumpMind.

the class RouterServiceTest method setup.

@Before
public void setup() {
    ISymmetricEngine engine = mock(ISymmetricEngine.class);
    IParameterService parameterService = mock(IParameterService.class);
    ISymmetricDialect symmetricDialect = mock(ISymmetricDialect.class);
    IDatabasePlatform databasePlatform = mock(IDatabasePlatform.class);
    IExtensionService extensionService = mock(IExtensionService.class);
    when(databasePlatform.getDatabaseInfo()).thenReturn(new DatabaseInfo());
    when(symmetricDialect.getPlatform()).thenReturn(databasePlatform);
    when(engine.getDatabasePlatform()).thenReturn(databasePlatform);
    when(engine.getParameterService()).thenReturn(parameterService);
    when(engine.getSymmetricDialect()).thenReturn(symmetricDialect);
    when(engine.getExtensionService()).thenReturn(extensionService);
    routerService = new RouterService(engine);
}
Also used : ISymmetricDialect(org.jumpmind.symmetric.db.ISymmetricDialect) IDatabasePlatform(org.jumpmind.db.platform.IDatabasePlatform) DatabaseInfo(org.jumpmind.db.platform.DatabaseInfo) ISymmetricEngine(org.jumpmind.symmetric.ISymmetricEngine) IExtensionService(org.jumpmind.symmetric.service.IExtensionService) IParameterService(org.jumpmind.symmetric.service.IParameterService) Before(org.junit.Before)

Example 3 with IParameterService

use of org.jumpmind.symmetric.service.IParameterService in project symmetric-ds by JumpMind.

the class DefaultNodeIdCreatorTest method testGenerateNodeIdExistingWithUniqueParam.

@Test
public void testGenerateNodeIdExistingWithUniqueParam() throws Exception {
    final String EXPECTED_NODE_ID = "100-0";
    IParameterService paramService = mock(IParameterService.class);
    Mockito.when(paramService.is(ParameterConstants.EXTERNAL_ID_IS_UNIQUE)).thenReturn(false);
    Mockito.when(paramService.getInt(ParameterConstants.NODE_ID_CREATOR_MAX_NODES, 100)).thenReturn(100);
    DefaultNodeIdCreator generator = new DefaultNodeIdCreator(paramService, new MockNodeService() {

        @Override
        public Node findNode(String nodeId) {
            if (nodeId.equals("100")) {
                Node node = new Node();
                node.setNodeId("100");
                return node;
            } else {
                return null;
            }
        }
    }, SecurityServiceFactory.create());
    Node node = new Node();
    node.setExternalId("100");
    String selectedNodeId = generator.generateNodeId(node, null, null);
    assertEquals(EXPECTED_NODE_ID, selectedNodeId);
}
Also used : MockNodeService(org.jumpmind.symmetric.service.impl.MockNodeService) Node(org.jumpmind.symmetric.model.Node) IParameterService(org.jumpmind.symmetric.service.IParameterService) Test(org.junit.Test)

Example 4 with IParameterService

use of org.jumpmind.symmetric.service.IParameterService in project symmetric-ds by JumpMind.

the class AbstractJob method invoke.

public boolean invoke(boolean force) {
    IParameterService parameterService = engine.getParameterService();
    boolean ran = false;
    try {
        if (engine == null) {
            log.info("Could not find a reference to the SymmetricEngine from {}", jobName);
        } else {
            if (!Thread.interrupted()) {
                MDC.put("engineName", engine.getEngineName());
                if (engine.isStarted()) {
                    if (!paused || force) {
                        if (!running) {
                            running = true;
                            synchronized (this) {
                                ran = true;
                                long startTime = System.currentTimeMillis();
                                try {
                                    if (!isRequiresRegistration() || (isRequiresRegistration() && engine.getRegistrationService().isRegisteredWithServer())) {
                                        hasNotRegisteredMessageBeenLogged = false;
                                        if (parameterService.is(ParameterConstants.SYNCHRONIZE_ALL_JOBS)) {
                                            synchronized (AbstractJob.class) {
                                                doJob(force);
                                            }
                                        } else {
                                            doJob(force);
                                        }
                                    } else {
                                        if (!hasNotRegisteredMessageBeenLogged) {
                                            log.info("Did not run the {} job because the engine is not registered.", getName());
                                            hasNotRegisteredMessageBeenLogged = true;
                                        }
                                    }
                                } finally {
                                    lastFinishTime = new Date();
                                    long endTime = System.currentTimeMillis();
                                    lastExecutionTimeInMs = endTime - startTime;
                                    totalExecutionTimeInMs += lastExecutionTimeInMs;
                                    if (lastExecutionTimeInMs > Constants.LONG_OPERATION_THRESHOLD) {
                                        engine.getStatisticManager().addJobStats(jobName, startTime, endTime, 0);
                                    }
                                    numberOfRuns++;
                                    running = false;
                                }
                            }
                        }
                    }
                } else {
                    log.info("The engine is not currently started.");
                }
            } else {
                log.warn("This thread was interrupted.  Not executing the job until the interrupted status has cleared");
            }
        }
    } catch (final Throwable ex) {
        log.error("", ex);
    }
    return ran;
}
Also used : IParameterService(org.jumpmind.symmetric.service.IParameterService) Date(java.util.Date)

Example 5 with IParameterService

use of org.jumpmind.symmetric.service.IParameterService in project symmetric-ds by JumpMind.

the class SnapshotUtil method createSnapshot.

public static File createSnapshot(ISymmetricEngine engine) {
    String dirName = engine.getEngineName().replaceAll(" ", "-") + "-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    IParameterService parameterService = engine.getParameterService();
    File tmpDir = new File(parameterService.getTempDirectory(), dirName);
    tmpDir.mkdirs();
    File logDir = null;
    String parameterizedLogDir = parameterService.getString("server.log.dir");
    if (isNotBlank(parameterizedLogDir)) {
        logDir = new File(parameterizedLogDir);
    }
    if (logDir != null && logDir.exists()) {
        log.info("Using server.log.dir setting as the location of the log files");
    } else {
        logDir = new File("logs");
        if (!logDir.exists()) {
            Map<File, Layout> matches = findSymmetricLogFile();
            if (matches != null && matches.size() == 1) {
                logDir = matches.keySet().iterator().next().getParentFile();
            }
        }
        if (!logDir.exists()) {
            logDir = new File("../logs");
        }
        if (!logDir.exists()) {
            logDir = new File("target");
        }
        if (logDir.exists()) {
            File[] files = logDir.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.getName().toLowerCase().endsWith(".log")) {
                        try {
                            FileUtils.copyFileToDirectory(file, tmpDir);
                        } catch (IOException e) {
                            log.warn("Failed to copy " + file.getName() + " to the snapshot directory", e);
                        }
                    }
                }
            }
        }
    }
    FileWriter fwriter = null;
    try {
        fwriter = new FileWriter(new File(tmpDir, "config-export.csv"));
        engine.getDataExtractorService().extractConfigurationStandalone(engine.getNodeService().findIdentity(), fwriter, TableConstants.SYM_NODE, TableConstants.SYM_NODE_SECURITY, TableConstants.SYM_NODE_IDENTITY, TableConstants.SYM_NODE_HOST, TableConstants.SYM_NODE_CHANNEL_CTL, TableConstants.SYM_CONSOLE_USER, TableConstants.SYM_MONITOR_EVENT, TableConstants.SYM_CONSOLE_EVENT);
    } catch (Exception e) {
        log.warn("Failed to export symmetric configuration", e);
    } finally {
        IOUtils.closeQuietly(fwriter);
    }
    File serviceConfFile = new File("conf/sym_service.conf");
    try {
        if (serviceConfFile.exists()) {
            FileUtils.copyFileToDirectory(serviceConfFile, tmpDir);
        }
    } catch (Exception e) {
        log.warn("Failed to copy " + serviceConfFile.getName() + " to the snapshot directory", e);
    }
    TreeSet<Table> tables = new TreeSet<Table>();
    FileOutputStream fos = null;
    try {
        ITriggerRouterService triggerRouterService = engine.getTriggerRouterService();
        List<TriggerHistory> triggerHistories = triggerRouterService.getActiveTriggerHistories();
        for (TriggerHistory triggerHistory : triggerHistories) {
            Table table = engine.getDatabasePlatform().getTableFromCache(triggerHistory.getSourceCatalogName(), triggerHistory.getSourceSchemaName(), triggerHistory.getSourceTableName(), false);
            if (table != null && !table.getName().toUpperCase().startsWith(engine.getSymmetricDialect().getTablePrefix().toUpperCase())) {
                tables.add(table);
            }
        }
        List<Trigger> triggers = triggerRouterService.getTriggers();
        for (Trigger trigger : triggers) {
            Table table = engine.getDatabasePlatform().getTableFromCache(trigger.getSourceCatalogName(), trigger.getSourceSchemaName(), trigger.getSourceTableName(), false);
            if (table != null) {
                tables.add(table);
            }
        }
        fos = new FileOutputStream(new File(tmpDir, "table-definitions.xml"));
        DbExport export = new DbExport(engine.getDatabasePlatform());
        export.setFormat(Format.XML);
        export.setNoData(true);
        export.exportTables(fos, tables.toArray(new Table[tables.size()]));
    } catch (Exception e) {
        log.warn("Failed to export table definitions", e);
    } finally {
        IOUtils.closeQuietly(fos);
    }
    String tablePrefix = engine.getTablePrefix();
    DbExport export = new DbExport(engine.getDatabasePlatform());
    export.setFormat(Format.CSV);
    export.setNoCreateInfo(true);
    extract(export, new File(tmpDir, "sym_identity.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_IDENTITY));
    extract(export, new File(tmpDir, "sym_node.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE));
    extract(export, new File(tmpDir, "sym_node_security.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_SECURITY));
    extract(export, new File(tmpDir, "sym_node_host.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_HOST));
    extract(export, new File(tmpDir, "sym_trigger_hist.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_TRIGGER_HIST));
    try {
        if (!parameterService.is(ParameterConstants.CLUSTER_LOCKING_ENABLED)) {
            engine.getNodeCommunicationService().persistToTableForSnapshot();
            engine.getClusterService().persistToTableForSnapshot();
        }
    } catch (Exception e) {
        log.warn("Unable to add SYM_NODE_COMMUNICATION to the snapshot.", e);
    }
    extract(export, new File(tmpDir, "sym_lock.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_LOCK));
    extract(export, new File(tmpDir, "sym_node_communication.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_NODE_COMMUNICATION));
    extract(export, 10000, "order by create_time desc", new File(tmpDir, "sym_outgoing_batch.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_OUTGOING_BATCH));
    extract(export, 10000, "where status != 'OK' order by create_time", new File(tmpDir, "sym_outgoing_batch_not_ok.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_OUTGOING_BATCH));
    extract(export, 10000, "order by create_time desc", new File(tmpDir, "sym_incoming_batch.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_INCOMING_BATCH));
    extract(export, 10000, "where status != 'OK' order by create_time", new File(tmpDir, "sym_incoming_batch_not_ok.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_INCOMING_BATCH));
    extract(export, 5000, "order by start_id, end_id desc", new File(tmpDir, "sym_data_gap.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_DATA_GAP));
    extract(export, new File(tmpDir, "sym_table_reload_request.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_TABLE_RELOAD_REQUEST));
    extract(export, 5000, "order by relative_dir, file_name", new File(tmpDir, "sym_file_snapshot.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_FILE_SNAPSHOT));
    extract(export, new File(tmpDir, "sym_console_event.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_CONSOLE_EVENT));
    extract(export, new File(tmpDir, "sym_monitor_event.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_MONITOR_EVENT));
    extract(export, new File(tmpDir, "sym_extract_request.csv"), TableConstants.getTableName(tablePrefix, TableConstants.SYM_EXTRACT_REQUEST));
    if (engine.getSymmetricDialect() instanceof FirebirdSymmetricDialect) {
        final String[] monTables = { "mon$database", "mon$attachments", "mon$transactions", "mon$statements", "mon$io_stats", "mon$record_stats", "mon$memory_usage", "mon$call_stack", "mon$context_variables" };
        for (String table : monTables) {
            extract(export, new File(tmpDir, "firebird-" + table + ".csv"), table);
        }
    }
    fwriter = null;
    try {
        fwriter = new FileWriter(new File(tmpDir, "threads.txt"));
        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
        long[] threadIds = threadBean.getAllThreadIds();
        for (long l : threadIds) {
            ThreadInfo info = threadBean.getThreadInfo(l, 100);
            if (info != null) {
                String threadName = info.getThreadName();
                fwriter.append(StringUtils.rightPad(threadName, THREAD_INDENT_SPACE));
                fwriter.append(AppUtils.formatStackTrace(info.getStackTrace(), THREAD_INDENT_SPACE, false));
                fwriter.append("\n");
            }
        }
    } catch (Exception e) {
        log.warn("Failed to export thread information", e);
    } finally {
        IOUtils.closeQuietly(fwriter);
    }
    fos = null;
    try {
        fos = new FileOutputStream(new File(tmpDir, "parameters.properties"));
        Properties effectiveParameters = engine.getParameterService().getAllParameters();
        SortedProperties parameters = new SortedProperties();
        parameters.putAll(effectiveParameters);
        parameters.remove("db.password");
        parameters.store(fos, "parameters.properties");
    } catch (IOException e) {
        log.warn("Failed to export parameter information", e);
    } finally {
        IOUtils.closeQuietly(fos);
    }
    fos = null;
    try {
        fos = new FileOutputStream(new File(tmpDir, "parameters-changed.properties"));
        Properties defaultParameters = new Properties();
        InputStream in = SnapshotUtil.class.getResourceAsStream("/symmetric-default.properties");
        defaultParameters.load(in);
        IOUtils.closeQuietly(in);
        in = SnapshotUtil.class.getResourceAsStream("/symmetric-console-default.properties");
        if (in != null) {
            defaultParameters.load(in);
            IOUtils.closeQuietly(in);
        }
        Properties effectiveParameters = engine.getParameterService().getAllParameters();
        Properties changedParameters = new SortedProperties();
        Map<String, ParameterMetaData> parameters = ParameterConstants.getParameterMetaData();
        for (String key : parameters.keySet()) {
            String defaultValue = defaultParameters.getProperty((String) key);
            String currentValue = effectiveParameters.getProperty((String) key);
            if (defaultValue == null && currentValue != null || (defaultValue != null && !defaultValue.equals(currentValue))) {
                changedParameters.put(key, currentValue == null ? "" : currentValue);
            }
        }
        changedParameters.remove("db.password");
        changedParameters.store(fos, "parameters-changed.properties");
    } catch (Exception e) {
        log.warn("Failed to export parameters-changed information", e);
    } finally {
        IOUtils.closeQuietly(fos);
    }
    writeRuntimeStats(engine, tmpDir);
    writeJobsStats(engine, tmpDir);
    if ("true".equals(System.getProperty(SystemConstants.SYSPROP_STANDALONE_WEB))) {
        writeDirectoryListing(engine, tmpDir);
    }
    fos = null;
    try {
        fos = new FileOutputStream(new File(tmpDir, "system.properties"));
        SortedProperties props = new SortedProperties();
        props.putAll(System.getProperties());
        props.store(fos, "system.properties");
    } catch (Exception e) {
        log.warn("Failed to export thread information", e);
    } finally {
        IOUtils.closeQuietly(fos);
    }
    try {
        File jarFile = new File(getSnapshotDirectory(engine), tmpDir.getName() + ".zip");
        JarBuilder builder = new JarBuilder(tmpDir, jarFile, new File[] { tmpDir }, Version.version());
        builder.build();
        FileUtils.deleteDirectory(tmpDir);
        return jarFile;
    } catch (Exception e) {
        throw new IoException("Failed to package snapshot files into archive", e);
    }
}
Also used : FileWriter(java.io.FileWriter) JarBuilder(org.jumpmind.util.JarBuilder) IParameterService(org.jumpmind.symmetric.service.IParameterService) Properties(java.util.Properties) Trigger(org.jumpmind.symmetric.model.Trigger) ThreadInfo(java.lang.management.ThreadInfo) TreeSet(java.util.TreeSet) TriggerHistory(org.jumpmind.symmetric.model.TriggerHistory) ThreadMXBean(java.lang.management.ThreadMXBean) Table(org.jumpmind.db.model.Table) FirebirdSymmetricDialect(org.jumpmind.symmetric.db.firebird.FirebirdSymmetricDialect) ITriggerRouterService(org.jumpmind.symmetric.service.ITriggerRouterService) InputStream(java.io.InputStream) IOException(java.io.IOException) Date(java.util.Date) IoException(org.jumpmind.exception.IoException) IOException(java.io.IOException) DbExport(org.jumpmind.symmetric.io.data.DbExport) Layout(org.apache.log4j.Layout) FileOutputStream(java.io.FileOutputStream) IoException(org.jumpmind.exception.IoException) SimpleDateFormat(java.text.SimpleDateFormat) File(java.io.File) ParameterMetaData(org.jumpmind.properties.DefaultParameterParser.ParameterMetaData)

Aggregations

IParameterService (org.jumpmind.symmetric.service.IParameterService)18 Table (org.jumpmind.db.model.Table)6 Node (org.jumpmind.symmetric.model.Node)6 Test (org.junit.Test)5 Date (java.util.Date)4 DatabaseInfo (org.jumpmind.db.platform.DatabaseInfo)3 IDatabasePlatform (org.jumpmind.db.platform.IDatabasePlatform)3 ISymmetricEngine (org.jumpmind.symmetric.ISymmetricEngine)3 ISymmetricDialect (org.jumpmind.symmetric.db.ISymmetricDialect)3 MockNodeService (org.jumpmind.symmetric.service.impl.MockNodeService)3 ISqlTemplate (org.jumpmind.db.sql.ISqlTemplate)2 Trigger (org.jumpmind.symmetric.model.Trigger)2 TriggerHistory (org.jumpmind.symmetric.model.TriggerHistory)2 IExtensionService (org.jumpmind.symmetric.service.IExtensionService)2 INodeService (org.jumpmind.symmetric.service.INodeService)2 ITriggerRouterService (org.jumpmind.symmetric.service.ITriggerRouterService)2 Before (org.junit.Before)2 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 FileWriter (java.io.FileWriter)1