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

org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler Class Reference

Inheritance diagram for org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 RAIDb1QueryLevelScheduler ()
void scheduleReadRequest (SelectRequest request) throws SQLException
final void readCompletedNotify (SelectRequest request)
void scheduleNonSuspendedWriteRequest (AbstractWriteRequest request) throws SQLException
final synchronized void notifyWriteCompleted (AbstractWriteRequest request)
String getXmlImpl ()

Protected Member Functions

final void commitTransaction (long transactionId)
final void rollbackTransaction (long transactionId)

Detailed Description

This scheduler provides query level scheduling for RAIDb-1 controllers. Reads can execute in parallel until a write comes in. Then the write waits for the completion of the reads. Any new read is stacked after the write and they are released together when the write has completed its execution.

Author:
Emmanuel Cecchet
Version:
1.0

Definition at line 45 of file RAIDb1QueryLevelScheduler.java.


Constructor & Destructor Documentation

org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.RAIDb1QueryLevelScheduler  ) 
 

Creates a new Query Level Scheduler

Definition at line 73 of file RAIDb1QueryLevelScheduler.java.

00074   {
00075     super(RAIDbLevels.RAIDb1, ParsingGranularities.NO_PARSING);
00076     requestId = 0;
00077     pendingReads = 0;
00078     readSync = new Object();
00079     writeSync = new Object();
00080   }


Member Function Documentation

final void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.commitTransaction long  transactionId  )  [protected, virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.commitTransaction(long)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 290 of file RAIDb1QueryLevelScheduler.java.

00291   {
00292   }

String org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.getXmlImpl  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler#getXmlImpl()

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 307 of file RAIDb1QueryLevelScheduler.java.

00308   {
00309     return "<" + DatabasesXmlTags.ELT_RAIDb1Scheduler + " "
00310         + DatabasesXmlTags.ATT_level + "=\"" + DatabasesXmlTags.VAL_query
00311         + "\"/>";
00312   }

final synchronized void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.notifyWriteCompleted AbstractWriteRequest  request  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.notifyWriteCompleted(AbstractWriteRequest)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 266 of file RAIDb1QueryLevelScheduler.java.

References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.common.sql.AbstractRequest.getId(), org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.getPendingWrites(), and org.objectweb.cjdbc.common.log.Trace.isDebugEnabled().

00268   {
00269     synchronized (this.writeSync)
00270     {
00271       if (logger.isDebugEnabled())
00272         logger.debug("Request " + request.getId() + " completed - "
00273             + getPendingWrites() + " pending writes");
00274       if (getPendingWrites() == 0)
00275       {
00276         if (logger.isDebugEnabled())
00277           logger.debug("Last write completed, notifying reads");
00278         writeSync.notifyAll(); // Wakes up all waiting read queries
00279       }
00280     }
00281   }

final void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.readCompletedNotify SelectRequest  request  )  [virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.readCompletedNotify(SelectRequest)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 164 of file RAIDb1QueryLevelScheduler.java.

References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.common.sql.AbstractRequest.getId(), and org.objectweb.cjdbc.common.log.Trace.isDebugEnabled().

00165   {
00166     synchronized (this.readSync)
00167     {
00168       pendingReads--;
00169       if (logger.isDebugEnabled())
00170         logger.debug("Read request " + request.getId() + " completed - "
00171             + pendingReads + " pending reads");
00172       if (pendingReads == 0)
00173       {
00174         if (logger.isDebugEnabled())
00175           logger.debug("Last read completed, notifying writes");
00176         readSync.notifyAll(); // Wakes up any waiting write query
00177       }
00178     }
00179   }

final void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.rollbackTransaction long  transactionId  )  [protected, virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.rollbackTransaction(long)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 297 of file RAIDb1QueryLevelScheduler.java.

00298   {
00299   }

void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.scheduleNonSuspendedWriteRequest AbstractWriteRequest  request  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.scheduleWriteRequest(AbstractWriteRequest)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 184 of file RAIDb1QueryLevelScheduler.java.

References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.getPendingWrites(), and org.objectweb.cjdbc.common.log.Trace.isDebugEnabled().

00186   {
00187     // We have to take the locks in the same order as reads else
00188     // we could have a deadlock
00189     synchronized (this.writeSync)
00190     {
00191       synchronized (this.readSync)
00192       {
00193         if (pendingReads == 0)
00194         { // No read pending, go ahead
00195           request.setId(requestId++);
00196           if (logger.isDebugEnabled())
00197             logger.debug("Request "
00198                 + request.getId()
00199                 + (request.isAutoCommit() ? "" : " transaction "
00200                     + request.getTransactionId()) + " scheduled for write ("
00201                 + getPendingWrites() + " pending writes)");
00202           return;
00203         }
00204       }
00205     }
00206 
00207     waitForReadCompletion(request);
00208     scheduleNonSuspendedWriteRequest(request);
00209   }

void org.objectweb.cjdbc.controller.scheduler.raidb1.RAIDb1QueryLevelScheduler.scheduleReadRequest SelectRequest  request  )  throws SQLException [virtual]
 

