Search in sources :

Example 6 with GatewaySenderStats

use of org.apache.geode.internal.cache.wan.GatewaySenderStats in project geode by apache.

the class SerialGatewaySenderEventProcessor method handleFailover.

/**
   * Handle failover. This method is called when a secondary <code>GatewaySender</code> becomes a
   * primary <code>GatewaySender</code>.
   * 
   * Once this secondary becomes the primary, it must:
   * <ul>
   * <li>Remove the queue's CacheListener
   * <li>Process the map of unprocessed events (those it has seen but the previous primary had not
   * yet processed before it crashed). These will include both queued and unqueued events. Remove
   * from the queue any events that were already sent
   * <li>Clear the unprocessed events map
   * </ul>
   */
protected void handleFailover() {
    /*
     * We must hold this lock while we're processing these maps to prevent us from handling a
     * secondary event while failover occurs. See enqueueEvent
     */
    synchronized (this.unprocessedEventsLock) {
        // Remove the queue's CacheListener
        this.queue.removeCacheListener();
        this.unprocessedTokens = null;
        // Process the map of unprocessed events
        logger.info(LocalizedMessage.create(LocalizedStrings.GatewayImpl_GATEWAY_FAILOVER_INITIATED_PROCESSING_0_UNPROCESSED_EVENTS, this.unprocessedEvents.size()));
        GatewaySenderStats statistics = this.sender.getStatistics();
        if (!this.unprocessedEvents.isEmpty()) {
            // do a reap for bug 37603
            // to get rid of timed out events
            reapOld(statistics, true);
            // now iterate over the region queue to figure out what unprocessed
            // events are already in the queue
            {
                Iterator it = this.queue.getRegion().values().iterator();
                while (it.hasNext() && !stopped()) {
                    Object o = it.next();
                    if (o != null && o instanceof GatewaySenderEventImpl) {
                        GatewaySenderEventImpl ge = (GatewaySenderEventImpl) o;
                        EventWrapper unprocessedEvent = this.unprocessedEvents.remove(ge.getEventId());
                        if (unprocessedEvent != null) {
                            unprocessedEvent.event.release();
                            if (this.unprocessedEvents.isEmpty()) {
                                break;
                            }
                        }
                    }
                }
            }
            // now for every unprocessed event add it to the end of the queue
            {
                Iterator<Map.Entry<EventID, EventWrapper>> it = this.unprocessedEvents.entrySet().iterator();
                while (it.hasNext()) {
                    if (stopped())
                        break;
                    Map.Entry<EventID, EventWrapper> me = it.next();
                    EventWrapper ew = me.getValue();
                    GatewaySenderEventImpl gatewayEvent = ew.event;
                    // Initialize each gateway event. This initializes the key,
                    // value
                    // and callback arg based on the EntryEvent.
                    // TODO:wan70, remove dependencies from old code
                    gatewayEvent.initialize();
                    // Verify that they GatewayEventCallbackArgument is initialized.
                    // If not, initialize it. It won't be initialized if a client to
                    // this GatewayHub VM was the creator of this event. This Gateway
                    // will be the first one to process it. If will be initialized if
                    // this event was sent to this Gateway from another GatewayHub
                    // (either directly or indirectly).
                    GatewaySenderEventCallbackArgument seca = gatewayEvent.getSenderCallbackArgument();
                    if (seca.getOriginatingDSId() == GatewaySender.DEFAULT_DISTRIBUTED_SYSTEM_ID) {
                        seca.setOriginatingDSId(sender.getMyDSId());
                        seca.initializeReceipientDSIds(Collections.singletonList(sender.getRemoteDSId()));
                    }
                    it.remove();
                    boolean queuedEvent = false;
                    try {
                        queuedEvent = queuePrimaryEvent(gatewayEvent);
                    } catch (IOException ex) {
                        if (!stopped()) {
                            logger.warn(LocalizedMessage.create(LocalizedStrings.GatewayImpl_EVENT_DROPPED_DURING_FAILOVER_0, gatewayEvent), ex);
                        }
                    } catch (CacheException ex) {
                        if (!stopped()) {
                            logger.warn(LocalizedMessage.create(LocalizedStrings.GatewayImpl_EVENT_DROPPED_DURING_FAILOVER_0, gatewayEvent), ex);
                        }
                    } finally {
                        if (!queuedEvent) {
                            gatewayEvent.release();
                        }
                    }
                }
            }
            // Clear the unprocessed events map
            statistics.clearUnprocessedMaps();
        }
        // Iterate the entire queue and mark all events as possible
        // duplicate
        logger.info(LocalizedMessage.create(LocalizedStrings.GatewayImpl_0__MARKING__1__EVENTS_AS_POSSIBLE_DUPLICATES, new Object[] { getSender(), Integer.valueOf(this.queue.size()) }));
        Iterator it = this.queue.getRegion().values().iterator();
        while (it.hasNext() && !stopped()) {
            Object o = it.next();
            if (o != null && o instanceof GatewaySenderEventImpl) {
                GatewaySenderEventImpl ge = (GatewaySenderEventImpl) o;
                ge.setPossibleDuplicate(true);
            }
        }
        releaseUnprocessedEvents();
    }
// synchronized
}
Also used : GatewaySenderStats(org.apache.geode.internal.cache.wan.GatewaySenderStats) CacheException(org.apache.geode.cache.CacheException) Iterator(java.util.Iterator) GatewaySenderEventImpl(org.apache.geode.internal.cache.wan.GatewaySenderEventImpl) EventID(org.apache.geode.internal.cache.EventID) GatewaySenderEventCallbackArgument(org.apache.geode.internal.cache.wan.GatewaySenderEventCallbackArgument) IOException(java.io.IOException) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) EventWrapper(org.apache.geode.internal.cache.wan.AbstractGatewaySender.EventWrapper)

