001: /**
002: * Sequoia: Database clustering technology.
003: * Copyright (C) 2006 Continuent, Inc.
004: * Contact: sequoia@continuent.org
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * Initial developer(s): Emmanuel Cecchet.
019: * Contributor(s): Damian Arregui.
020: */package org.continuent.sequoia.controller.virtualdatabase.protocol;
021:
022: import java.io.Serializable;
023: import java.util.LinkedList;
024:
025: import org.continuent.hedera.common.Member;
026: import org.continuent.sequoia.common.exceptions.VirtualDatabaseException;
027: import org.continuent.sequoia.common.i18n.Translate;
028: import org.continuent.sequoia.common.log.Trace;
029: import org.continuent.sequoia.controller.scheduler.AbstractScheduler;
030: import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase;
031:
032: /**
033: * This class defines a ResumeActivity message. It undoes the affects of
034: * SuspendActivity. When executed it does the following things:
035: * <ol>
036: * <li>Resume writes, transactions and persistent connections.
037: * <li>Only waits for BlockActivity and SuspendActivity distributed messages in
038: * the total order queue before executing.
039: * </ol>
040: * <p>
041: *
042: * @see BlockActivity
043: * @see SuspendActivity
044: * @author <a href="mailto:ralph.hannus@continuent.com">Ralph Hannus</a>
045: * @author <a href="mailto:damian.arregui@continuent.com">Damian Arregui</a>
046: * @version 1.0
047: */
048: public class ResumeActivity extends DistributedVirtualDatabaseMessage {
049: private static final long serialVersionUID = 7285174496382359441L;
050:
051: private transient LinkedList totalOrderQueue;
052:
053: /**
054: * Creates a new <code>ResumeActivity</code> object
055: */
056: public ResumeActivity() {
057: }
058:
059: /**
060: * @see org.continuent.sequoia.controller.virtualdatabase.protocol.DistributedVirtualDatabaseMessage#handleMessageSingleThreaded(org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase,
061: * org.continuent.hedera.common.Member)
062: */
063: public Object handleMessageSingleThreaded(
064: DistributedVirtualDatabase dvdb, Member sender) {
065: totalOrderQueue = dvdb.getTotalOrderQueue();
066: if (totalOrderQueue == null)
067: return new VirtualDatabaseException(Translate.get(
068: "virtualdatabase.no.total.order.queue", dvdb
069: .getVirtualDatabaseName()));
070:
071: synchronized (totalOrderQueue) {
072: ResumeActivityMessage request = new ResumeActivityMessage();
073: totalOrderQueue.addLast(request);
074: return request;
075: }
076: }
077:
078: /**
079: * @see org.continuent.sequoia.controller.virtualdatabase.protocol.DistributedVirtualDatabaseMessage#handleMessageMultiThreaded(org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase,
080: * org.continuent.hedera.common.Member, java.lang.Object)
081: */
082: public Serializable handleMessageMultiThreaded(
083: DistributedVirtualDatabase dvdb, Member sender,
084: Object handleMessageSingleThreadedResult) {
085: Trace logger = dvdb.getLogger();
086:
087: // Wait for our turn to execute
088: boolean found = dvdb.waitForBlockAndSuspendInTotalOrder(
089: handleMessageSingleThreadedResult, false);
090:
091: AbstractScheduler scheduler = dvdb.getRequestManager()
092: .getScheduler();
093: scheduler.resumeWritesTransactionsAndPersistentConnections();
094: dvdb.removeOngoingActivitySuspension(sender);
095:
096: // Remove ourselves from the queue to allow others to complete if needed
097: if (!found)
098: logger
099: .error("Resume activity was not found in total order queue, posting out of order");
100: else
101: synchronized (totalOrderQueue) {
102: totalOrderQueue
103: .remove(handleMessageSingleThreadedResult);
104: totalOrderQueue.notifyAll();
105: }
106:
107: return null;
108: }
109: }
|