1 21 22 package org.continuent.sequoia.controller.virtualdatabase.protocol; 23 24 import java.io.Serializable ; 25 import java.util.LinkedList ; 26 27 import org.continuent.hedera.common.Member; 28 import org.continuent.sequoia.common.exceptions.VirtualDatabaseException; 29 import org.continuent.sequoia.common.i18n.Translate; 30 import org.continuent.sequoia.common.log.Trace; 31 import org.continuent.sequoia.controller.recoverylog.RecoveryLog; 32 import org.continuent.sequoia.controller.virtualdatabase.DistributedVirtualDatabase; 33 34 41 public class CompleteRecoveryLogResync 42 extends DistributedVirtualDatabaseMessage 43 { 44 private static final long serialVersionUID = 5811295250708240645L; 45 46 private long commonCheckpointId; 47 private String commonCheckpointName; 48 private String nowCheckpointName; 49 private long nbOfEntriesToResync; 50 51 private transient LinkedList totalOrderQueue; 52 53 65 public CompleteRecoveryLogResync(long commonCheckpointId, 66 String nowCheckpointName, long nbOfEntriesToResync) 67 { 68 this.commonCheckpointId = commonCheckpointId; 69 this.nowCheckpointName = nowCheckpointName; 70 this.nbOfEntriesToResync = nbOfEntriesToResync; 71 } 72 73 85 public CompleteRecoveryLogResync(String commonCheckpointName, 86 String nowCheckpointName, long nbOfEntriesToResync) 87 { 88 this.commonCheckpointName = commonCheckpointName; 89 this.nowCheckpointName = nowCheckpointName; 90 this.nbOfEntriesToResync = nbOfEntriesToResync; 91 } 92 93 97 public Object handleMessageSingleThreaded(DistributedVirtualDatabase dvdb, 98 Member sender) 99 { 100 if (!dvdb.hasRecoveryLog()) 101 return new VirtualDatabaseException(Translate 102 .get("virtualdatabase.no.recovery.log")); 103 104 totalOrderQueue = dvdb.getTotalOrderQueue(); 105 if (totalOrderQueue == null) 106 return new VirtualDatabaseException(Translate 107 .get("virtualdatabase.no.total.order.queue", dvdb.getVirtualDatabaseName())); 108 109 synchronized (totalOrderQueue) 110 { 111 totalOrderQueue.addLast(this); 112 return this; 113 } 114 } 115 116 120 public Serializable handleMessageMultiThreaded( 121 DistributedVirtualDatabase dvdb, Member sender, 122 Object handleMessageSingleThreadedResult) 123 { 124 if (!dvdb.hasRecoveryLog()) 125 return new VirtualDatabaseException(Translate 126 .get("virtualdatabase.no.recovery.log")); 127 128 Trace logger = dvdb.getLogger(); 129 try 130 { 131 if (!dvdb.waitForTotalOrder(handleMessageSingleThreadedResult, false)) 133 logger 134 .error("CompleteRecoveryLogResync was not found in total order queue, posting out of order (" 135 + commonCheckpointName + ")"); 136 else 137 synchronized (totalOrderQueue) 138 { 139 totalOrderQueue.removeFirst(); 140 totalOrderQueue.notifyAll(); 141 } 142 143 RecoveryLog recoveryLog = dvdb.getRequestManager().getRecoveryLog(); 144 long nowCheckpointId = recoveryLog.getCheckpointLogId(nowCheckpointName); 145 if (commonCheckpointName != null) 146 { 147 commonCheckpointId = recoveryLog 148 .getCheckpointLogId(commonCheckpointName); 149 } 150 long localNbOfLogEntries = recoveryLog.getNumberOfLogEntries( 151 commonCheckpointId, nowCheckpointId); 152 long diff = localNbOfLogEntries - nbOfEntriesToResync; 153 154 if (logger.isDebugEnabled()) 155 { 156 logger.debug("Recovery log is being resynchronized between " 157 + commonCheckpointName + "and " + nowCheckpointId + " (" 158 + nowCheckpointName + ")"); 159 logger.debug("Recovery log has resynchronized " + localNbOfLogEntries 160 + "entries (diff with remote controller is " + diff + ")"); 161 } 162 163 if (diff != 0) 164 logger 165 .error("Detected inconsistency in restore log operation, logs differ by " 166 + diff 167 + " entries (original was " 168 + nbOfEntriesToResync 169 + ", local is " + localNbOfLogEntries + ")"); 170 else 171 logger.info("Recovery log re-synchronized " + nbOfEntriesToResync 172 + " entries successfully"); 173 174 return new Long (diff); 176 } 177 catch (Exception e) 178 { 179 logger.error("Unable to complete recovery log resynchronization", e); 180 return new VirtualDatabaseException( 181 "Unable to complete recovery log resynchronization", e); 182 } 183 } 184 } 185 | Popular Tags |