See also:
org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.scheduleReadRequest(SelectRequest)

Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.

Definition at line 89 of file RAIDb1QueryLevelScheduler.java.

References org.objectweb.cjdbc.common.log.Trace.debug(), org.objectweb.cjdbc.controller.scheduler.AbstractScheduler.getPendingWrites(), org.objectweb.cjdbc.common.log.Trace.isDebugEnabled(), org.objectweb.cjdbc.common.log.Trace.isWarnEnabled(), and org.objectweb.cjdbc.common.log.Trace.warn().

00090   {
00091     // Now deal with synchronization
00092     synchronized (this.writeSync)
00093     {
00094       if (getPendingWrites() == 0)
00095       { // No writes pending, go ahead !
00096         synchronized (this.readSync)
00097         {
00098           request.setId(requestId++);
00099           pendingReads++;
00100           if (logger.isDebugEnabled())
00101             logger.debug("Request "
00102                 + request.getId()
00103                 + (request.isAutoCommit() ? "" : " transaction "
00104                     + request.getTransactionId()) + " scheduled for read ("
00105                 + pendingReads + " pending reads)");
00106           return;
00107         }
00108       }
00109 
00110       // Wait for the writes completion
00111       try
00112       {
00113         if (logger.isDebugEnabled())
00114           logger.debug("Request " + request.getId() + " waiting for "
00115               + getPendingWrites() + " pending writes)");
00116 
00117         int timeout = request.getTimeout();
00118         if (timeout > 0)
00119         {
00120           long start = System.currentTimeMillis();
00121           // Convert seconds to milliseconds for wait call
00122           long lTimeout = timeout * 1000;
00123           this.writeSync.wait(lTimeout);
00124           long end = System.currentTimeMillis();
00125           int remaining = (int) (lTimeout - (end - start));
00126           if (remaining > 0)
00127             request.setTimeout(remaining);
00128           else
00129           {
00130             String msg = "Timeout (" + request.getTimeout() + ") for request: "
00131                 + request.getId();
00132             logger.warn(msg);
00133             throw new SQLException(msg);
00134           }
00135         }
00136         else
00137           this.writeSync.wait();
00138 
00139         synchronized (this.readSync)
00140         {
00141           request.setId(requestId++);
00142           pendingReads++;
00143           if (logger.isDebugEnabled())
00144             logger.debug("Request " + request.getId() + " scheduled for read ("
00145                 + pendingReads + " pending reads)");
00146           return; // Ok, write completed before timeout
00147         }
00148       }
00149       catch (InterruptedException e)
00150       {
00151         // Timeout
00152         if (logger.isWarnEnabled())
00153           logger.warn("Request " + request.getId() + " timed out ("
00154               + request.getTimeout() + " s)");
00155         throw new SQLException("Timeout (" + request.getTimeout()
00156             + ") for request: " + request.getId());
00157       }
00158     }
00159   }


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