Example 7 with GatewaySenderStats

use of org.apache.geode.internal.cache.wan.GatewaySenderStats in project geode by apache.

the class SerialGatewaySenderEventProcessor method basicHandlePrimaryDestroy.

/**
   * Just remove the event from the unprocessed events map if it is present. This method added to
   * fix bug 37603
   */
protected void basicHandlePrimaryDestroy(final GatewaySenderEventImpl gatewayEvent) {
    if (this.sender.isPrimary()) {
        // no need to do anything if we have become the primary
        return;
    }
    GatewaySenderStats statistics = this.sender.getStatistics();
    // Get the event from the map
    synchronized (unprocessedEventsLock) {
        if (this.unprocessedEvents == null)
            return;
        // now we can safely use the unprocessedEvents field
        EventWrapper ew = this.unprocessedEvents.remove(gatewayEvent.getEventId());
        if (ew != null) {
            ew.event.release();
            statistics.incUnprocessedEventsRemovedByPrimary();
        }
    }
}
Also used : GatewaySenderStats(org.apache.geode.internal.cache.wan.GatewaySenderStats) EventWrapper(org.apache.geode.internal.cache.wan.AbstractGatewaySender.EventWrapper)

Example 8 with GatewaySenderStats

use of org.apache.geode.internal.cache.wan.GatewaySenderStats in project geode by apache.

the class RemoteParallelGatewaySenderEventProcessor method rebalance.

@Override
protected void rebalance() {
    GatewaySenderStats statistics = this.sender.getStatistics();
    long startTime = statistics.startLoadBalance();
    try {
        if (this.dispatcher.isRemoteDispatcher()) {
            GatewaySenderEventRemoteDispatcher remoteDispatcher = (GatewaySenderEventRemoteDispatcher) this.dispatcher;
            if (remoteDispatcher.isConnectedToRemote()) {
                remoteDispatcher.stopAckReaderThread();
                remoteDispatcher.destroyConnection();
            }
        }
    } finally {
        statistics.endLoadBalance(startTime);
    }
}
Also used : GatewaySenderStats(org.apache.geode.internal.cache.wan.GatewaySenderStats) GatewaySenderEventRemoteDispatcher(org.apache.geode.internal.cache.wan.GatewaySenderEventRemoteDispatcher)

Example 9 with GatewaySenderStats

use of org.apache.geode.internal.cache.wan.GatewaySenderStats in project geode by apache.

the class RemoteConcurrentParallelGatewaySenderEventProcessor method rebalance.

@Override
protected void rebalance() {
    GatewaySenderStats statistics = this.sender.getStatistics();
    long startTime = statistics.startLoadBalance();
    try {
        for (ParallelGatewaySenderEventProcessor parallelProcessor : this.processors) {
            GatewaySenderEventRemoteDispatcher remoteDispatcher = (GatewaySenderEventRemoteDispatcher) parallelProcessor.getDispatcher();
            if (remoteDispatcher.isConnectedToRemote()) {
                remoteDispatcher.stopAckReaderThread();
                remoteDispatcher.destroyConnection();
            }
        }
    } finally {
        statistics.endLoadBalance(startTime);
    }
}
Also used : GatewaySenderStats(org.apache.geode.internal.cache.wan.GatewaySenderStats) GatewaySenderEventRemoteDispatcher(org.apache.geode.internal.cache.wan.GatewaySenderEventRemoteDispatcher) ParallelGatewaySenderEventProcessor(org.apache.geode.internal.cache.wan.parallel.ParallelGatewaySenderEventProcessor)

Example 10 with GatewaySenderStats

use of org.apache.geode.internal.cache.wan.GatewaySenderStats in project geode by apache.

the class ParallelGatewaySenderQueueJUnitTest method mockGatewaySenderStats.

private GatewaySenderStats mockGatewaySenderStats() {
    GatewaySenderStats stats = mock(GatewaySenderStats.class);
    when(sender.getStatistics()).thenReturn(stats);
    return stats;
}
Also used : GatewaySenderStats(org.apache.geode.internal.cache.wan.GatewaySenderStats)

Aggregations

GatewaySenderStats (org.apache.geode.internal.cache.wan.GatewaySenderStats)11 EventWrapper (org.apache.geode.internal.cache.wan.AbstractGatewaySender.EventWrapper)4 GatewaySenderEventImpl (org.apache.geode.internal.cache.wan.GatewaySenderEventImpl)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 LinkedList (java.util.LinkedList)2 List (java.util.List)2 Queue (java.util.Queue)2 CacheException (org.apache.geode.cache.CacheException)2 AbstractBucketRegionQueue (org.apache.geode.internal.cache.AbstractBucketRegionQueue)2 BucketRegionQueue (org.apache.geode.internal.cache.BucketRegionQueue)2 GatewaySenderEventRemoteDispatcher (org.apache.geode.internal.cache.wan.GatewaySenderEventRemoteDispatcher)2 UnitTest (org.apache.geode.test.junit.categories.UnitTest)2 Test (org.junit.Test)2 Iterator (java.util.Iterator)1 LinkedHashMap (java.util.LinkedHashMap)1 Map (java.util.Map)1 RejectedExecutionException (java.util.concurrent.RejectedExecutionException)1 CancelException (org.apache.geode.CancelException)1 RegionDestroyedException (org.apache.geode.cache.RegionDestroyedException)1