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) |
Definition at line 45 of file RAIDb1QueryLevelScheduler.java.
|
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 }
|
|
Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler. Definition at line 290 of file RAIDb1QueryLevelScheduler.java. 00291 { 00292 }
|
|
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 }
|
|
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 }
|
|
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 }
|
|
Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler. Definition at line 297 of file RAIDb1QueryLevelScheduler.java. 00298 { 00299 }
|
|
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 }
|
|
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 }
|