You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by sy...@apache.org on 2015/01/19 18:29:38 UTC
lucenenet git commit: Go back to using .NET natives
Repository: lucenenet
Updated Branches:
refs/heads/master 2d850fd71 -> eb4de4d75
Go back to using .NET natives
Project: http://git-wip-us.apache.org/repos/asf/lucenenet/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucenenet/commit/eb4de4d7
Tree: http://git-wip-us.apache.org/repos/asf/lucenenet/tree/eb4de4d7
Diff: http://git-wip-us.apache.org/repos/asf/lucenenet/diff/eb4de4d7
Branch: refs/heads/master
Commit: eb4de4d75fc69aed951038039860a1c8feebd19b
Parents: 2d850fd
Author: Itamar Syn-Hershko <it...@code972.com>
Authored: Mon Jan 19 19:29:01 2015 +0200
Committer: Itamar Syn-Hershko <it...@code972.com>
Committed: Mon Jan 19 19:29:01 2015 +0200
----------------------------------------------------------------------
.../Search/SearcherLifetimeManager.cs | 73 ++++++++------------
1 file changed, 30 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/eb4de4d7/src/Lucene.Net.Core/Search/SearcherLifetimeManager.cs
----------------------------------------------------------------------
diff --git a/src/Lucene.Net.Core/Search/SearcherLifetimeManager.cs b/src/Lucene.Net.Core/Search/SearcherLifetimeManager.cs
index 3fb1660..12603e2 100644
--- a/src/Lucene.Net.Core/Search/SearcherLifetimeManager.cs
+++ b/src/Lucene.Net.Core/Search/SearcherLifetimeManager.cs
@@ -1,9 +1,10 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Linq;
namespace Lucene.Net.Search
{
- using Lucene.Net.Support;
using AlreadyClosedException = Lucene.Net.Store.AlreadyClosedException;
/*
@@ -90,16 +91,14 @@ namespace Lucene.Net.Search
/// searchers; but large merges don't complete very often and
/// it's unlikely you'll hit two of them in your expiration
/// window. Still you should budget plenty of heap in the
- /// JVM to have a good safety margin.
- ///
- /// @lucene.experimental
+ /// JVM to have a good safety margin.</p>
/// </summary>
public class SearcherLifetimeManager : IDisposable
{
internal const double NANOS_PER_SEC = 1000000000.0;
- private class SearcherTracker : IComparable<SearcherTracker>, IDisposable
+ private sealed class SearcherTracker : IComparable<SearcherTracker>, IDisposable
{
public readonly IndexSearcher Searcher;
public readonly double RecordTimeSec;
@@ -107,7 +106,7 @@ namespace Lucene.Net.Search
public SearcherTracker(IndexSearcher searcher)
{
- this.Searcher = searcher;
+ Searcher = searcher;
Version = ((DirectoryReader)searcher.IndexReader).Version;
searcher.IndexReader.IncRef();
// Use nanoTime not currentTimeMillis since it [in
@@ -116,7 +115,7 @@ namespace Lucene.Net.Search
}
// Newer searchers are sort before older ones:
- public virtual int CompareTo(SearcherTracker other)
+ public int CompareTo(SearcherTracker other)
{
return other.RecordTimeSec.CompareTo(RecordTimeSec);
}
@@ -130,16 +129,16 @@ namespace Lucene.Net.Search
}
}
- private volatile bool Closed;
+ private volatile bool _closed;
// TODO: we could get by w/ just a "set"; need to have
// Tracker hash by its version and have compareTo(Long)
// compare to its version
- private readonly ConcurrentHashMap<long, SearcherTracker> Searchers = new ConcurrentHashMap<long, SearcherTracker>();
+ private readonly ConcurrentDictionary<long, SearcherTracker> _searchers = new ConcurrentDictionary<long, SearcherTracker>();
private void EnsureOpen()
{
- if (Closed)
+ if (_closed)
{
throw new AlreadyClosedException("this SearcherLifetimeManager instance is closed");
}
@@ -157,7 +156,7 @@ namespace Lucene.Net.Search
/// You should record this long token in the search results
/// sent to your user, such that if the user performs a
/// follow-on action (clicks next page, drills down, etc.)
- /// the token is returned.
+ /// the token is returned.</p>
/// </summary>
public virtual long Record(IndexSearcher searcher)
{
@@ -165,22 +164,12 @@ namespace Lucene.Net.Search
// TODO: we don't have to use IR.getVersion to track;
// could be risky (if it's buggy); we could get better
// bug isolation if we assign our own private ID:
- long version = ((DirectoryReader)searcher.IndexReader).Version;
- SearcherTracker tracker = Searchers[version];
- if (tracker == null)
+ var version = ((DirectoryReader)searcher.IndexReader).Version;
+ var factoryMethodCalled = false;
+ var tracker = _searchers.GetOrAdd(version, l => { factoryMethodCalled = true; return new SearcherTracker(searcher); });
+ if (!factoryMethodCalled && tracker.Searcher != searcher)
{
- //System.out.println("RECORD version=" + version + " ms=" + System.currentTimeMillis());
- tracker = new SearcherTracker(searcher);
- if (Searchers.AddIfAbsent(version, tracker) != null)
- {
- // Another thread beat us -- must decRef to undo
- // incRef done by SearcherTracker ctor:
- tracker.Dispose();
- }
- }
- else if (tracker.Searcher != searcher)
- {
- throw new System.ArgumentException("the provided searcher has the same underlying reader version yet the searcher instance differs from before (new=" + searcher + " vs old=" + tracker.Searcher);
+ throw new ArgumentException("the provided searcher has the same underlying reader version yet the searcher instance differs from before (new=" + searcher + " vs old=" + tracker.Searcher);
}
return version;
@@ -194,16 +183,16 @@ namespace Lucene.Net.Search
/// requested searcher has already timed out. When this
/// happens you should notify your user that their session
/// timed out and that they'll have to restart their
- /// search.
+ /// search.</p>
///
/// <p>If this returns a non-null result, you must match
/// later call <seealso cref="#release"/> on this searcher, best
- /// from a finally clause.
+ /// from a finally clause.</p>
/// </summary>
public virtual IndexSearcher Acquire(long version)
{
EnsureOpen();
- SearcherTracker tracker = Searchers[version];
+ SearcherTracker tracker = _searchers[version];
if (tracker != null && tracker.Searcher.IndexReader.TryIncRef())
{
return tracker.Searcher;
@@ -277,15 +266,11 @@ namespace Lucene.Net.Search
// (not thread-safe since the values can change while
// ArrayList is init'ing itself); must instead iterate
// ourselves:
- List<SearcherTracker> trackers = new List<SearcherTracker>();
- foreach (SearcherTracker tracker in Searchers.Values)
- {
- trackers.Add(tracker);
- }
+ var trackers = _searchers.Values.ToList();
trackers.Sort();
- double lastRecordTimeSec = 0.0;
- double now = DateTime.Now.ToFileTime() / 100.0d / NANOS_PER_SEC;
- foreach (SearcherTracker tracker in trackers)
+ var lastRecordTimeSec = 0.0;
+ var now = DateTime.Now.ToFileTime() / 100.0d / NANOS_PER_SEC;
+ foreach (var tracker in trackers)
{
double ageSec;
if (lastRecordTimeSec == 0.0)
@@ -303,7 +288,8 @@ namespace Lucene.Net.Search
if (pruner.DoPrune(ageSec, tracker.Searcher))
{
//System.out.println("PRUNE version=" + tracker.version + " age=" + ageSec + " ms=" + System.currentTimeMillis());
- Searchers.Remove(tracker.Version);
+ SearcherTracker _;
+ _searchers.TryRemove(tracker.Version, out _);
tracker.Dispose();
}
lastRecordTimeSec = tracker.RecordTimeSec;
@@ -326,20 +312,21 @@ namespace Lucene.Net.Search
{
lock (this)
{
- Closed = true;
- IList<SearcherTracker> toClose = new List<SearcherTracker>(Searchers.Values);
+ _closed = true;
+ IList<SearcherTracker> toClose = new List<SearcherTracker>(_searchers.Values);
// Remove up front in case exc below, so we don't
// over-decRef on double-close:
- foreach (SearcherTracker tracker in toClose)
+ foreach (var tracker in toClose)
{
- Searchers.Remove(tracker.Version);
+ SearcherTracker _;
+ _searchers.TryRemove(tracker.Version, out _);
}
IOUtils.Close(toClose);
// Make some effort to catch mis-use:
- if (Searchers.Count != 0)
+ if (_searchers.Count != 0)
{
throw new InvalidOperationException("another thread called record while this SearcherLifetimeManager instance was being closed; not all searchers were closed");
}