Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF Class Reference

Inheritance diagram for org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ParallelDB_LPRF (VirtualDatabase vdb) throws Exception
DatabaseBackend chooseBackendForReadRequest (AbstractRequest request) throws SQLException
DatabaseBackend chooseBackendForWriteRequest (AbstractWriteRequest request) throws SQLException
String getInformation ()
String getParallelDBXml ()

Detailed Description

This class defines a ParallelDB_LPRF load balancer. This load balancer chooses the node that has the least pending queries for read and write queries execution.

Author:
Emmanuel Cecchet
Version:
1.0

Definition at line 45 of file ParallelDB_LPRF.java.


Constructor & Destructor Documentation

org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF.ParallelDB_LPRF VirtualDatabase  vdb  )  throws Exception
 

Creates a new ParallelDB_LPRF object.

Parameters:
vdb the virtual database this load balancer belongs to.
Exceptions:
Exception if an error occurs

Definition at line 54 of file ParallelDB_LPRF.java.

00055   {
00056     super(vdb);
00057   }


Member Function Documentation

DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF.chooseBackendForReadRequest AbstractRequest  request  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.chooseBackendForReadRequest(org.objectweb.cjdbc.common.sql.AbstractRequest)

Implements org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.

Definition at line 62 of file ParallelDB_LPRF.java.

References org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.acquireReadLockBackendLists(), org.objectweb.cjdbc.common.log.Trace.error(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getBackends(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getPendingRequests(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getSQLShortFormLength(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.isReadEnabled().

00064   {
00065     // Choose a backend
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; // The backend that will execute the query
00079 
00080     // Note that vdb lock is released in the finally clause of this try/catch
00081     // block
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       // Choose the backend that has the least pending requests
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; // Stop here we will never find a less loaded node
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   }

DatabaseBackend org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF.chooseBackendForWriteRequest AbstractWriteRequest  request  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.chooseBackendForWriteRequest(org.objectweb.cjdbc.common.sql.AbstractWriteRequest)

Implements org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.

Definition at line 133 of file ParallelDB_LPRF.java.

References org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.acquireReadLockBackendLists(), org.objectweb.cjdbc.controller.virtualdatabase.VirtualDatabase.getBackends(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.getPendingRequests(), org.objectweb.cjdbc.controller.backend.DatabaseBackend.isDisabling(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.isWriteEnabled().

00135   {
00136     // Choose a backend
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; // The backend that will execute the query
00150 
00151     // Note that vdb lock is released in the finally clause of this try/catch
00152     // block
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       // Choose the backend that has the least pending requests
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; // Stop here we will never find a less loaded node
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   }

String org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF.getInformation  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.getInformation()

Implements org.objectweb.cjdbc.controller.loadbalancer.AbstractLoadBalancer.

Definition at line 206 of file ParallelDB_LPRF.java.

00207   {
00208     // We don't lock since we don't need a top accurate value
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   }

String org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB_LPRF.getParallelDBXml  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.getParallelDBXml()

Implements org.objectweb.cjdbc.controller.loadbalancer.paralleldb.ParallelDB.

Definition at line 221 of file ParallelDB_LPRF.java.

00222   {
00223     return "<" + DatabasesXmlTags.ELT_ParallelDB_LeastPendingRequestsFirst
00224         + "/>";
00225   }


The documentation for this class was generated from the following file:
Generated on Mon Apr 11 22:03:56 2005 for C-JDBC by  doxygen 1.3.9.1