1 22 23 package org.continuent.sequoia.controller.virtualdatabase.protocol; 24 25 import java.io.Serializable ; 26 import java.sql.SQLException ; 27 import java.util.LinkedList ; 28 29 import org.continuent.sequoia.common.exceptions.NoMoreBackendException; 30 import org.continuent.sequoia.common.i18n.Translate; 31 import org.continuent.sequoia.controller.loadbalancer.AllBackendsFailedException; 32 import org.continuent.sequoia.controller.requestmanager.distributed.DistributedRequestManager; 33 import org.continuent.sequoia.controller.requests.AbstractRequest; 34 import org.continuent.sequoia.controller.requests.AbstractWriteRequest; 35 36 43 public class DistributedStatementExecute extends DistributedRequest 44 { 45 private static final long serialVersionUID = 8634424524848530342L; 46 47 53 public DistributedStatementExecute(AbstractRequest request) 54 { 55 super(request); 56 } 57 58 61 public Object scheduleRequest(DistributedRequestManager drm) 62 throws SQLException 63 { 64 LinkedList totalOrderQueue = drm.getVirtualDatabase().getTotalOrderQueue(); 66 synchronized (totalOrderQueue) 67 { 68 totalOrderQueue.addLast(request); 69 } 70 return null; 71 } 72 73 76 public Serializable executeScheduledRequest(DistributedRequestManager drm) 77 throws SQLException 78 { 79 Serializable result = null; 80 AbstractWriteRequest abstractWriteRequest = (AbstractWriteRequest) request; 81 boolean hasBeenScheduled = false; 82 try 83 { 84 drm.getLoadBalancer() 85 .waitForSuspendWritesToComplete(abstractWriteRequest); 86 drm.lazyTransactionStart(abstractWriteRequest); 88 drm.scheduleExecWriteRequest(abstractWriteRequest); 89 hasBeenScheduled = true; 90 91 if (drm.getLogger().isDebugEnabled()) 92 drm.getLogger().debug( 93 Translate.get("requestmanager.read.stored.procedure", new String []{ 94 String.valueOf(abstractWriteRequest.getId()), 95 abstractWriteRequest.getSqlShortForm(drm.getVirtualDatabase() 96 .getSqlShortFormLength())})); 97 98 result = drm.loadBalanceStatementExecute(abstractWriteRequest); 99 100 if (drm.storeRequestResult(abstractWriteRequest, result)) 101 result = DistributedRequestManager.SUCCESSFUL_COMPLETION; 102 103 drm.updateAndNotifyExecWriteRequest(abstractWriteRequest, -1); 104 105 return result; 106 } 107 catch (NoMoreBackendException e) 108 { 109 if (drm.getLogger().isDebugEnabled()) 110 drm.getLogger().debug( 111 Translate.get( 112 "virtualdatabase.distributed.read.procedure.logging.only", 113 abstractWriteRequest.getSqlShortForm(drm.getVirtualDatabase() 114 .getSqlShortFormLength()))); 115 116 drm.addFailedOnAllBackends(abstractWriteRequest, hasBeenScheduled); 117 return e; 118 } 119 catch (AllBackendsFailedException e) 120 { 121 drm.addFailedOnAllBackends(abstractWriteRequest, hasBeenScheduled); 124 if (drm.getLogger().isDebugEnabled()) 125 drm 126 .getLogger() 127 .debug( 128 Translate 129 .get( 130 "virtualdatabase.distributed.read.procedure.all.backends.locally.failed", 131 abstractWriteRequest.getSqlShortForm(drm 132 .getVirtualDatabase().getSqlShortFormLength()))); 133 return e; 134 } 135 catch (SQLException e) 136 { 137 drm.addFailedOnAllBackends(abstractWriteRequest, hasBeenScheduled); 140 drm.getLogger().warn( 141 Translate.get( 142 "virtualdatabase.distributed.read.procedure.sqlexception", e 143 .getMessage()), e); 144 return e; 145 } 146 catch (RuntimeException re) 147 { 148 drm.addFailedOnAllBackends(abstractWriteRequest, hasBeenScheduled); 150 drm.getLogger().warn( 151 Translate.get("virtualdatabase.distributed.read.procedure.exception", 152 re.getMessage()), re); 153 return new SQLException (re.getMessage()); 154 } 155 } 156 157 160 public String toString() 161 { 162 return "E " + request.getId() + " " + request.getTransactionId() + " " 163 + request.getUniqueKey(); 164 } 165 166 } | Popular Tags |