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) |
Definition at line 45 of file RAIDb2QueryLevelScheduler.java.
|
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 }
|
|
Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler. Definition at line 283 of file RAIDb2QueryLevelScheduler.java. 00284 { 00285 }
|
|
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 }
|
|
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 }
|
|
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 }
|
|
Implements org.objectweb.cjdbc.controller.scheduler.AbstractScheduler. Definition at line 290 of file RAIDb2QueryLevelScheduler.java. 00291 { 00292 }
|
|
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 }
|
|
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 }
|