Search in sources :

Example 41 with Node

use of org.jumpmind.symmetric.model.Node in project symmetric-ds by JumpMind.

the class RegistrationService method registerNode.

/**
     * @see IRegistrationService#registerNode(Node, OutputStream, boolean)
     */
public boolean registerNode(Node nodePriorToRegistration, String remoteHost, String remoteAddress, OutputStream out, boolean isRequestedRegistration) throws IOException {
    Node processedNode = processRegistration(nodePriorToRegistration, remoteHost, remoteAddress, isRequestedRegistration, null);
    if (processedNode.isSyncEnabled()) {
        /*
             * Mark all configuration batches as processed because we are about to reload
             * the configuration for the node
             */
        outgoingBatchService.markAllConfigAsSentForNode(processedNode.getNodeId());
        extractConfiguration(out, processedNode);
    }
    return processedNode.isSyncEnabled();
}
Also used : Node(org.jumpmind.symmetric.model.Node)

Example 42 with Node

use of org.jumpmind.symmetric.model.Node in project symmetric-ds by JumpMind.

the class RouterService method routeData.

/**
     * This method will route data to specific nodes.
     */
public synchronized long routeData(boolean force) {
    long dataCount = -1l;
    Node identity = engine.getNodeService().findIdentity();
    if (identity != null) {
        if (force || engine.getClusterService().lock(ClusterConstants.ROUTE)) {
            try {
                if (firstTimeCheckForAbandonedBatches) {
                    engine.getOutgoingBatchService().updateAbandonedRoutingBatches();
                    firstTimeCheckForAbandonedBatches = false;
                }
                if (gapDetector == null) {
                    if (parameterService.is(ParameterConstants.ROUTING_USE_FAST_GAP_DETECTOR)) {
                        gapDetector = new DataGapFastDetector(engine.getDataService(), parameterService, engine.getContextService(), symmetricDialect, this, engine.getStatisticManager(), engine.getNodeService());
                    } else {
                        gapDetector = new DataGapDetector(engine.getDataService(), parameterService, symmetricDialect, this, engine.getStatisticManager(), engine.getNodeService());
                    }
                }
                insertInitialLoadEvents();
                long ts = System.currentTimeMillis();
                gapDetector.beforeRouting();
                dataCount = routeDataForEachChannel();
                ts = System.currentTimeMillis() - ts;
                if (dataCount > 0 || ts > Constants.LONG_OPERATION_THRESHOLD) {
                    log.info("Routed {} data events in {} ms", dataCount, ts);
                }
                if (dataCount > 0) {
                    gapDetector.afterRouting();
                }
            } finally {
                if (!force) {
                    engine.getClusterService().unlock(ClusterConstants.ROUTE);
                }
            }
        }
    }
    return dataCount;
}
Also used : DataGapFastDetector(org.jumpmind.symmetric.route.DataGapFastDetector) DataGapDetector(org.jumpmind.symmetric.route.DataGapDetector) Node(org.jumpmind.symmetric.model.Node)

Example 43 with Node

use of org.jumpmind.symmetric.model.Node in project symmetric-ds by JumpMind.

the class RouterService method findAvailableNodes.

