public async Task TestScanTokensNonCoveringRangePartitions() { var builder = ClientTestUtil.CreateManyStringsSchema() .SetTableName(_tableName) .AddHashPartitions(2, "key") .CreateBasicRangePartition() .AddRangePartition((lower, upper) => { lower.SetString("key", "a"); upper.SetString("key", "f"); }) .AddRangePartition((lower, upper) => { lower.SetString("key", "h"); upper.SetString("key", "z"); }) .AddSplitRow(row => row.SetString("key", "k")); var table = await _client.CreateTableAsync(builder); for (char c = 'a'; c < 'f'; c++) { var row = table.NewInsert(); row.SetString("key", $"{c}"); row.SetString("c1", $"c1_{c}"); row.SetString("c2", $"c2_{c}"); await _session.EnqueueAsync(row); } for (char c = 'h'; c < 'z'; c++) { var row = table.NewInsert(); row.SetString("key", $"{c}"); row.SetString("c1", $"c1_{c}"); row.SetString("c2", $"c2_{c}"); await _session.EnqueueAsync(row); } await _session.FlushAsync(); var tokenBuilder = _client.NewScanTokenBuilder(table) .SetEmptyProjection(); List <KuduScanToken> tokens = await tokenBuilder.BuildAsync(); Assert.Equal(6, tokens.Count); await using var newClient = _harness.CreateClient(); var rowCount = await CountScanTokenRowsAsync(newClient, tokens); Assert.Equal('f' - 'a' + 'z' - 'h', rowCount); }
public async Task TestScanTokens() { var builder = ClientTestUtil.CreateManyStringsSchema() .SetTableName(_tableName) .AddHashPartitions(8, "key") .CreateBasicRangePartition() .AddSplitRow(row => row.SetString("key", "key_50")); var table = await _client.CreateTableAsync(builder); for (int i = 0; i < 100; i++) { var row = table.NewInsert(); row.SetString("key", $"key_{i}"); row.SetString("c1", $"c1_{i}"); row.SetString("c2", $"c2_{i}"); await _session.EnqueueAsync(row); } await _session.FlushAsync(); var tokenBuilder = _client.NewScanTokenBuilder(table) .SetEmptyProjection() // For this test, make sure that we cover the case that not all tablets // are returned in a single batch. .SetFetchTabletsPerRangeLookup(4); List <KuduScanToken> tokens = await tokenBuilder.BuildAsync(); Assert.Equal(16, tokens.Count); await using var newClient = _harness.CreateClient(); var rowCount = await CountScanTokenRowsAsync(newClient, tokens); Assert.Equal(100, rowCount); }
public async Task TestScanTokenWithWrongUuidSerialization() { int buckets = 8; var builder = ClientTestUtil.CreateManyStringsSchema() .SetTableName(_tableName) .AddHashPartitions(buckets, "key"); var table = await _client.CreateTableAsync(builder); int totalRows = 100; var inserts = Enumerable.Range(0, totalRows).Select(i => { var insert = table.NewInsert(); insert.SetString("key", $"key_{i:00}"); insert.SetString("c1", $"c1_{i}"); insert.SetString("c2", $"c2_{i}"); return(insert); }); await _client.WriteAsync(inserts); var tokens = await _client.NewScanTokenBuilder(table) .SetEmptyProjection() .IncludeTableMetadata(true) .IncludeTabletMetadata(true) .BuildAsync(); Assert.Equal(buckets, tokens.Count); // Create a new client, open the newly created kudu table, and new scanners. await using var newClient = _harness.CreateClient(); var newTable = await newClient.OpenTableAsync(_tableName); var tabletIds = new List <string>(); var scanners = new List <KuduScanner>(); foreach (var token in tokens) { tabletIds.Add(token.Tablet.TabletId); var scanBuilder = await newClient.NewScanBuilderFromTokenAsync(token); scanners.Add(scanBuilder.Build()); } // Step down all tablet leaders. var masters = string.Join(',', _harness.GetMasterServers()); foreach (var tabletId in tabletIds) { await MiniKuduCluster.RunKuduToolAsync( "tablet", "leader_step_down", masters, tabletId); await Task.Delay(1000); } // Delete all rows first through the new client. var deletes = Enumerable.Range(0, totalRows).Select(i => { var delete = table.NewDelete(); delete.SetString("key", $"key_{i:00}"); return(delete); }); await newClient.WriteAsync(deletes); // Insert all rows again through the new client. var newInserts = Enumerable.Range(0, totalRows).Select(i => { var insert = table.NewInsert(); insert.SetString("key", $"key_{i:00}"); insert.SetString("c1", $"c1_{i}"); insert.SetString("c2", $"c2_{i}"); return(insert); }); await newClient.WriteAsync(newInserts); // Verify all the row count. long rowCount = 0; foreach (var scanner in scanners) { rowCount += await scanner.CountAsync(); } Assert.Equal(totalRows, rowCount); }