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.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
00037
00038
00039
00040
00041
00042
00043
00044
00045 public class ParallelDB_LPRF extends ParallelDB
00046 {
00047
00048
00049
00050
00051
00052
00053
00054 public ParallelDB_LPRF(VirtualDatabase vdb) throws Exception
00055 {
00056 super(vdb);
00057 }
00058
00059
00060
00061
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
00130
00131
00132
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
00203
00204
00205
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
00218
00219
00220
00221 public String getParallelDBXml()
00222 {
00223 return "<" + DatabasesXmlTags.ELT_ParallelDB_LeastPendingRequestsFirst
00224 + "/>";
00225 }
00226 }