00001
00025
package org.objectweb.cjdbc.controller.loadbalancer.paralleldb;
00026
00027
import java.sql.SQLException;
00028
import java.util.ArrayList;
00029
00030
import org.objectweb.cjdbc.common.i18n.Translate;
00031
import org.objectweb.cjdbc.common.sql.AbstractRequest;
00032
import org.objectweb.cjdbc.common.sql.AbstractWriteRequest;
00033
import org.objectweb.cjdbc.common.xml.DatabasesXmlTags;
00034
import org.objectweb.cjdbc.controller.backend.DatabaseBackend;
00035
import org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase;
00036
00045 public class ParallelDB_LPRF extends ParallelDB
00046 {
00047
00054 public ParallelDB_LPRF(
VirtualDatabase vdb)
throws SQLException
00055 {
00056 super(vdb);
00057 }
00058
00062 public DatabaseBackend chooseBackendForReadRequest(
AbstractRequest request)
00063
throws SQLException
00064 {
00065
00066
try
00067 {
00068 vdb.
acquireReadLockBackendLists();
00069 }
00070
catch (InterruptedException e)
00071 {
00072 String msg =
Translate.get(
00073
"loadbalancer.backendlist.acquire.readlock.failed", e);
00074 logger.
error(msg);
00075
throw new SQLException(msg);
00076 }
00077
00078
DatabaseBackend backend = null;
00079
00080
00081
00082
try
00083 {
00084 ArrayList backends = vdb.
getBackends();
00085
int size = backends.size();
00086
00087
if (size == 0)
00088
throw new SQLException(
Translate.get(
00089
"loadbalancer.execute.no.backend.available", request.getId()));
00090
00091
00092
int leastRequests = 0;
00093
for (
int i = 0; i < size; i++)
00094 {
00095
DatabaseBackend b = (
DatabaseBackend) backends.get(i);
00096
if (b.
isReadEnabled())
00097 {
00098
int pending = b.
getPendingRequests().size();
00099
if ((backend == null) || (pending < leastRequests))
00100 {
00101 backend = b;
00102
if (pending == 0)
00103
break;
00104
else
00105 leastRequests = pending;
00106 }
00107 }
00108 }
00109
00110
if (backend == null)
00111
throw new SQLException(
Translate.get(
00112
"loadbalancer.execute.no.backend.enabled", request.getId()));
00113 }
00114
catch (RuntimeException e)
00115 {
00116 String msg =
Translate.get(
"loadbalancer.execute.find.backend.failed",
00117
new String[]{request.getSQLShortForm(vdb.
getSQLShortFormLength()),
00118 e.getMessage()});
00119 logger.
error(msg, e);
00120
throw new SQLException(msg);
00121 }
00122 finally
00123 {
00124 vdb.
releaseReadLockBackendLists();
00125 }
00126
00127
return backend;
00128 }
00129
00133 public DatabaseBackend chooseBackendForWriteRequest(
00134
AbstractWriteRequest request)
throws SQLException
00135 {
00136
00137
try
00138 {
00139 vdb.acquireReadLockBackendLists();
00140 }
00141
catch (InterruptedException e)
00142 {
00143 String msg =
Translate.get(
00144
"loadbalancer.backendlist.acquire.readlock.failed", e);
00145 logger.error(msg);
00146
throw new SQLException(msg);
00147 }
00148
00149
DatabaseBackend backend = null;
00150
00151
00152
00153
try
00154 {
00155 ArrayList backends = vdb.getBackends();
00156
int size = backends.size();
00157
00158
if (size == 0)
00159
throw new SQLException(
Translate.get(
00160
"loadbalancer.execute.no.backend.available", request.getId()));
00161
00162
00163
int leastRequests = 0;
00164
for (
int i = 0; i < size; i++)
00165 {
00166
DatabaseBackend b = (
DatabaseBackend) backends.get(i);
00167
if (b.
isWriteEnabled() && !b.
isDisabling())
00168 {
00169
int pending = b.
getPendingRequests().size();
00170
if ((backend == null) || (pending < leastRequests))
00171 {
00172 backend = b;
00173
if (pending == 0)
00174
break;
00175
else
00176 leastRequests = pending;
00177 }
00178 }
00179 }
00180
00181
if (backend == null)
00182 {
00183
throw new SQLException(
Translate.get(
00184
"loadbalancer.execute.no.backend.enabled", request.getId()));
00185 }
00186 }
00187
catch (RuntimeException e)
00188 {
00189 String msg =
Translate.get(
"loadbalancer.execute.find.backend.failed",
00190
new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00191 e.getMessage()});
00192 logger.error(msg, e);
00193
throw new SQLException(msg);
00194 }
00195 finally
00196 {
00197 vdb.releaseReadLockBackendLists();
00198 }
00199
00200
return backend;
00201 }
00202
00206 public String getInformation()
00207 {
00208
00209
int size = vdb.getBackends().size();
00210
00211
if (size == 0)
00212
return "ParallelDB Least Pending Request First Request load balancer: !!!Warning!!! No backend nodes found\n";
00213
else
00214
return "ParallelDB Least Pending Request First Request load balancer ("
00215 + size +
" backends)\n";
00216 }
00217
00221 public String getParallelDBXml()
00222 {
00223
return "<" +
DatabasesXmlTags.ELT_ParallelDB_LeastPendingRequestsFirst
00224 +
"/>";
00225 }
00226 }