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

org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler Class Reference

Inheritance diagram for org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler:

Inheritance graph
[legend]
Collaboration diagram for org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 RAIDb2QueryLevelScheduler ()
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-2 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 RAIDb2QueryLevelScheduler.java.


Constructor & Destructor Documentation

org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.RAIDb2QueryLevelScheduler  ) 
 

Creates a new Query Level Scheduler

Definition at line 73 of file RAIDb2QueryLevelScheduler.java.

00074   {
00075     super(RAIDbLevels.RAIDb2, 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.raidb2.RAIDb2QueryLevelScheduler.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 283 of file RAIDb2QueryLevelScheduler.java.

00284   {
00285   }

String org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.getXmlImpl  )  [virtual]
 

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

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

Definition at line 300 of file RAIDb2QueryLevelScheduler.java.

00301   {
00302     StringBuffer info = new StringBuffer();
00303     info.append("<" + DatabasesXmlTags.ELT_RAIDb2Scheduler + " "
00304         + DatabasesXmlTags.ATT_level + "=\"" + DatabasesXmlTags.VAL_query
00305         + "\"/>");
00306     info.append(System.getProperty("line.separator"));
00307     return info.toString();
00308   }

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

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

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

Definition at line 260 of file RAIDb2QueryLevelScheduler.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().

00262   {
00263     synchronized (this.writeSync)
00264     {
00265       if (logger.isDebugEnabled())
00266         logger.debug("Request " + request.getId() + " completed");
00267       if (getPendingWrites() == 0)
00268       {
00269         if (logger.isDebugEnabled())
00270           logger.debug("Last write completed, notifying reads");
00271         writeSync.notifyAll(); // Wakes up all waiting read queries
00272       }
00273     }
00274   }

final void org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.readCompletedNotify SelectRequest  request  )  [virtual]
 

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

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

Definition at line 161 of file RAIDb2QueryLevelScheduler.java.

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

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

final void org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.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 290 of file RAIDb2QueryLevelScheduler.java.

00291   {
00292   }

void org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.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 180 of file RAIDb2QueryLevelScheduler.java.

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

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

void org.objectweb.cjdbc.controller.scheduler.raidb2.RAIDb2QueryLevelScheduler.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 RAIDb2QueryLevelScheduler.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 " + request.getId() + " scheduled for read ("
00102                 + pendingReads + " pending reads)");
00103           return;
00104         }
00105       }
00106 
00107       // Wait for the writes completion
00108       try
00109       {
00110         if (logger.isDebugEnabled())
00111           logger.debug("Request " + request.getId() + " waiting for "
00112               + getPendingWrites() + " pending writes)");
00113 
00114         int timeout = request.getTimeout();
00115         if (timeout > 0)
00116         {
00117           long start = System.currentTimeMillis();
00118           // Convert seconds to milliseconds for wait call
00119           long lTimeout = timeout * 1000;
00120           this.writeSync.wait(lTimeout);
00121           long end = System.currentTimeMillis();
00122           int remaining = (int) (lTimeout - (end - start));
00123           if (remaining > 0)
00124             request.setTimeout(remaining);
00125           else
00126           {
00127             String msg = "Timeout (" + request.getTimeout() + ") for request: "
00128                 + request.getId();
00129             logger.warn(msg);
00130             throw new SQLException(msg);
00131           }
00132         }
00133         else
00134           this.writeSync.wait();
00135 
00136         synchronized (this.readSync)
00137         {
00138           request.setId(requestId++);
00139           pendingReads++;
00140           if (logger.isDebugEnabled())
00141             logger.debug("Request " + request.getId() + " scheduled for read ("
00142                 + pendingReads + " pending reads)");
00143           return; // Ok, write completed before timeout
00144         }
00145       }
00146       catch (InterruptedException e)
00147       {
00148         // Timeout
00149         if (logger.isWarnEnabled())
00150           logger.warn("Request " + request.getId() + " timed out ("
00151               + request.getTimeout() + " s)");
00152         throw new SQLException("Timeout (" + request.getTimeout()
00153             + ") for request: " + request.getId());
00154       }
00155     }
00156   }


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