You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by kr...@apache.org on 2012/05/18 09:04:53 UTC
svn commit: r1339999 -
/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java
Author: kristwaa
Date: Fri May 18 07:04:52 2012
New Revision: 1339999
URL: http://svn.apache.org/viewvc?rev=1339999&view=rev
Log:
DERBY-5770: Reduce window of opportunity for queries being compiled without statistics on istat update
Moved invalidation to after the new statistics have been written.
Patch file: derby-5770-1a-move_invalidation.diff
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java?rev=1339999&r1=1339998&r2=1339999&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/services/daemon/IndexStatisticsDaemonImpl.java Fri May 18 07:04:52 2012
@@ -556,13 +556,13 @@ public class IndexStatisticsDaemonImpl
// Update the heap row count estimate.
setHeapRowEstimate(tc, td.getHeapConglomerateId(), numRows);
- // Invalidate statments accessing the given table.
- // Note that due to retry logic, swithcing the data dictionary to
- // write mode is done inside invalidateStatements.
- invalidateStatements(lcc, td, asBackgroundTask);
// Drop existing index statistics for this index.
+ if (!lcc.dataDictionaryInWriteMode()) {
+ dd.startWriting(lcc);
+ }
dd.dropStatisticsDescriptors(table, index, tc);
+ boolean conglomerateGone = false; // invalidation control flag
// Don't write statistics if the table is empty.
if (numRows == 0) {
trace(2, "empty table, no stats written");
@@ -596,8 +596,13 @@ public class IndexStatisticsDaemonImpl
"rolled back index stats because index has been dropped");
lcc.internalRollback();
}
+ conglomerateGone = (cd == null);
}
+ if (!conglomerateGone) {
+ // Invalidate statments accessing the given table.
+ invalidateStatements(lcc, td, asBackgroundTask);
+ }
// Only commit tx as we go if running as background task.
if (asBackgroundTask) {
lcc.internalCommit(true);
@@ -621,13 +626,11 @@ public class IndexStatisticsDaemonImpl
// Invalidate compiled statements accessing the table.
DataDictionary dd = lcc.getDataDictionary();
DependencyManager dm = dd.getDependencyManager();
- boolean inWrite = false;
int retries = 0;
while (true) {
try {
- if (!inWrite) {
+ if (!lcc.dataDictionaryInWriteMode()) {
dd.startWriting(lcc);
- inWrite = true;
}
dm.invalidateFor(
td, DependencyManager.UPDATE_STATISTICS, lcc);
@@ -644,7 +647,6 @@ public class IndexStatisticsDaemonImpl
if (retries > 1) {
trace(2, "releasing locks");
lcc.internalRollback();
- inWrite = false;
}
trace(2, "lock timeout when invalidating");
sleep(100*(1+retries)); // adaptive sleeping...