protected Set<Node> findAvailableNodes(TriggerRouter triggerRouter, ChannelRouterContext context) {
    Set<Node> nodes = context.getAvailableNodes().get(triggerRouter);
    if (nodes == null) {
        nodes = new HashSet<Node>();
        Router router = triggerRouter.getRouter();
        NodeGroupLink link = engine.getConfigurationService().getNodeGroupLinkFor(router.getNodeGroupLink().getSourceNodeGroupId(), router.getNodeGroupLink().getTargetNodeGroupId(), false);
        if (link != null) {
            nodes.addAll(engine.getNodeService().findEnabledNodesFromNodeGroup(router.getNodeGroupLink().getTargetNodeGroupId()));
        } else {
            log.error("The router {} has no node group link configured from {} to {}", new Object[] { router.getRouterId(), router.getNodeGroupLink().getSourceNodeGroupId(), router.getNodeGroupLink().getTargetNodeGroupId() });
        }
        context.getAvailableNodes().put(triggerRouter, nodes);
    }
    return engine.getGroupletService().getTargetEnabled(triggerRouter, nodes);
}
Also used : Node(org.jumpmind.symmetric.model.Node) TriggerRouter(org.jumpmind.symmetric.model.TriggerRouter) AuditTableDataRouter(org.jumpmind.symmetric.route.AuditTableDataRouter) LookupTableDataRouter(org.jumpmind.symmetric.route.LookupTableDataRouter) AbstractFileParsingRouter(org.jumpmind.symmetric.route.AbstractFileParsingRouter) ConfigurationChangedDataRouter(org.jumpmind.symmetric.route.ConfigurationChangedDataRouter) SubSelectDataRouter(org.jumpmind.symmetric.route.SubSelectDataRouter) FileSyncDataRouter(org.jumpmind.symmetric.route.FileSyncDataRouter) ColumnMatchDataRouter(org.jumpmind.symmetric.route.ColumnMatchDataRouter) Router(org.jumpmind.symmetric.model.Router) DefaultDataRouter(org.jumpmind.symmetric.route.DefaultDataRouter) BshDataRouter(org.jumpmind.symmetric.route.BshDataRouter) IDataRouter(org.jumpmind.symmetric.route.IDataRouter) DBFRouter(org.jumpmind.symmetric.route.DBFRouter) NodeGroupLink(org.jumpmind.symmetric.model.NodeGroupLink)

Example 44 with Node

use of org.jumpmind.symmetric.model.Node in project symmetric-ds by JumpMind.

the class RouterService method insertInitialLoadEvents.

/**
     * If a load has been queued up by setting the initial load enabled or
     * reverse initial load enabled flags, then the router service will insert
     * the reload events. This process will not run at the same time sync
     * triggers is running.
     */
protected void insertInitialLoadEvents() {
    ProcessInfo processInfo = engine.getStatisticManager().newProcessInfo(new ProcessInfoKey(engine.getNodeService().findIdentityNodeId(), null, ProcessType.INSERT_LOAD_EVENTS));
    processInfo.setStatus(ProcessInfo.Status.PROCESSING);
    try {
        INodeService nodeService = engine.getNodeService();
        Node identity = nodeService.findIdentity();
        if (identity != null) {
            boolean isClusteringEnabled = parameterService.is(ParameterConstants.CLUSTER_LOCKING_ENABLED);
            NodeSecurity identitySecurity = nodeService.findNodeSecurity(identity.getNodeId(), !isClusteringEnabled);
            if (engine.getParameterService().isRegistrationServer() || (identitySecurity != null && !identitySecurity.isRegistrationEnabled() && identitySecurity.getRegistrationTime() != null)) {
                List<NodeSecurity> nodeSecurities = findNodesThatAreReadyForInitialLoad();
                if (nodeSecurities != null && nodeSecurities.size() > 0) {
                    gapDetector.setFullGapAnalysis(true);
                    boolean reverseLoadFirst = parameterService.is(ParameterConstants.INITIAL_LOAD_REVERSE_FIRST);
                    boolean isInitialLoadQueued = false;
                    for (NodeSecurity security : nodeSecurities) {
                        if (engine.getTriggerRouterService().getActiveTriggerHistories().size() > 0) {
                            boolean thisMySecurityRecord = security.getNodeId().equals(identity.getNodeId());
                            boolean reverseLoadQueued = security.isRevInitialLoadEnabled();
                            boolean initialLoadQueued = security.isInitialLoadEnabled();
                            boolean registered = security.getRegistrationTime() != null;
                            if (thisMySecurityRecord && reverseLoadQueued && (reverseLoadFirst || !initialLoadQueued)) {
                                sendReverseInitialLoad(processInfo);
                            } else if (!thisMySecurityRecord && registered && initialLoadQueued && (!reverseLoadFirst || !reverseLoadQueued)) {
                                long ts = System.currentTimeMillis();
                                engine.getDataService().insertReloadEvents(engine.getNodeService().findNode(security.getNodeId()), false, processInfo);
                                isInitialLoadQueued = true;
                                ts = System.currentTimeMillis() - ts;
                                if (ts > Constants.LONG_OPERATION_THRESHOLD) {
                                    log.warn("Inserted reload events for node {} took longer than expected.  It took {} ms", security.getNodeId(), ts);
                                } else {
                                    log.info("Inserted reload events for node {} in {} ms", security.getNodeId(), ts);
                                }
                            }
                        } else {
                            List<NodeGroupLink> links = engine.getConfigurationService().getNodeGroupLinksFor(parameterService.getNodeGroupId(), false);
                            if (links == null || links.size() == 0) {
                                log.warn("Could not queue up a load for {} because a node group link is NOT configured over which a load could be delivered", security.getNodeId());
                            } else {
                                log.warn("Could not queue up a load for {} because sync triggers has not yet run", security.getNodeId());
                                if (!syncTriggersBeforeInitialLoadAttempted) {
                                    syncTriggersBeforeInitialLoadAttempted = true;
                                    engine.getTriggerRouterService().syncTriggers();
                                }
                            }
                        }
                    }
                    if (isInitialLoadQueued) {
                        gapDetector.setFullGapAnalysis(true);
                    }
                }
                processTableRequestLoads(identity, processInfo);
            }
        }
        processInfo.setStatus(ProcessInfo.Status.OK);
    } catch (Exception ex) {
        processInfo.setStatus(ProcessInfo.Status.ERROR);
        log.error("", ex);
    }
}
Also used : NodeSecurity(org.jumpmind.symmetric.model.NodeSecurity) INodeService(org.jumpmind.symmetric.service.INodeService) Node(org.jumpmind.symmetric.model.Node) ProcessInfoKey(org.jumpmind.symmetric.model.ProcessInfoKey) ProcessInfo(org.jumpmind.symmetric.model.ProcessInfo) NodeGroupLink(org.jumpmind.symmetric.model.NodeGroupLink) SyntaxParsingException(org.jumpmind.symmetric.SyntaxParsingException) SymmetricException(org.jumpmind.symmetric.SymmetricException) DelayRoutingException(org.jumpmind.symmetric.route.DelayRoutingException)

