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

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

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

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

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ParallelDB_RR (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_RR load balancer. This load balancer performs simple round-robin for read and write queries execution.

Author:
Emmanuel Cecchet
Version:
1.0

Definition at line 44 of file ParallelDB_RR.java.


Constructor & Destructor Documentation

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

Creates a new ParallelDB_RR object

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

Definition at line 55 of file ParallelDB_RR.java.

00056   {
00057     super(vdb);
00058   }


Member Function Documentation

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

Choose a backend using a round-robin algorithm for read request execution.

Parameters:
request request to execute
Returns:
the chosen backend
Exceptions:
SQLException if an error occurs

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

Definition at line 67 of file ParallelDB_RR.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.virtualdatabase.VirtualDatabase.getSQLShortFormLength(), and org.objectweb.cjdbc.controller.backend.DatabaseBackend.isReadEnabled().

00069   {
00070     // Choose a backend
00071     try
00072     {
00073       vdb.acquireReadLockBackendLists();
00074     }
00075     catch (InterruptedException e)
00076     {
00077       String msg = Translate.get(
00078           "loadbalancer.backendlist.acquire.readlock.failed", e);
00079       logger.error(msg);
00080       throw new SQLException(msg);
00081     }
00082 
00083     DatabaseBackend backend = null; // The backend that will execute the query
00084 
00085     // Note that vdb lock is released in the finally clause of this try/catch
00086     // block
00087     try
00088     {
00089       ArrayList backends = vdb.getBackends();
00090       int size = backends.size();
00091 
00092       if (size == 0)
00093         throw new SQLException(Translate.get(
00094             "loadbalancer.execute.no.backend.available", request.getId()));
00095 
00096       // Take the next backend
00097       int maxTries = size;
00098       synchronized (this)
00099       {
00100         do
00101         {
00102           index = (index + 1) % size;
00103           backend = (DatabaseBackend) backends.get(index);
00104           maxTries--;
00105         }
00106         while ((!backend.isReadEnabled() && maxTries >= 0));
00107       }
00108 
00109       if (maxTries < 0)
00110         throw new SQLException(Translate.get(
00111             "loadbalancer.execute.no.backend.enabled", request.getId()));
00112     }
00113     catch (RuntimeException e)
00114     {
00115       String msg = Translate.get("loadbalancer.execute.find.backend.failed",
00116           new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00117               e.getMessage()});
00118       logger.error(msg, e);
00119       throw new SQLException(msg);
00120     }
00121     finally
00122     {
00123       vdb.releaseReadLockBackendLists();
00124     }
00125     return backend;
00126   }

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

Choose a backend using a round-robin algorithm for write request execution.

Parameters:
request request to execute
Returns:
the chosen backend
Exceptions:
SQLException if an error occurs

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

Definition at line 135 of file ParallelDB_RR.java.

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

00137   {
00138     // Choose a backend
00139     try
00140     {
00141       vdb.acquireReadLockBackendLists();
00142     }
00143     catch (InterruptedException e)
00144     {
00145       String msg = Translate.get(
00146           "loadbalancer.backendlist.acquire.readlock.failed", e);
00147       logger.error(msg);
00148       throw new SQLException(msg);
00149     }
00150 
00151     DatabaseBackend backend = null; // The backend that will execute the query
00152 
00153     // Note that vdb lock is released in the finally clause of this try/catch
00154     // block
00155     try
00156     {
00157       ArrayList backends = vdb.getBackends();
00158       int size = backends.size();
00159 
00160       if (size == 0)
00161         throw new SQLException(Translate.get(
00162             "loadbalancer.execute.no.backend.available", request.getId()));
00163 
00164       // Take the next backend
00165       int maxTries = size;
00166       synchronized (this)
00167       {
00168         do
00169         {
00170           index = (index + 1) % size;
00171           backend = (DatabaseBackend) backends.get(index);
00172           maxTries--;
00173         }
00174         while ((!backend.isWriteEnabled() || backend.isDisabling())
00175             && (maxTries >= 0));
00176       }
00177 
00178       if (maxTries < 0)
00179         throw new SQLException(Translate.get(
00180             "loadbalancer.execute.no.backend.enabled", request.getId()));
00181     }
00182     catch (RuntimeException e)
00183     {
00184       String msg = Translate.get("loadbalancer.execute.find.backend.failed",
00185           new String[]{request.getSQLShortForm(vdb.getSQLShortFormLength()),
00186               e.getMessage()});
00187       logger.error(msg, e);
00188       throw new SQLException(msg);
00189     }
00190     finally
00191     {
00192       vdb.releaseReadLockBackendLists();
00193     }
00194     return backend;
00195   }

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

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

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

Definition at line 200 of file ParallelDB_RR.java.

00201   {
00202     // We don't lock since we don't need a top accurate value
00203     int size = vdb.getBackends().size();
00204 
00205     if (size == 0)
00206       return "ParallelDB Round-Robin Request load balancer: !!!Warning!!! No backend nodes found\n";
00207     else
00208       return "ParallelDB Round-Robin Request load balancer (" + size
00209           + " backends)\n";
00210   }

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

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

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

Definition at line 215 of file ParallelDB_RR.java.

00216   {
00217     return "<" + DatabasesXmlTags.ELT_ParallelDB_RoundRobin + "/>";
00218   }


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