Skip to content

Commit 53e4965

Browse files
authored
Merge pull request #81 from grisha-kotler/RavenDB-24810-6.2
[6.0] - RavenDB-24810 & RavenDB-24815 - 5.4 to 6.0
2 parents 5d5af53 + 532f1b5 commit 53e4965

27 files changed

+570
-197
lines changed

src/Directory.Build.props

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>3.0.60012</Version>
4-
<FileVersion>3.0.60012</FileVersion>
5-
<LangVersion>latest</LangVersion>
3+
<Version>3.0.60013</Version>
4+
<FileVersion>3.0.60013</FileVersion>
5+
<LangVersion>12.0</LangVersion>
66
<DebugType>embedded</DebugType>
77

88
<RepositoryType>git</RepositoryType>

src/Lucene.Net/Index/ArrayHolder.cs

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,40 @@
11
using System;
2-
using System.Buffers;
32
using System.Threading;
43
using Lucene.Net.Store;
4+
using Lucene.Net.Util;
55

66
namespace Lucene.Net.Index
77
{
88
public class ArrayHolder : IDisposable
99
{
10-
private readonly int _size;
1110
private readonly Directory _directory;
1211
private readonly string _name;
13-
private readonly long[] _longArray;
14-
private readonly TermInfo[] _termInfoArray;
12+
private readonly IArray<long> _indexPointers;
13+
private readonly IArray<TermInfo> _termInfos;
1514
private readonly UnmanagedIndexTerms _unmanagedIndexTerms;
1615

1716
private int _usages;
1817
private long _managedAllocations;
1918

20-
public Span<long> LongArray => _longArray.AsSpan(0, _size);
21-
public Span<TermInfo> InfoArray => _termInfoArray.AsSpan(0, _size);
19+
public IArray<long> IndexPointers => _indexPointers;
20+
public IArray<TermInfo> TermInfos => _termInfos;
2221
public UnmanagedIndexTerms UnmanagedIndexTerms => _unmanagedIndexTerms;
23-
public int ActualArraySize => _longArray.Length;
2422

2523
public static Action<long> OnArrayHolderCreated;
2624

2725
public static Action<long> OnArrayHolderDisposed;
2826

29-
public const int ArrayPoolThreshold = 128 * 1024;
27+
public long TotalManagedAllocations => _indexPointers.TotalManagedAllocations + _termInfos.TotalManagedAllocations + _unmanagedIndexTerms.TotalManagedAllocations;
3028

31-
public ArrayHolder(int size, Directory directory, string name)
29+
public ArrayHolder(int size, Directory directory, string name, FieldInfos fieldInfos)
3230
{
33-
_size = size;
3431
_directory = directory;
3532
_name = name;
3633

37-
if (size > ArrayPoolThreshold)
38-
{
39-
_longArray = new long[size];
40-
_termInfoArray = new TermInfo[size];
41-
}
42-
else
43-
{
44-
_longArray = ArrayPool<long>.Shared.Rent(size);
45-
_termInfoArray = ArrayPool<TermInfo>.Shared.Rent(size);
46-
}
34+
_indexPointers = HybridArray.Create<long>(size, UnmanagedStringArray.Type.TermCache, clear: false);
35+
_termInfos = HybridArray.Create<TermInfo>(size, UnmanagedStringArray.Type.TermCache, clear: false);
4736

48-
_unmanagedIndexTerms = new UnmanagedIndexTerms(size);
37+
_unmanagedIndexTerms = new UnmanagedIndexTerms(size, fieldInfos);
4938
}
5039

5140
public void AddRef()
@@ -67,20 +56,20 @@ public static ArrayHolder GenerateArrayHolder(Directory directory, string name,
6756
{
6857
int indexSize = 1 + ((int)indexEnum.size - 1) / indexDivisor; // otherwise read index
6958

70-
var holder = new ArrayHolder(indexSize, directory, name);
59+
var holder = new ArrayHolder(indexSize, directory, name, fieldInfos);
7160

7261
for (int i = 0; indexEnum.Next(state); i++)
7362
{
74-
holder.UnmanagedIndexTerms.Add(i, indexEnum.Field, indexEnum.TextAsSpan);
75-
holder.InfoArray[i] = indexEnum.TermInfo();
76-
holder.LongArray[i] = indexEnum.indexPointer;
63+
holder.UnmanagedIndexTerms.Add(i, indexEnum.FieldNumber, indexEnum.TextAsSpan);
64+
holder.TermInfos[i] = indexEnum.TermInfo();
65+
holder.IndexPointers[i] = indexEnum.indexPointer;
7766

7867
for (int j = 1; j < indexDivisor; j++)
7968
if (!indexEnum.Next(state))
8069
break;
8170
}
8271

83-
holder._managedAllocations = (holder.ActualArraySize * (TermInfo.SizeOf + sizeof(long)));
72+
holder._managedAllocations = holder.TotalManagedAllocations;
8473

8574
OnArrayHolderCreated?.Invoke(holder._managedAllocations);
8675

@@ -98,18 +87,13 @@ public void Dispose()
9887
{
9988
GC.SuppressFinalize(this);
10089

101-
OnArrayHolderDisposed?.Invoke(_managedAllocations);
102-
103-
_unmanagedIndexTerms?.Dispose();
104-
105-
if (_size > ArrayPoolThreshold)
106-
return;
107-
108-
if (_longArray != null)
109-
ArrayPool<long>.Shared.Return(_longArray);
90+
using (_unmanagedIndexTerms)
91+
using (_indexPointers)
92+
using (_termInfos)
93+
{
94+
}
11095

111-
if (_termInfoArray != null)
112-
ArrayPool<TermInfo>.Shared.Return(_termInfoArray);
96+
OnArrayHolderDisposed?.Invoke(_managedAllocations);
11397
}
11498

11599
~ArrayHolder()

src/Lucene.Net/Index/SegmentTermEnum.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ public System.Object Clone(IState state)
125125
return clone;
126126
}
127127

128-
internal void Seek(long pointer, long p, Term t, TermInfo ti, IState state)
128+
internal void Seek(long pointer, long p, (string Field, UnmanagedStringArray.UnmanagedString Text) tuple, TermInfo ti, IState state)
129129
{
130130
input.Seek(pointer, state);
131131
position = p;
132-
termBuffer.Set(t);
132+
termBuffer.Set(tuple);
133133
prevBuffer.Reset();
134134
termInfo.Set(ti);
135135
}
@@ -202,6 +202,11 @@ public string Field
202202
get { return termBuffer.Field; }
203203
}
204204

205+
public int FieldNumber
206+
{
207+
get { return termBuffer.FieldNumber; }
208+
}
209+
205210
public Span<char> TextAsSpan
206211
{
207212
get { return termBuffer.TextAsSpan; }

src/Lucene.Net/Index/Term.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
using System;
1919
using System.Runtime.CompilerServices;
20+
using Lucene.Net.Util;
2021
using StringHelper = Lucene.Net.Util.StringHelper;
2122

2223
namespace Lucene.Net.Index
@@ -141,12 +142,12 @@ public int CompareTo(Term other)
141142
}
142143

143144
[MethodImpl(MethodImplOptions.AggressiveInlining)]
144-
public int CompareTo(UnmanagedTerm other)
145+
public int CompareTo((string Field, UnmanagedStringArray.UnmanagedString Text) tuple)
145146
{
146-
if (ReferenceEquals(field, other.Field))
147-
return -other.Text.CompareTo(text);
147+
if (ReferenceEquals(field, tuple.Field))
148+
return -tuple.Text.CompareTo(text);
148149

149-
return String.CompareOrdinal(field, other.Field);
150+
return String.CompareOrdinal(field, tuple.Field);
150151
}
151152

152153
///// <summary>Resets the field and text of a Term. </summary>

src/Lucene.Net/Index/TermBuffer.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
* limitations under the License.
1616
*/
1717

18-
using System;
1918
using Lucene.Net.Store;
2019
using Lucene.Net.Support;
20+
using Lucene.Net.Util;
21+
using System;
2122
using IndexInput = Lucene.Net.Store.IndexInput;
2223
using UnicodeUtil = Lucene.Net.Util.UnicodeUtil;
2324

@@ -28,6 +29,7 @@ public sealed class TermBuffer : System.ICloneable
2829
{
2930

3031
private System.String field;
32+
private int fieldNumber = -1;
3133
private Term term; // cached
3234
private bool preUTF8Strings; // true if strings are stored in modified UTF8 encoding (LUCENE-510)
3335
private bool dirty; // true if text was set externally (ie not read via UTF8 bytes)
@@ -37,6 +39,7 @@ public sealed class TermBuffer : System.ICloneable
3739

3840
public Span<char> TextAsSpan => new Span<char>(text.result, 0, text.length);
3941
public string Field => field;
42+
public int FieldNumber => fieldNumber;
4043

4144
public int CompareTo(TermBuffer other)
4245
{
@@ -71,7 +74,7 @@ internal void SetPreUTF8Strings()
7174
preUTF8Strings = true;
7275
}
7376

74-
public void Read(IndexInput input, FieldInfos fieldInfos, IState state)
77+
public void Read(IndexInput input, FieldInfos fieldInfos, IState state)
7578
{
7679
this.term = null; // invalidate cache
7780
int start = input.ReadVInt(state);
@@ -102,10 +105,12 @@ public void Read(IndexInput input, FieldInfos fieldInfos, IState state)
102105
UnicodeUtil.UTF8toUTF16(bytes.result, start, length, text);
103106
}
104107
}
105-
this.field = fieldInfos.FieldName(input.ReadVInt(state));
106-
}
108+
109+
this.fieldNumber = input.ReadVInt(state);
110+
this.field = fieldInfos.FieldName(fieldNumber);
111+
}
107112

