From 274f5232af448641976b59013888197613db8a86 Mon Sep 17 00:00:00 2001 From: Matthew McNeely Date: Tue, 19 May 2026 16:25:16 -0400 Subject: [PATCH] systest/vector: poll for HNSW index readiness instead of fixed sleeps TestVectorIndexRebuilding, TestVectorIndexDropPredicate, and TestVectorIndexWithoutSchema slept a fixed 5s after SetupSchema and assumed the HNSW index was ready. Rebuilding the index over pre-existing data is asynchronous, so the fixed sleep flaked on slower CI runners. Replace the sleeps with require.Eventually polling a sample similar_to query until it returns the expected result count (30s budget, 500ms interval). Also move `defer cleanup()` after the Client() error check in three tests so a cleanup from a failed Client() isn't deferred. Co-Authored-By: Claude Opus 4.8 (1M context) --- systest/vector/vector_test.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/systest/vector/vector_test.go b/systest/vector/vector_test.go index 536ba4b726f..4ea4618d40b 100644 --- a/systest/vector/vector_test.go +++ b/systest/vector/vector_test.go @@ -263,10 +263,14 @@ func TestVectorIndexRebuilding(t *testing.T) { // drop index require.NoError(t, gc.SetupSchema(testSchemaWithoutIndex)) - time.Sleep(5 * time.Second) // rebuild index require.NoError(t, gc.SetupSchema(testSchema)) - time.Sleep(5 * time.Second) + + // Rebuilding the HNSW index over pre-existing data is async; poll until ready. + require.Eventually(t, func() bool { + res, err := gc.QueryMultipleVectorsUsingSimilarTo(vectors[0], pred, 100) + return err == nil && len(res) == 100 + }, 30*time.Second, 500*time.Millisecond, "vector index not ready after 30s") result, err = gc.Query(query) require.NoError(t, err) @@ -309,8 +313,8 @@ func TestVectorIndexDropPredicate(t *testing.T) { require.NoError(t, c.Start()) gc, cleanup, err := c.Client() - defer cleanup() require.NoError(t, err) + defer cleanup() require.NoError(t, gc.LoginIntoNamespace(context.Background(), dgraphapi.DefaultUser, dgraphapi.DefaultPassword, x.RootNamespace)) @@ -365,6 +369,12 @@ func TestVectorIndexDropPredicate(t *testing.T) { // add index back require.NoError(t, gc.SetupSchema(testSchema)) + // Rebuilding the HNSW index over pre-existing data is async; poll until ready. + require.Eventually(t, func() bool { + res, err := gc.QueryMultipleVectorsUsingSimilarTo(vectors[0], pred, 100) + return err == nil && len(res) == 100 + }, 30*time.Second, 500*time.Millisecond, "vector index not ready after 30s") + result, err = gc.Query(query) require.NoError(t, err) require.JSONEq(t, fmt.Sprintf(`{"vector":[{"count":%v}]}`, numVectors), string(result.GetJson())) @@ -385,8 +395,8 @@ func TestVectorIndexWithoutSchema(t *testing.T) { require.NoError(t, c.Start()) gc, cleanup, err := c.Client() - defer cleanup() require.NoError(t, err) + defer cleanup() require.NoError(t, gc.LoginIntoNamespace(context.Background(), dgraphapi.DefaultUser, dgraphapi.DefaultPassword, x.RootNamespace)) @@ -401,6 +411,14 @@ func TestVectorIndexWithoutSchema(t *testing.T) { require.NoError(t, gc.SetupSchema(testSchema)) + // Building the HNSW index over pre-existing nodes is async. Poll a + // sample query until the index is ready rather than sleeping a fixed + // duration, which is unreliable on slower CI runners. + require.Eventually(t, func() bool { + res, err := gc.QueryMultipleVectorsUsingSimilarTo(vectors[0], pred, 100) + return err == nil && len(res) == 100 + }, 30*time.Second, 500*time.Millisecond, "vector index not ready after 30s") + for _, vect := range vectors { similarVects, err := gc.QueryMultipleVectorsUsingSimilarTo(vect, pred, 100) require.NoError(t, err) @@ -427,8 +445,8 @@ func TestVectorIndexWithoutSchemaWithoutIndex(t *testing.T) { require.NoError(t, c.Start()) gc, cleanup, err := c.Client() - defer cleanup() require.NoError(t, err) + defer cleanup() require.NoError(t, gc.LoginIntoNamespace(context.Background(), dgraphapi.DefaultUser, dgraphapi.DefaultPassword, x.RootNamespace))