Example 45 with Node

use of org.jumpmind.symmetric.model.Node in project symmetric-ds by JumpMind.

the class RouterService method shouldDataBeRouted.

/**
     * For use in data load events
     */
public boolean shouldDataBeRouted(SimpleRouterContext context, DataMetaData dataMetaData, Node node, boolean initialLoad, boolean initialLoadSelectUsed, TriggerRouter triggerRouter) {
    IDataRouter router = getDataRouter(dataMetaData.getRouter());
    Set<Node> oneNodeSet = new HashSet<Node>(1);
    oneNodeSet.add(node);
    Collection<String> nodeIds = router.routeToNodes(context, dataMetaData, oneNodeSet, initialLoad, initialLoadSelectUsed, triggerRouter);
    return nodeIds != null && nodeIds.contains(node.getNodeId());
}
Also used : IDataRouter(org.jumpmind.symmetric.route.IDataRouter) Node(org.jumpmind.symmetric.model.Node) HashSet(java.util.HashSet)

Aggregations

Node (org.jumpmind.symmetric.model.Node)129 HashSet (java.util.HashSet)18 ProcessInfo (org.jumpmind.symmetric.model.ProcessInfo)18 Test (org.junit.Test)18 TriggerHistory (org.jumpmind.symmetric.model.TriggerHistory)17 ArrayList (java.util.ArrayList)14 NetworkedNode (org.jumpmind.symmetric.model.NetworkedNode)14 NodeChannel (org.jumpmind.symmetric.model.NodeChannel)14 NodeSecurity (org.jumpmind.symmetric.model.NodeSecurity)13 ProcessInfoKey (org.jumpmind.symmetric.model.ProcessInfoKey)13 Table (org.jumpmind.db.model.Table)12 Data (org.jumpmind.symmetric.model.Data)12 Router (org.jumpmind.symmetric.model.Router)12 Date (java.util.Date)11 NodeGroupLink (org.jumpmind.symmetric.model.NodeGroupLink)11 IOException (java.io.IOException)10 DataMetaData (org.jumpmind.symmetric.model.DataMetaData)10 HashMap (java.util.HashMap)9 OutgoingBatch (org.jumpmind.symmetric.model.OutgoingBatch)9 ISqlTransaction (org.jumpmind.db.sql.ISqlTransaction)8