1 24 25 package org.continuent.sequoia.controller.virtualdatabase.protocol; 26 27 import java.io.Serializable ; 28 import java.sql.SQLException ; 29 import java.util.LinkedList ; 30 31 import org.continuent.sequoia.common.exceptions.NoMoreBackendException; 32 import org.continuent.sequoia.common.i18n.Translate; 33 import org.continuent.sequoia.controller.loadbalancer.AllBackendsFailedException; 34 import org.continuent.sequoia.controller.requestmanager.TransactionMetaData; 35 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager; 36 import org.continuent.sequoia.controller.requests.AbstractRequest; 37 import org.continuent.sequoia.controller.requests.UnknownWriteRequest; 38 import org.continuent.sequoia.controller.sql.schema.DatabaseSchema; 39 40 49 public class DistributedSetSavepoint extends DistributedTransactionMarker 50 { 51 private static final long serialVersionUID = 1429582815473734482L; 52 53 private String login; 56 57 private String savepointName; 58 59 66 public DistributedSetSavepoint(String login, long transactionId, 67 String savepointName) 68 { 69 super(transactionId); 70 this.login = login; 71 this.savepointName = savepointName; 72 } 73 74 77 public Object scheduleCommand(DistributedRequestManager drm) 78 throws SQLException 79 { 80 LinkedList totalOrderQueue = drm.getVirtualDatabase().getTotalOrderQueue(); 81 if (totalOrderQueue != null) 82 { 83 synchronized (totalOrderQueue) 84 { 85 totalOrderQueue.addLast(this); 86 } 87 } 88 return this; 89 } 90 91 94 public Serializable executeCommand(DistributedRequestManager drm) 95 throws SQLException 96 { 97 boolean hasBeenScheduled = false; 98 99 Long tid = new Long (transactionId); 102 TransactionMetaData tm; 103 try 104 { 105 tm = drm.getTransactionMetaData(tid); 106 } 107 catch (SQLException e) 108 { 109 FakeRequest fr = new FakeRequest(); 111 fr.setIsAutoCommit(false); 112 fr.setTransactionId(transactionId); 113 fr.setLogin(login); 114 drm.lazyTransactionStart(fr); 115 tm = drm.getTransactionMetaData(tid); 116 } 117 118 try 119 { 120 drm.getScheduler().setSavepoint(tm, savepointName, this); 122 hasBeenScheduled = true; 123 124 if (drm.getLogger().isDebugEnabled()) 125 drm.getLogger().debug( 126 Translate.get("transaction.setsavepoint", new String []{ 127 savepointName, String.valueOf(transactionId)})); 128 129 drm.getLoadBalancer().setSavepoint(tm, savepointName); 131 132 drm.getRecoveryLog().logRequestCompletion(tm.getLogId(), true, 0); 134 135 drm.getScheduler().savepointCompleted(transactionId); 137 } 138 catch (NoMoreBackendException e) 139 { 140 if (drm.getLogger().isDebugEnabled()) 141 drm.getLogger().debug( 142 Translate.get( 143 "virtualdatabase.distributed.setsavepoint.logging.only", 144 new String []{savepointName, String.valueOf(transactionId)})); 145 146 addSavepointFailureOnAllBackends(drm, hasBeenScheduled, tm); 147 throw e; 148 } 149 catch (SQLException e) 150 { 151 addSavepointFailureOnAllBackends(drm, hasBeenScheduled, tm); 152 drm.getLogger().warn( 153 Translate 154 .get("virtualdatabase.distributed.setsavepoint.sqlexception"), e); 155 return e; 156 } 157 catch (RuntimeException re) 158 { 159 addSavepointFailureOnAllBackends(drm, hasBeenScheduled, tm); 160 drm.getLogger().warn( 161 Translate.get("virtualdatabase.distributed.setsavepoint.exception"), 162 re); 163 throw new SQLException (re.getMessage()); 164 } 165 catch (AllBackendsFailedException e) 166 { 167 addSavepointFailureOnAllBackends(drm, hasBeenScheduled, tm); 168 if (drm.getLogger().isDebugEnabled()) 169 drm 170 .getLogger() 171 .debug( 172 Translate 173 .get( 174 "virtualdatabase.distributed.setsavepoint.all.backends.locally.failed", 175 new String []{savepointName, 176 String.valueOf(transactionId)})); 177 return e; 178 } 179 180 drm.addSavepoint(tid, savepointName); 182 return Boolean.TRUE; 183 } 184 185 private void addSavepointFailureOnAllBackends(DistributedRequestManager drm, 186 boolean hasBeenScheduled, TransactionMetaData tm) 187 { 188 AbstractRequest request = new UnknownWriteRequest("savepoint " 189 + savepointName, false, 0, "\n"); 190 request.setTransactionId(transactionId); 191 request.setLogId(tm.getLogId()); 192 drm.addFailedOnAllBackends(request, hasBeenScheduled); 193 } 194 195 200 public String getSavepointName() 201 { 202 return savepointName; 203 } 204 205 208 public boolean equals(Object obj) 209 { 210 if (super.equals(obj)) 211 return savepointName.equals(((DistributedSetSavepoint) obj) 212 .getSavepointName()); 213 else 214 return false; 215 } 216 217 220 public String toString() 221 { 222 return "Set savepoint " + savepointName + " to transaction " 223 + transactionId; 224 } 225 226 private class FakeRequest extends AbstractRequest 229 { 230 private static final long serialVersionUID = 5694250075466219713L; 231 232 236 public FakeRequest() 237 { 238 super(null, false, 0, null, 0); 239 } 240 241 244 public boolean altersAggregateList() 245 { 246 return false; 247 } 248 249 252 public boolean altersDatabaseCatalog() 253 { 254 return false; 255 } 256 257 260 public boolean altersDatabaseSchema() 261 { 262 return false; 263 } 264 265 268 public boolean altersMetadataCache() 269 { 270 return false; 271 } 272 273 276 public boolean altersQueryResultCache() 277 { 278 return false; 279 } 280 281 284 public boolean altersStoredProcedureList() 285 { 286 return false; 287 } 288 289 292 public boolean altersUserDefinedTypes() 293 { 294 return false; 295 } 296 297 300 public boolean altersUsers() 301 { 302 return false; 303 } 304 305 308 public boolean altersSomething() 309 { 310 return false; 311 } 312 313 316 public void cloneParsing(AbstractRequest request) 317 { 318 } 319 320 323 public boolean needsMacroProcessing() 324 { 325 return false; 326 } 327 328 332 public void parse(DatabaseSchema schema, int granularity, 333 boolean isCaseSensitive) throws SQLException 334 { 335 } 336 337 } 338 339 } 340 | Popular Tags |