108-
public void Set(Term term)
113+
public void Set(Term term)
109114
{
110115
if (term == null)
111116
{
@@ -121,17 +126,28 @@ public void Set(Term term)
121126
this.term = term;
122127
}
123128

124-
public void Set(TermBuffer other)
129+
public void Set((string Field, UnmanagedStringArray.UnmanagedString Text) tuple)
130+
{
131+
text.SetLength(tuple.Text.Size);
132+
TextSupport.GetCharsFromUnmanagedString(tuple.Text, text.result);
133+
dirty = true;
134+
field = tuple.Field;
135+
term = null;
136+
}
137+
138+
public void Set(TermBuffer other)
125139
{
126140
text.CopyText(other.text);
127141
dirty = true;
128142
field = other.field;
143+
fieldNumber = other.fieldNumber;
129144
term = other.term;
130145
}
131146

132147
public void Reset()
133148
{
134149
field = null;
150+
fieldNumber = -1;
135151
text.SetLength(0);
136152
term = null;
137153
dirty = true;

src/Lucene.Net/Index/TermInfo.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ namespace Lucene.Net.Index
2121

2222
public struct TermInfo
2323
{
24-
public static int SizeOf = sizeof(int) + sizeof(long) + sizeof(long) + sizeof(int);
25-
2624
/// <summary>The number of documents which contain the term. </summary>
2725
internal int docFreq;
2826

src/Lucene.Net/Index/TermInfosReader.cs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,13 @@ sealed class TermInfosReader : IDisposable
3636
{
3737
private readonly Directory directory;
3838
private readonly String segment;
39-
private readonly FieldInfos fieldInfos;
4039

4140
private bool isDisposed;
4241

4342
private readonly LightWeightThreadLocal<ThreadResources> threadResources = new LightWeightThreadLocal<ThreadResources>();
4443
private readonly SegmentTermEnum origEnum;
4544
private readonly long size;
4645

47-
private UnmanagedIndexTerms unmanagedIndexTerms => _termsIndexCache.UnmanagedIndexTerms;
48-
private Span<TermInfo> indexInfos => _termsIndexCache.InfoArray;
49-
private Span<long> indexPointers =>_termsIndexCache.LongArray;
50-
5146
private readonly int totalIndexInterval;
5247

5348
private const int DEFAULT_CACHE_SIZE = 1024;
@@ -101,16 +96,15 @@ internal TermInfosReader(Directory dir, System.String seg, FieldInfos fis, int r
10196
{
10297
directory = dir;
10398
segment = seg;
104-
fieldInfos = fis;
10599

106-
origEnum = new SegmentTermEnum(directory.OpenInput(segment + "." + IndexFileNames.TERMS_EXTENSION, readBufferSize, state), fieldInfos, false, state);
100+
origEnum = new SegmentTermEnum(directory.OpenInput(segment + "." + IndexFileNames.TERMS_EXTENSION, readBufferSize, state), fis, false, state);
107101
size = origEnum.size;
108102

109103
if (indexDivisor != - 1)
110104
{
111105
// Load terms index
112106
totalIndexInterval = origEnum.indexInterval * indexDivisor;
113-
_termsIndexCache = directory.GetCache(segment + "." + IndexFileNames.TERMS_INDEX_EXTENSION, fieldInfos, readBufferSize, indexDivisor, state);
107+
_termsIndexCache = directory.GetCache(segment + "." + IndexFileNames.TERMS_INDEX_EXTENSION, fis, readBufferSize, indexDivisor, state);
114108
_termsIndexCache.AddRef();
115109
}
116110
else
@@ -197,7 +191,7 @@ private ThreadResources GetThreadResources(IState state)
197191
private unsafe int GetIndexOffset(Term term)
198192
{
199193
int lo = 0; // binary search unmanagedIndexTerms[]
200-
int hi = unmanagedIndexTerms.Length - 1;
194+
int hi = _termsIndexCache.UnmanagedIndexTerms.Length - 1;
201195

202196
byte[] arr = null;
203197
Span<byte> stringAsBytes;
@@ -223,7 +217,7 @@ private unsafe int GetIndexOffset(Term term)
223217
while (hi >= lo)
224218
{
225219
int mid = Number.URShift((lo + hi), 1);
226-
int delta = CompareTerms(term.Field, stringAsBytes, stringAsSpan, unmanagedIndexTerms[mid]);
220+
int delta = CompareTerms(term.Field, stringAsBytes, stringAsSpan, _termsIndexCache.UnmanagedIndexTerms[mid]);
227221
if (delta < 0)
228222
hi = mid - 1;
229223
else if (delta > 0)
@@ -241,12 +235,12 @@ private unsafe int GetIndexOffset(Term term)
241235
}
242236
}
243237

244-
private static int CompareTerms(string field, Span<byte> stringAsBytes, ReadOnlySpan<char> stringAsChar, UnmanagedTerm unmanagedTerm)
238+
private static int CompareTerms(string field, Span<byte> stringAsBytes, ReadOnlySpan<char> stringAsChar, (string Field, UnmanagedString Text) tuple)
245239
{
246-
if (ReferenceEquals(field, unmanagedTerm.Field))
247-
return UnmanagedString.CompareOrdinal(stringAsBytes, stringAsChar, unmanagedTerm.Text);
240+
if (ReferenceEquals(field, tuple.Field))
241+
return UnmanagedString.CompareOrdinal(stringAsBytes, stringAsChar, tuple.Text);
248242

249-
return String.CompareOrdinal(field, unmanagedTerm.Field);
243+
return String.CompareOrdinal(field, tuple.Field);
250244
}
251245

252246
internal static Term DeepCopyOf(Term other)
@@ -257,8 +251,8 @@ internal static Term DeepCopyOf(Term other)
257251
}
258252

259253
private void SeekEnum(SegmentTermEnum enumerator, int indexOffset, IState state)
260-
{
261-
enumerator.Seek(indexPointers[indexOffset], ((long)indexOffset * totalIndexInterval) - 1, unmanagedIndexTerms[indexOffset].ToTerm(), indexInfos[indexOffset], state);
254+
{
255+
enumerator.Seek(_termsIndexCache.IndexPointers[indexOffset], ((long)indexOffset * totalIndexInterval) - 1, _termsIndexCache.UnmanagedIndexTerms[indexOffset], _termsIndexCache.TermInfos[indexOffset], state);
262256
}
263257

264258
/// <summary>Returns the TermInfo for a Term in the set, or null. </summary>
@@ -295,7 +289,7 @@ private TermInfo Get(Term term, bool useCache, IState state)
295289
if (enumerator.Term != null && ((enumerator.Prev() != null && term.CompareTo(enumerator.Prev()) > 0) || term.CompareTo(enumerator.Term) >= 0))
296290
{
297291
int enumOffset = (int) (enumerator.position / totalIndexInterval) + 1;
298-
if (unmanagedIndexTerms.Length == enumOffset || term.CompareTo(unmanagedIndexTerms[enumOffset]) < 0)
292+
if (_termsIndexCache.UnmanagedIndexTerms.Length == enumOffset || term.CompareTo(_termsIndexCache.UnmanagedIndexTerms[enumOffset]) < 0)
299293
{
300294
// no need to seek
301295

@@ -340,9 +334,9 @@ private TermInfo Get(Term term, bool useCache, IState state)
340334
return ti;
341335
}
342336

343-
private void EnsureIndexIsRead()
337+
private void EnsureIndexIsRead()
344338
{
345-
if (unmanagedIndexTerms == null)
339+
if (_termsIndexCache.UnmanagedIndexTerms == null)
346340
{
347341
throw new SystemException("terms index was not loaded when this reader was created");
348342
}

0 commit comments

Comments
 (0)