1 24 25 package org.continuent.sequoia.controller.virtualdatabase.protocol; 26 27 import java.io.Serializable ; 28 import java.util.LinkedList ; 29 30 import org.continuent.hedera.common.Member; 31 import org.continuent.sequoia.common.exceptions.VirtualDatabaseException; 32 import org.continuent.sequoia.common.i18n.Translate; 33 import org.continuent.sequoia.common.jmx.management.BackendInfo; 34 import org.continuent.sequoia.common.log.Trace; 35 import org.continuent.sequoia.controller.backend.DatabaseBackend; 36 import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase; 37 38 47 public class BackendTransfer extends DistributedVirtualDatabaseMessage 48 { 49 private static final long serialVersionUID = 520265407391630486L; 50 51 private BackendInfo info; 52 private String controllerDest; 53 private String checkpointName; 54 55 private transient LinkedList totalOrderQueue; 56 57 64 public BackendTransfer(String controllerDest, String checkpointName, 65 BackendInfo info) 66 { 67 this.info = info; 68 this.controllerDest = controllerDest; 69 this.checkpointName = checkpointName; 70 } 71 72 77 public String getControllerDest() 78 { 79 return controllerDest; 80 } 81 82 87 public BackendInfo getInfo() 88 { 89 return info; 90 } 91 92 97 public String getCheckpointName() 98 { 99 return checkpointName; 100 } 101 102 106 public Object handleMessageSingleThreaded(DistributedVirtualDatabase dvdb, 107 Member sender) 108 { 109 totalOrderQueue = dvdb.getTotalOrderQueue(); 110 if (totalOrderQueue == null) 111 return new VirtualDatabaseException(Translate 112 .get("virtualdatabase.no.total.order.queue", dvdb 113 .getVirtualDatabaseName())); 114 115 synchronized (totalOrderQueue) 116 { 117 totalOrderQueue.addLast(this); 118 return this; 119 } 120 } 121 122 126 public Serializable handleMessageMultiThreaded( 127 DistributedVirtualDatabase dvdb, Member sender, 128 Object handleMessageSingleThreadedResult) 129 { 130 Trace logger = dvdb.getLogger(); 131 132 if (!dvdb.waitForTotalOrder(handleMessageSingleThreadedResult, false)) 134 logger 135 .error("BackendTransfer was not found in total order queue, posting out of order (" 136 + checkpointName + ")"); 137 else 138 synchronized (totalOrderQueue) 139 { 140 totalOrderQueue.removeFirst(); 141 totalOrderQueue.notifyAll(); 142 } 143 144 if (logger.isInfoEnabled()) 145 logger.info(dvdb.getControllerName() 146 + ": Received transfer command. Checkpoint: " + getCheckpointName()); 147 DatabaseBackend backend = new DatabaseBackend(dvdb, info); 148 149 try 150 { 151 dvdb.addBackend(backend); 152 } 153 catch (VirtualDatabaseException e) 154 { 155 return e; 159 } 160 161 try 162 { 163 if (logger.isInfoEnabled()) 164 logger.info(dvdb.getControllerName() + ": Enable backend from " 165 + checkpointName); 166 dvdb.enableBackendFromCheckpoint(backend.getName(), getCheckpointName()); 167 } 168 catch (VirtualDatabaseException e) 169 { 170 cleanup(dvdb, backend); 174 return e; 175 } 176 return Boolean.TRUE; 177 } 178 179 void cleanup(DistributedVirtualDatabase dvdb, DatabaseBackend backend) 180 { 181 try 182 { 183 dvdb.removeBackend(backend); 184 } 185 catch (VirtualDatabaseException e) 186 { 187 dvdb.getLogger().error( 188 "Could not cleanup vdb after transfer backend failure", e); 189 } 190 } 191 } | Popular Tags |