00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 package org.objectweb.cjdbc.controller.loadbalancer.raidb1;
00026
00027 import java.sql.SQLException;
00028 import java.util.ArrayList;
00029
00030 import org.objectweb.cjdbc.common.exceptions.NoMoreBackendException;
00031 import org.objectweb.cjdbc.common.exceptions.UnreachableBackendException;
00032 import org.objectweb.cjdbc.common.i18n.Translate;
00033 import org.objectweb.cjdbc.common.sql.AbstractRequest;
00034 import org.objectweb.cjdbc.common.sql.SelectRequest;
00035 import org.objectweb.cjdbc.common.sql.StoredProcedure;
00036 import org.objectweb.cjdbc.common.xml.DatabasesXmlTags;
00037 import org.objectweb.cjdbc.controller.backend.DatabaseBackend;
00038 import org.objectweb.cjdbc.controller.cache.metadata.MetadataCache;
00039 import org.objectweb.cjdbc.controller.loadbalancer.policies.WaitForCompletionPolicy;
00040 import org.objectweb.cjdbc.controller.virtualdatabase.ControllerResultSet;
00041 import org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 public class RAIDb1_LPRF extends RAIDb1
00055 {
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 public RAIDb1_LPRF(VirtualDatabase vdb,
00076 WaitForCompletionPolicy waitForCompletionPolicy) throws Exception
00077 {
00078 super(vdb, waitForCompletionPolicy);
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 public ControllerResultSet execReadRequest(SelectRequest request,
00094 MetadataCache metadataCache) throws SQLException
00095 {
00096 return executeLPRF(request, true, "Request ", metadataCache);
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 public ControllerResultSet execReadOnlyReadStoredProcedure(
00108 StoredProcedure proc, MetadataCache metadataCache) throws SQLException
00109 {
00110 return executeLPRF(proc, false, "Stored procedure ", metadataCache);
00111 }
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 private ControllerResultSet executeLPRF(AbstractRequest request,
00128 boolean isSelect, String errorMsgPrefix, MetadataCache metadataCache)
00129 throws SQLException
00130 {
00131
00132 try
00133 {
00134 vdb.acquireReadLockBackendLists();
00135 }
00136 catch (InterruptedException e)
00137 {
00138 String msg = Translate.get(
00139 "loadbalancer.backendlist.acquire.readlock.failed", e);
00140 logger.error(msg);
00141 throw new SQLException(msg);
00142 }
00143
00144 DatabaseBackend backend = null;
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 try
00155 {
00156 ArrayList backends = vdb.getBackends();
00157 int size = backends.size();
00158
00159 if (size == 0)
00160 throw new SQLException(Translate.get(
00161 "loadbalancer.execute.no.backend.available", request.getId()));
00162
00163
00164 int leastRequests = 0;
00165 for (int i = 0; i < size; i++)
00166 {
00167 DatabaseBackend b = (DatabaseBackend) backends.get(i);
00168 if (b.isReadEnabled())
00169 {
00170 int pending = b.getPendingRequests().size();
00171 if ((backend == null) || (pending < leastRequests))
00172 {
00173 backend = b;
00174 if (pending == 0)
00175 break;
00176 else
00177 leastRequests = pending;
00178 }
00179 }
00180 }
00181
00182 if (backend == null)
00183 throw new NoMoreBackendException(Translate.get(
00184 "loadbalancer.execute.no.backend.enabled", request.getId()));
00185 }
00186 catch (RuntimeException e)
00187 {
00188 String msg = Translate.get("loadbalancer.execute.find.backend.failed",
00189 new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00190 e.getMessage()});
00191 logger.error(msg, e);
00192 throw new SQLException(msg);
00193 }
00194 finally
00195 {
00196 vdb.releaseReadLockBackendLists();
00197 }
00198
00199 ControllerResultSet rs = null;
00200
00201 try
00202 {
00203 if (isSelect)
00204 rs = executeRequestOnBackend((SelectRequest) request, backend,
00205 metadataCache);
00206 else
00207 rs = executeStoredProcedureOnBackend((StoredProcedure) request,
00208 backend, metadataCache);
00209 }
00210 catch (UnreachableBackendException urbe)
00211 {
00212
00213 return executeLPRF(request, isSelect, errorMsgPrefix, metadataCache);
00214 }
00215 catch (SQLException se)
00216 {
00217 String msg = Translate.get("loadbalancer.something.failed", new String[]{
00218 errorMsgPrefix, String.valueOf(request.getId()), se.getMessage()});
00219 if (logger.isInfoEnabled())
00220 logger.info(msg);
00221 throw se;
00222 }
00223 catch (RuntimeException e)
00224 {
00225 String msg = Translate.get("loadbalancer.something.failed.on",
00226 new String[]{errorMsgPrefix,
00227 request.getSQLShortForm(vdb.getSQLShortFormLength()),
00228 backend.getName(), e.getMessage()});
00229 logger.error(msg, e);
00230 throw new SQLException(msg);
00231 }
00232
00233 return rs;
00234 }
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 public String getInformation()
00246 {
00247
00248 int size = vdb.getBackends().size();
00249
00250 if (size == 0)
00251 return "RAIDb-1 Least Pending Request First load balancer: !!!Warning!!! No backend nodes found\n";
00252 else
00253 return "RAIDb-1 Least Pending Request First load balancer (" + size
00254 + " backends)\n";
00255 }
00256
00257
00258
00259
00260 public String getRaidb1Xml()
00261 {
00262 return "<" + DatabasesXmlTags.ELT_RAIDb_1_LeastPendingRequestsFirst + "/>";
00263 }
00264
00265 }