You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2013/05/16 22:59:40 UTC
svn commit: r1483566 - in /lucene/dev/branches/lucene_solr_4_3: ./
dev-tools/ lucene/ lucene/analysis/
lucene/analysis/common/src/test/org/apache/lucene/analysis/util/
lucene/analysis/icu/src/java/org/apache/lucene/collation/ lucene/backwards/
lucene/b...
Author: yonik
Date: Thu May 16 20:59:39 2013
New Revision: 1483566
URL: http://svn.apache.org/r1483566
Log:
SOLR-4829: fix tlog leaks
Modified:
lucene/dev/branches/lucene_solr_4_3/ (props changed)
lucene/dev/branches/lucene_solr_4_3/dev-tools/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/BUILD.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/CHANGES.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/JRE_VERSION_MIGRATION.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/LICENSE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/MIGRATE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/NOTICE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/README.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/analysis/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/analysis/common/src/test/org/apache/lucene/analysis/util/BaseTokenStreamFactoryTestCase.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/analysis/icu/src/java/org/apache/lucene/collation/ICUCollationKeyFilterFactory.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/backwards/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/benchmark/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/classification/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/classification/build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/classification/ivy.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/classification/src/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/codecs/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/common-build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/index/index.40.cfs.zip (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/index/index.40.nocfs.zip (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/index/index.40.optimized.cfs.zip (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/index/index.40.optimized.nocfs.zip (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/search/TestSort.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/search/TestSortDocValues.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/core/src/test/org/apache/lucene/search/TestTotalHitCountCollector.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/demo/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/facet/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/grouping/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/highlighter/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/ivy-settings.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/join/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/licenses/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/memory/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/misc/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/module-build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/queries/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/queries/src/test/org/apache/lucene/queries/function/TestFunctionQuerySort.java (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/queryparser/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/sandbox/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/site/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/spatial/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/suggest/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/test-framework/ (props changed)
lucene/dev/branches/lucene_solr_4_3/lucene/tools/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/lucene_solr_4_3/solr/LICENSE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/NOTICE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/README.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/SYSTEM_REQUIREMENTS.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/cloud-dev/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/common-build.xml (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/contrib/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/core/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/update/UpdateLog.java
lucene/dev/branches/lucene_solr_4_3/solr/core/src/test/org/apache/solr/core/TestConfig.java (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/example/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpclient-LICENSE-ASL.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpclient-NOTICE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpcore-LICENSE-ASL.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpcore-NOTICE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpmime-LICENSE-ASL.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/licenses/httpmime-NOTICE.txt (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/scripts/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/site/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/solrj/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/test-framework/ (props changed)
lucene/dev/branches/lucene_solr_4_3/solr/webapp/ (props changed)
Modified: lucene/dev/branches/lucene_solr_4_3/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_3/solr/CHANGES.txt?rev=1483566&r1=1483565&r2=1483566&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_3/solr/CHANGES.txt (original)
+++ lucene/dev/branches/lucene_solr_4_3/solr/CHANGES.txt Thu May 16 20:59:39 2013
@@ -59,6 +59,10 @@ Bug Fixes
* SOLR-4813: Fix SynonymFilterFactory to allow init parameters for
tokenizer factory used when parsing synonyms file. (Shingo Sasaki, hossman)
+
+* SOLR-4829: Fix transaction log leaks (a failure to clean up some old logs)
+ on a shard leader, or when unexpected exceptions are thrown during log
+ recovery. (Steven Bower, Mark Miller, yonik)
Other Changes
Modified: lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java?rev=1483566&r1=1483565&r2=1483566&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java (original)
+++ lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/cloud/ElectionContext.java Thu May 16 20:59:39 2013
@@ -172,8 +172,6 @@ final class ShardLeaderElectionContext e
}
log.info("I may be the new leader - try and sync");
-
- UpdateLog ulog = core.getUpdateHandler().getUpdateLog();
// we are going to attempt to be the leader
@@ -187,14 +185,30 @@ final class ShardLeaderElectionContext e
success = false;
}
- if (!success && ulog.getRecentUpdates().getVersions(1).isEmpty()) {
- // we failed sync, but we have no versions - we can't sync in that case
- // - we were active
- // before, so become leader anyway
- log.info("We failed sync, but we have no versions - we can't sync in that case - we were active before, so become leader anyway");
- success = true;
+ UpdateLog ulog = core.getUpdateHandler().getUpdateLog();
+
+ if (!success) {
+ boolean hasRecentUpdates = false;
+ if (ulog != null) {
+ // TODO: we could optimize this if necessary
+ UpdateLog.RecentUpdates recentUpdates = ulog.getRecentUpdates();
+ try {
+ hasRecentUpdates = !recentUpdates.getVersions(1).isEmpty();
+ } finally {
+ recentUpdates.close();
+ }
+ }
+
+ if (!hasRecentUpdates) {
+ // we failed sync, but we have no versions - we can't sync in that case
+ // - we were active
+ // before, so become leader anyway
+ log.info("We failed sync, but we have no versions - we can't sync in that case - we were active before, so become leader anyway");
+ success = true;
+ }
}
-
+
+
// if !success but no one else is in active mode,
// we are the leader anyway
// TODO: should we also be leader if there is only one other active?
Modified: lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java?rev=1483566&r1=1483565&r2=1483566&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java (original)
+++ lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java Thu May 16 20:59:39 2013
@@ -552,13 +552,13 @@ public class RealTimeGetComponent extend
List<String> versions = StrUtils.splitSmart(versionsStr, ",", true);
- // TODO: get this from cache instead of rebuilding?
- UpdateLog.RecentUpdates recentUpdates = ulog.getRecentUpdates();
List<Object> updates = new ArrayList<Object>(versions.size());
long minVersion = Long.MAX_VALUE;
-
+
+ // TODO: get this from cache instead of rebuilding?
+ UpdateLog.RecentUpdates recentUpdates = ulog.getRecentUpdates();
try {
for (String versionStr : versions) {
long version = Long.parseLong(versionStr);
Modified: lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/update/UpdateLog.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/update/UpdateLog.java?rev=1483566&r1=1483565&r2=1483566&view=diff
==============================================================================
--- lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/update/UpdateLog.java (original)
+++ lucene/dev/branches/lucene_solr_4_3/solr/core/src/java/org/apache/solr/update/UpdateLog.java Thu May 16 20:59:39 2013
@@ -989,7 +989,7 @@ public class UpdateLog implements Plugin
}
}
-
+ /** The RecentUpdates object returned must be closed after use */
public RecentUpdates getRecentUpdates() {
Deque<TransactionLog> logList;
synchronized (this) {
@@ -1009,9 +1009,21 @@ public class UpdateLog implements Plugin
// TODO: what if I hand out a list of updates, then do an update, then hand out another list (and
// one of the updates I originally handed out fell off the list). Over-request?
- RecentUpdates recentUpdates = new RecentUpdates();
- recentUpdates.logList = logList;
- recentUpdates.update();
+
+ boolean success = false;
+ RecentUpdates recentUpdates = null;
+ try {
+ recentUpdates = new RecentUpdates();
+ recentUpdates.logList = logList;
+ recentUpdates.update();
+ success = true;
+ } finally {
+ // defensive: if some unknown exception is thrown,
+ // make sure we close so that the tlogs are decref'd
+ if (!success && recentUpdates != null) {
+ recentUpdates.close();
+ }
+ }
return recentUpdates;
}
@@ -1132,14 +1144,15 @@ public class UpdateLog implements Plugin
class LogReplayer implements Runnable {
private Logger loglog = log; // set to something different?
- List<TransactionLog> translogs;
+ Deque<TransactionLog> translogs;
TransactionLog.LogReader tlogReader;
boolean activeLog;
boolean finishing = false; // state where we lock out other updates and finish those updates that snuck in before we locked
boolean debug = loglog.isDebugEnabled();
public LogReplayer(List<TransactionLog> translogs, boolean activeLog) {
- this.translogs = translogs;
+ this.translogs = new LinkedList<TransactionLog>();
+ this.translogs.addAll(translogs);
this.activeLog = activeLog;
}
@@ -1159,7 +1172,9 @@ public class UpdateLog implements Plugin
SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp)); // setting request info will help logging
try {
- for (TransactionLog translog : translogs) {
+ for(;;) {
+ TransactionLog translog = translogs.pollFirst();
+ if (translog == null) break;
doReplay(translog);
}
} catch (SolrException e) {
@@ -1179,6 +1194,13 @@ public class UpdateLog implements Plugin
if (finishing) {
versionInfo.unblockUpdates();
}
+
+ // clean up in case we hit some unexpected exception and didn't get
+ // to more transaction logs
+ for (TransactionLog translog : translogs) {
+ log.error("ERROR: didn't get to recover from tlog " + translog);
+ translog.decref();
+ }
}
loglog.warn("Log replay finished. recoveryInfo=" + recoveryInfo);