Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
    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);
    }