1 21 22 package org.continuent.sequoia.controller.virtualdatabase.protocol; 23 24 import java.io.Serializable ; 25 import java.sql.SQLException ; 26 import java.util.LinkedList ; 27 28 import org.continuent.hedera.common.Member; 29 import org.continuent.sequoia.common.exceptions.VirtualDatabaseException; 30 import org.continuent.sequoia.common.i18n.Translate; 31 import org.continuent.sequoia.common.log.Trace; 32 import org.continuent.sequoia.controller.scheduler.AbstractScheduler; 33 import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase; 34 35 47 public class SuspendActivity extends DistributedVirtualDatabaseMessage 48 { 49 private static final long serialVersionUID = -8451114082404567986L; 50 51 private transient LinkedList totalOrderQueue; 52 53 56 public SuspendActivity() 57 { 58 } 59 60 64 public Object handleMessageSingleThreaded(DistributedVirtualDatabase dvdb, 65 Member sender) 66 { 67 totalOrderQueue = dvdb.getTotalOrderQueue(); 68 if (totalOrderQueue == null) 69 return new VirtualDatabaseException(Translate 70 .get("virtualdatabase.no.total.order.queue", dvdb 71 .getVirtualDatabaseName())); 72 73 synchronized (totalOrderQueue) 74 { 75 SuspendWritesMessage request = new SuspendWritesMessage( 76 "Suspend activity"); 77 totalOrderQueue.addLast(request); 78 return request; 79 } 80 } 81 82 86 public Serializable handleMessageMultiThreaded( 87 DistributedVirtualDatabase dvdb, Member sender, 88 Object handleMessageSingleThreadedResult) 89 { 90 Trace logger = dvdb.getLogger(); 91 92 boolean found = dvdb.waitForTotalOrder(handleMessageSingleThreadedResult, 94 false); 95 96 AbstractScheduler scheduler = dvdb.getRequestManager().getScheduler(); 97 98 scheduler.suspendNewPersistentConnections(); 100 101 scheduler.suspendNewTransactionsAndWrites(); 103 104 if (!found) 106 logger 107 .error("Suspend activity was not found in total order queue, posting out of order"); 108 else 109 synchronized (totalOrderQueue) 110 { 111 totalOrderQueue.removeFirst(); 112 totalOrderQueue.notifyAll(); 113 } 114 115 try 117 { 118 scheduler.waitForSuspendedWritesToComplete(); 119 } 120 catch (SQLException e) 121 { 122 dvdb.getLogger().error("Failed to wait for writes to complete"); 123 return e; 124 } 125 126 try 128 { 129 scheduler.waitForSuspendedTransactionsToComplete(); 130 } 131 catch (SQLException e) 132 { 133 dvdb.getLogger().error( 134 "Failed to wait for suspended transactions to complete"); 135 return e; 136 } 137 138 try 140 { 141 scheduler.waitForPersistentConnectionsToComplete(); 142 } 143 catch (SQLException e) 144 { 145 dvdb.getLogger().error( 146 "Failed to wait for persistent connections to close"); 147 return e; 148 } 149 150 if (!dvdb.hasRecoveryLog()) 151 { 152 scheduler.resumeWritesTransactionsAndPersistentConnections(); 154 return new VirtualDatabaseException(Translate 155 .get("virtualdatabase.no.recovery.log")); 156 } 157 158 return null; 159 } 160 161 164 public void cancel(DistributedVirtualDatabase dvdb) 165 { 166 if (dvdb.getLogger().isWarnEnabled()) 167 dvdb 168 .getLogger() 169 .warn( 170 "Canceling SuspendActivity message: resuming writes, transactions and persistent connections"); 171 AbstractScheduler scheduler = dvdb.getRequestManager().getScheduler(); 172 scheduler.resumeWritesTransactionsAndPersistentConnections(); 173 } 174 } 175 | Popular Tags |