public async Task TestOpenScanWithDroppedPartition() { await using var miniCluster = await new MiniKuduClusterBuilder().BuildAsync(); await using var client = miniCluster.CreateClient(); var builder = ClientTestUtil.GetBasicSchema() .SetTableName("TestOpenScanWithDroppedPartition") .CreateBasicRangePartition() .AddRangePartition((lower, upper) => { lower.SetInt32("key", 0); upper.SetInt32("key", 1000); }) .AddRangePartition((lower, upper) => { lower.SetInt32("key", 1000); upper.SetInt32("key", 2000); }); var table = await client.CreateTableAsync(builder); // Load rows into both partitions. int numRows = 1999; await ClientTestUtil.LoadDefaultTableAsync(client, table, numRows); // Scan the rows while dropping a partition. var scanner = client.NewScanBuilder(table) // Set a small batch size so the first scan doesn't read all the rows. .SetBatchSizeBytes(100) .SetReadMode(ReadMode.ReadYourWrites) .Build(); long rowsScanned = 0; int batchNum = 0; await foreach (var resultSet in scanner) { if (batchNum == 1) { // Drop the partition. await client.AlterTableAsync(new AlterTableBuilder(table) .DropRangePartition((lower, upper) => { lower.SetInt32("key", 0); upper.SetInt32("key", 1000); })); // Give time for the background drop operations. await Task.Delay(1000); // TODO: Verify the partition was dropped. } rowsScanned += resultSet.Count; batchNum++; } Assert.True(batchNum > 1); Assert.Equal(numRows, rowsScanned); }
public async Task TestScanTokenRequestsWithMetadata( bool includeTableMetadata, bool includeTabletMetadata) { var builder = ClientTestUtil.GetBasicSchema() .SetTableName(_tableName) .SetNumReplicas(3); var table = await _client.CreateTableAsync(builder); await ClientTestUtil.LoadDefaultTableAsync(_client, table, 1); var tokens = await _client.NewScanTokenBuilder(table) .IncludeTableMetadata(includeTableMetadata) .IncludeTabletMetadata(includeTabletMetadata) .BuildAsync(); var token = Assert.Single(tokens); // Use a new client to simulate hydrating in a new process. var newClient = _harness.CreateClient(); var scanBuilder = await newClient.NewScanBuilderFromTokenAsync(token.Serialize()); var scanner = scanBuilder.Build(); Assert.Equal(1, await scanner.CountAsync()); }
public async Task TestScanTokensWithExtraPredicate() { int numRows = 100; int predicateIndex = 0; int predicateValue = 1; var builder = ClientTestUtil.GetBasicSchema() .SetTableName(_tableName) .CreateBasicRangePartition(); var table = await _client.CreateTableAsync(builder); await ClientTestUtil.LoadDefaultTableAsync(_client, table, numRows); var tokens = await _client.NewScanTokenBuilder(table).BuildAsync(); var columnSchema = table.Schema.GetColumn(predicateIndex); var predicate = KuduPredicate.NewComparisonPredicate( columnSchema, ComparisonOp.Equal, predicateValue); var resultKeys = new List <int>(); foreach (var token in tokens) { byte[] serialized = token.Serialize(); var scanBuilder = await _client.NewScanBuilderFromTokenAsync(serialized); var scanner = scanBuilder .AddPredicate(predicate) .Build(); await foreach (var resultSet in scanner) { foreach (var row in resultSet) { resultKeys.Add(row.GetInt32(predicateIndex)); } } } Assert.Collection(resultKeys, key => Assert.Equal(predicateValue, key)); }