@@ -98,10 +98,6 @@ private static UnsupportedOperationException unsupported() {
98
98
return new UnsupportedOperationException ();
99
99
}
100
100
101
- public TranslogLeafReader getLeafReader () {
102
- return leafReader ;
103
- }
104
-
105
101
@ Override
106
102
protected DirectoryReader doOpenIfChanged () {
107
103
throw unsupported ();
@@ -142,6 +138,45 @@ public CacheHelper getReaderCacheHelper() {
142
138
return leafReader .getReaderCacheHelper ();
143
139
}
144
140
141
+ static DirectoryReader createInMemoryReader (
142
+ ShardId shardId ,
143
+ EngineConfig engineConfig ,
144
+ Directory directory ,
145
+ DocumentParser documentParser ,
146
+ MappingLookup mappingLookup ,
147
+ Translog .Index operation
148
+ ) {
149
+ final ParsedDocument parsedDocs = documentParser .parseDocument (
150
+ new SourceToParse (operation .id (), operation .source (), XContentHelper .xContentType (operation .source ()), operation .routing ()),
151
+ mappingLookup
152
+ );
153
+
154
+ parsedDocs .updateSeqID (operation .seqNo (), operation .primaryTerm ());
155
+ parsedDocs .version ().setLongValue (operation .version ());
156
+ // To guarantee indexability, we configure the analyzer and codec using the main engine configuration
157
+ final IndexWriterConfig writeConfig = new IndexWriterConfig (engineConfig .getAnalyzer ()).setOpenMode (
158
+ IndexWriterConfig .OpenMode .CREATE
159
+ ).setCodec (engineConfig .getCodec ());
160
+ try (IndexWriter writer = new IndexWriter (directory , writeConfig )) {
161
+ writer .addDocument (parsedDocs .rootDoc ());
162
+ final DirectoryReader reader = open (writer );
163
+ if (reader .leaves ().size () != 1 || reader .leaves ().get (0 ).reader ().numDocs () != 1 ) {
164
+ reader .close ();
165
+ throw new IllegalStateException (
166
+ "Expected a single document segment; "
167
+ + "but ["
168
+ + reader .leaves ().size ()
169
+ + " segments with "
170
+ + reader .leaves ().get (0 ).reader ().numDocs ()
171
+ + " documents"
172
+ );
173
+ }
174
+ return reader ;
175
+ } catch (IOException e ) {
176
+ throw new EngineException (shardId , "failed to create an in-memory segment for get [" + operation .id () + "]" , e );
177
+ }
178
+ }
179
+
145
180
private static class TranslogLeafReader extends LeafReader {
146
181
147
182
private static final FieldInfo FAKE_SOURCE_FIELD = new FieldInfo (
@@ -240,7 +275,8 @@ private LeafReader getDelegate() {
240
275
ensureOpen ();
241
276
reader = delegate .get ();
242
277
if (reader == null ) {
243
- reader = createInMemoryLeafReader ();
278
+ var indexReader = createInMemoryReader (shardId , engineConfig , directory , documentParser , mappingLookup , operation );
279
+ reader = indexReader .leaves ().get (0 ).reader ();
244
280
final LeafReader existing = delegate .getAndSet (reader );
245
281
assert existing == null ;
246
282
onSegmentCreated .run ();
@@ -250,39 +286,6 @@ private LeafReader getDelegate() {
250
286
return reader ;
251
287
}
252
288
253
- private LeafReader createInMemoryLeafReader () {
254
- assert Thread .holdsLock (this );
255
- final ParsedDocument parsedDocs = documentParser .parseDocument (
256
- new SourceToParse (operation .id (), operation .source (), XContentHelper .xContentType (operation .source ()), operation .routing ()),
257
- mappingLookup
258
- );
259
-
260
- parsedDocs .updateSeqID (operation .seqNo (), operation .primaryTerm ());
261
- parsedDocs .version ().setLongValue (operation .version ());
262
- // To guarantee indexability, we configure the analyzer and codec using the main engine configuration
263
- final IndexWriterConfig writeConfig = new IndexWriterConfig (engineConfig .getAnalyzer ()).setOpenMode (
264
- IndexWriterConfig .OpenMode .CREATE
265
- ).setCodec (engineConfig .getCodec ());
266
- try (IndexWriter writer = new IndexWriter (directory , writeConfig )) {
267
- writer .addDocument (parsedDocs .rootDoc ());
268
- final DirectoryReader reader = open (writer );
269
- if (reader .leaves ().size () != 1 || reader .leaves ().get (0 ).reader ().numDocs () != 1 ) {
270
- reader .close ();
271
- throw new IllegalStateException (
272
- "Expected a single document segment; "
273
- + "but ["
274
- + reader .leaves ().size ()
275
- + " segments with "
276
- + reader .leaves ().get (0 ).reader ().numDocs ()
277
- + " documents"
278
- );
279
- }
280
- return reader .leaves ().get (0 ).reader ();
281
- } catch (IOException e ) {
282
- throw new EngineException (shardId , "failed to create an in-memory segment for get [" + operation .id () + "]" , e );
283
- }
284
- }
285
-
286
289
@ Override
287
290
public CacheHelper getCoreCacheHelper () {
288
291
return getDelegate ().getCoreCacheHelper ();
0 commit comments