2424import org .apache .lucene .index .Sorter ;
2525import org .apache .lucene .util .IOUtils ;
2626import org .apache .lucene .util .RamUsageEstimator ;
27+ import org .opensearch .common .StopWatch ;
2728import org .opensearch .knn .index .quantizationservice .QuantizationService ;
2829import org .opensearch .knn .index .VectorDataType ;
2930import org .opensearch .knn .index .codec .nativeindex .NativeIndexWriter ;
3031import org .opensearch .knn .index .vectorvalues .KNNVectorValues ;
3132import org .opensearch .knn .index .vectorvalues .KNNVectorValuesFactory ;
33+ import org .opensearch .knn .plugin .stats .KNNGraphValue ;
3234import org .opensearch .knn .quantization .models .quantizationParams .QuantizationParams ;
3335import org .opensearch .knn .quantization .models .quantizationState .QuantizationState ;
3436
4547@ RequiredArgsConstructor
4648public class NativeEngines990KnnVectorsWriter extends KnnVectorsWriter {
4749 private static final long SHALLOW_SIZE = RamUsageEstimator .shallowSizeOfInstance (NativeEngines990KnnVectorsWriter .class );
50+
51+ private static final String FLUSH_OPERATION = "flush" ;
52+ private static final String MERGE_OPERATION = "merge" ;
53+
4854 private final SegmentWriteState segmentWriteState ;
4955 private final FlatVectorsWriter flatVectorsWriter ;
5056 private final List <NativeEngineFieldVectorsWriter <?>> fields = new ArrayList <>();
@@ -78,7 +84,9 @@ public void flush(int maxDoc, final Sorter.DocMap sortMap) throws IOException {
7884 field .getFieldInfo (),
7985 (vectorDataType , fieldInfo , fieldVectorsWriter ) -> getKNNVectorValues (vectorDataType , fieldVectorsWriter ),
8086 NativeIndexWriter ::flushIndex ,
81- field
87+ field ,
88+ KNNGraphValue .REFRESH_TOTAL_TIME_IN_MILLIS ,
89+ FLUSH_OPERATION
8290 );
8391 }
8492 }
@@ -88,7 +96,14 @@ public void mergeOneField(final FieldInfo fieldInfo, final MergeState mergeState
8896 // This will ensure that we are merging the FlatIndex during force merge.
8997 flatVectorsWriter .mergeOneField (fieldInfo , mergeState );
9098 // For merge, pick values from flat vector and reindex again. This will use the flush operation to create graphs
91- trainAndIndex (fieldInfo , this ::getKNNVectorValuesForMerge , NativeIndexWriter ::mergeIndex , mergeState );
99+ trainAndIndex (
100+ fieldInfo ,
101+ this ::getKNNVectorValuesForMerge ,
102+ NativeIndexWriter ::mergeIndex ,
103+ mergeState ,
104+ KNNGraphValue .MERGE_TOTAL_TIME_IN_MILLIS ,
105+ MERGE_OPERATION
106+ );
92107
93108 }
94109
@@ -214,7 +229,9 @@ private <T, C> void trainAndIndex(
214229 final FieldInfo fieldInfo ,
215230 final VectorValuesRetriever <VectorDataType , FieldInfo , C , KNNVectorValues <T >> vectorValuesRetriever ,
216231 final IndexOperation <T > indexOperation ,
217- final C VectorProcessingContext
232+ final C VectorProcessingContext ,
233+ final KNNGraphValue graphBuildTime ,
234+ final String operationName
218235 ) throws IOException {
219236 final VectorDataType vectorDataType = extractVectorDataType (fieldInfo );
220237 KNNVectorValues <T > knnVectorValues = vectorValuesRetriever .apply (vectorDataType , fieldInfo , VectorProcessingContext );
@@ -228,6 +245,12 @@ private <T, C> void trainAndIndex(
228245 : NativeIndexWriter .getWriter (fieldInfo , segmentWriteState );
229246
230247 knnVectorValues = vectorValuesRetriever .apply (vectorDataType , fieldInfo , VectorProcessingContext );
248+
249+ StopWatch stopWatch = new StopWatch ();
250+ stopWatch .start ();
231251 indexOperation .buildAndWrite (writer , knnVectorValues );
252+ long time_in_millis = stopWatch .totalTime ().millis ();
253+ graphBuildTime .set (graphBuildTime .getValue () + time_in_millis );
254+ log .warn ("Graph build took " + time_in_millis + " ms for " + operationName );
232255 }
233256}
0 commit comments