00001
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
00054 public class RAIDb1_LPRF extends RAIDb1
00055 {
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00075 public RAIDb1_LPRF(
VirtualDatabase vdb,
00076
WaitForCompletionPolicy waitForCompletionPolicy)
throws SQLException
00077 {
00078 super(vdb, waitForCompletionPolicy);
00079 }
00080
00081
00082
00083
00084
00093 public ControllerResultSet execReadRequest(
SelectRequest request,
00094
MetadataCache metadataCache)
throws SQLException
00095 {
00096
return executeLPRF(request,
true,
"Request ", metadataCache);
00097 }
00098
00107 public ControllerResultSet execReadOnlyReadStoredProcedure(
00108
StoredProcedure proc,
MetadataCache metadataCache)
throws SQLException
00109 {
00110
return executeLPRF(proc,
false,
"Stored procedure ", metadataCache);
00111 }
00112
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
try
00149 {
00150 ArrayList backends = vdb.
getBackends();
00151
int size = backends.size();
00152
00153
if (size == 0)
00154
throw new SQLException(
Translate.get(
00155
"loadbalancer.execute.no.backend.available", request.getId()));
00156
00157
00158
int leastRequests = 0;
00159
for (
int i = 0; i < size; i++)
00160 {
00161
DatabaseBackend b = (
DatabaseBackend) backends.get(i);
00162
if (b.
isReadEnabled())
00163 {
00164
int pending = b.
getPendingRequests().size();
00165
if ((backend == null) || (pending < leastRequests))
00166 {
00167 backend = b;
00168
if (pending == 0)
00169
break;
00170
else
00171 leastRequests = pending;
00172 }
00173 }
00174 }
00175
00176
if (backend == null)
00177
throw new NoMoreBackendException(
Translate.get(
00178
"loadbalancer.execute.no.backend.enabled", request.getId()));
00179 }
00180
catch (RuntimeException e)
00181 {
00182 String msg =
Translate.get(
"loadbalancer.execute.find.backend.failed",
00183
new String[]{request.getSQLShortForm(vdb.
getSQLShortFormLength()),
00184 e.getMessage()});
00185 logger.
error(msg, e);
00186
throw new SQLException(msg);
00187 }
00188 finally
00189 {
00190 vdb.
releaseReadLockBackendLists();
00191 }
00192
00193
ControllerResultSet rs = null;
00194
00195
try
00196 {
00197
if (isSelect)
00198 rs =
executeRequestOnBackend((
SelectRequest) request, backend,
00199 metadataCache);
00200
else
00201 rs =
executeStoredProcedureOnBackend((
StoredProcedure) request,
00202 backend, metadataCache);
00203 }
00204
catch (UnreachableBackendException urbe)
00205 {
00206
00207
return executeLPRF(request, isSelect, errorMsgPrefix, metadataCache);
00208 }
00209
catch (SQLException se)
00210 {
00211 String msg = Translate.get(
"loadbalancer.something.failed",
new String[]{
00212 errorMsgPrefix, String.valueOf(request.getId()), se.getMessage()});
00213
if (logger.isInfoEnabled())
00214 logger.info(msg);
00215
throw new SQLException(msg);
00216 }
00217
catch (RuntimeException e)
00218 {
00219 String msg = Translate.get(
"loadbalancer.something.failed.on",
00220
new String[]{errorMsgPrefix,
00221 request.getSQLShortForm(vdb.getSQLShortFormLength()),
00222 backend.getName(), e.getMessage()});
00223 logger.error(msg, e);
00224
throw new SQLException(msg);
00225 }
00226
00227
return rs;
00228 }
00229
00230
00231
00232
00233
00239 public String getInformation()
00240 {
00241
00242
int size = vdb.getBackends().size();
00243
00244
if (size == 0)
00245
return "RAIDb-1 Least Pending Request First load balancer: !!!Warning!!! No backend nodes found\n";
00246
else
00247
return "RAIDb-1 Least Pending Request First load balancer (" + size
00248 +
" backends)\n";
00249 }
00250
00254 public String getRaidb1Xml()
00255 {
00256
return "<" +
DatabasesXmlTags.ELT_RAIDb_1_LeastPendingRequestsFirst +
"/>";
00257 }
00258
00259 }