Example #1
0
 public static BigtableClient CreateMutateRowsMockClient(
     MutateRowsRequest initialRequest,
     MutateRowsResponse.Types.Entry[] entriesForInitialStream,
     MutateRowsResponse.Types.Entry[][] entriesForRetryStreams = null) =>
 CreateMockClientForStreamingRpc(
     initialRequest,
     c => c.MutateRows(
         It.Is <MutateRowsRequest>(r => ReferenceEquals(r, initialRequest)),
         It.IsAny <CallSettings>()),
     c => c.MutateRows(
         It.IsAny <MutateRowsRequest>(),
         It.IsAny <CallSettings>()),
     entriesForInitialStream,
     entriesForRetryStreams,
     itemsToStream: entries => new MockMutateRowsStream(new MutateRowsResponse {
     Entries = { entries }
 }),
     validator: (request, response) =>
 {
     // Make sure the request is properly formulated for the mock stream being returned.
     if (request.Entries.Count != response.Responses.SelectMany(r => r.Entries).Count())
     {
         throw new InvalidOperationException("The specified request is invalid for the mock stream about to be returned.");
     }
 });
        public static BigtableClient CreateClientForMutateRowsRetries(
            MutateRowsRequest initialRequest,
            MutateRowsResponse.Types.Entry[] entriesForInitialResponse,
            MutateRowsResponse.Types.Entry[][] entriesForRetryResponses)
        {
            var mock = new Mock <BigtableServiceApiClient>();

            if (entriesForRetryResponses != null)
            {
                var retryResponses = new Queue <MockMutateRowsStream>(entriesForRetryResponses.Select(StreamFromEntries));
                mock.Setup(c => c.MutateRows(It.IsAny <MutateRowsRequest>(), It.IsAny <CallSettings>()))
                .Returns(retryResponses.Dequeue);
            }

            // Setup the initial response last so the catch-all setup doesn't overwrite it.
            mock.Setup(c => c.MutateRows(initialRequest, It.IsAny <CallSettings>()))
            .Returns(StreamFromEntries(entriesForInitialResponse));

            return(new BigtableClientImpl(new[] { mock.Object }, appProfileId: null));

            MockMutateRowsStream StreamFromEntries(MutateRowsResponse.Types.Entry[] entries) =>
            new MockMutateRowsStream(new MutateRowsResponse {
                Entries = { entries }
            });
        }
        /// <summary>
        /// Add Test Data into Given Google Cloud Bigtable
        /// </summary>
        public void InsertTestDataToTable()
        {
            try
            {
                if (!IsTableExists())
                {
                    throw new Exception("No Such Table Found");
                }
                var             bigtableClient = BigtableClient.Create();
                List <Mutation> Cols           = new List <Mutation>();
                TableName       _table         = new TableName(ProjectId, InstanceId, TableName);

                var request = new MutateRowsRequest
                {
                    TableNameAsTableName = _table,
                };
                request.Entries.Add(Mutations.CreateEntry(Guid.NewGuid().ToString(),
                                                          Mutations.SetCell(ColumnFamily, "TestColumnName", "Test Column Value")));
                bigtableClient.MutateRows(request);
            }
            catch (RpcException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Example #4
0
        /// <summary>Snippet for MutateRows</summary>
        public async Task MutateRowsRequestObject()
        {
            // Snippet: MutateRows(MutateRowsRequest, CallSettings)
            // Create client
            BigtableClient bigtableClient = BigtableClient.Create();
            // Initialize request argument(s)
            MutateRowsRequest request = new MutateRowsRequest
            {
                TableNameAsTableName = TableName.FromProjectInstanceTable("[PROJECT]", "[INSTANCE]", "[TABLE]"),
                Entries =
                {
                    new MutateRowsRequest.Types.Entry(),
                },
                AppProfileId = "",
            };

            // Make the request, returning a streaming response
            BigtableClient.MutateRowsStream response = bigtableClient.MutateRows(request);

            // Read streaming responses from server until complete
            // Note that C# 8 code can use await foreach
            AsyncResponseStream <MutateRowsResponse> responseStream = response.GetResponseStream();

            while (await responseStream.MoveNextAsync())
            {
                MutateRowsResponse responseItem = responseStream.Current;
                // Do something with streamed response
            }
            // The response stream has completed
            // End snippet
        }
        /// <summary>Snippet for MutateRows</summary>
        public async Task MutateRows()
        {
            // Snippet: MutateRows(MutateRowsRequest,CallSettings)
            // Create client
            BigtableServiceApiClient bigtableServiceApiClient = BigtableServiceApiClient.Create();
            // Initialize request argument
            MutateRowsRequest request = new MutateRowsRequest
            {
                TableNameAsTableName = new TableName("[PROJECT]", "[INSTANCE]", "[TABLE]"),
                Entries = { },
            };

            // Make the request, returning a streaming response
            BigtableServiceApiClient.MutateRowsStream streamingResponse = bigtableServiceApiClient.MutateRows(request);

            // Read streaming responses from server until complete
            IAsyncEnumerator <MutateRowsResponse> responseStream = streamingResponse.ResponseStream;

            while (await responseStream.MoveNext())
            {
                MutateRowsResponse response = responseStream.Current;
                // Do something with streamed response
            }
            // The response stream has completed
            // End snippet
        }
Example #6
0
        public async Task RetryAfterTotalExpiration()
        {
            var settings = new BigtableServiceApiSettings();

            // Don't allow for any time to retry.
            settings.MutateRowsSettings = CallSettings.FromExpiration(Expiration.FromTimeout(TimeSpan.Zero));

            var request = new MutateRowsRequest
            {
                Entries =
                {
                    Mutations.CreateEntry("a", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("b", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("c", Mutations.DeleteFromRow())
                }
            };
            var client = Utilities.CreateMutateRowsMockClient(
                request,
                entriesForInitialStream: new[]
            {
                Utilities.CreateMutateRowsResponseEntry(0, Code.Ok),
                Utilities.CreateMutateRowsResponseEntry(1, Code.DeadlineExceeded),
                Utilities.CreateMutateRowsResponseEntry(2, Code.Ok)
            },
                entriesForRetryStreams: new[]
            {
                // 1st retry response entries
                new[] { Utilities.CreateMutateRowsResponseEntry(0, Code.Ok) }
            },
                settings: settings);

            var exception = await Assert.ThrowsAsync <RpcException>(() => client.MutateRowsAsync(request));

            Assert.Equal(StatusCode.DeadlineExceeded, exception.StatusCode);
        }
Example #7
0
        public async Task RetryBeforeTotalExpiration()
        {
            var request = new MutateRowsRequest
            {
                Entries =
                {
                    Mutations.CreateEntry("a", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("b", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("c", Mutations.DeleteFromRow())
                }
            };
            var client = Utilities.CreateMutateRowsMockClient(
                request,
                entriesForInitialStream: new[]
            {
                Utilities.CreateMutateRowsResponseEntry(0, Code.Ok),
                Utilities.CreateMutateRowsResponseEntry(1, Code.DeadlineExceeded),
                Utilities.CreateMutateRowsResponseEntry(2, Code.Ok)
            },
                entriesForRetryStreams: new[]
            {
                null,     // A null entry will throw an Unavailable RpcException
                // 2nd retry response entries
                new[] { Utilities.CreateMutateRowsResponseEntry(0, Code.Ok) }
            });

            await client.MutateRowsAsync(request);
        }
        public async Task SimpleRetry()
        {
            var request = new MutateRowsRequest
            {
                Entries =
                {
                    Mutations.CreateEntry("a", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("b", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("c", Mutations.DeleteFromRow())
                }
            };
            var client = Utilities.CreateMutateRowsMockClient(
                request,
                entriesForInitialStream: new[]
            {
                Utilities.CreateMutateRowsResponseEntry(0, Code.Ok),
                Utilities.CreateMutateRowsResponseEntry(1, Code.DeadlineExceeded),
                Utilities.CreateMutateRowsResponseEntry(2, Code.Ok)
            },
                entriesForRetryStreams: new[]
            {
                // 1st retry response entries
                new[] { Utilities.CreateMutateRowsResponseEntry(0, Code.Ok) }
            });

            var entries = (await client.MutateRowsAsync(request)).Entries.OrderBy(e => e.Index).ToList();

            Assert.Equal(3, entries.Count);

            var entry = entries[0];

            Assert.Equal(0, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[1];
            Assert.Equal(1, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[2];
            Assert.Equal(2, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);
        }
        public async Task InsertRowsAsync(
            TableName tableName,
            IEnumerable <BigtableByteString> rowKeys,
            string familyName = null,
            BigtableByteString?qualifierName = null,
            BigtableByteString?valuePrefix   = null,
            BigtableVersion?version          = null)
        {
            BigtableByteString rowKey = Guid.NewGuid().ToString();

            familyName    = familyName ?? ColumnFamily1;
            qualifierName = qualifierName ?? "row_index";
            valuePrefix   = valuePrefix ?? "";

            // TODO: Use cleaner API when available.
            int counter = 0;
            var request = new MutateRowsRequest
            {
                TableNameAsTableName = tableName,
                Entries =
                {
                    rowKeys.Select(k => new MutateRowsRequest.Types.Entry
                    {
                        RowKey    = k.Value,
                        Mutations =
                        {
                            Mutations.SetCell(
                                familyName,
                                qualifierName.Value,
                                valuePrefix.Value.Value.Concat(new BigtableByteString(counter++).Value),
                                version)
                        }
                    })
                }
            };

            var response = TableClient.MutateRows(request);

            while (await response.ResponseStream.MoveNext(default))
        public async Task NonRetryableErrorCodePreventsRetry()
        {
            var request = new MutateRowsRequest
            {
                Entries =
                {
                    Mutations.CreateEntry("a", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("b", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("c", Mutations.DeleteFromRow())
                }
            };
            var client = Utilities.CreateMutateRowsMockClient(
                request,
                entriesForInitialStream: new[]
            {
                Utilities.CreateMutateRowsResponseEntry(0, Code.Ok),
                Utilities.CreateMutateRowsResponseEntry(1, Code.FailedPrecondition),
                Utilities.CreateMutateRowsResponseEntry(2, Code.DeadlineExceeded)
            },
                entriesForRetryStreams: null // No retries should be made
                );

            var entries = (await client.MutateRowsAsync(request)).Entries.OrderBy(e => e.Index).ToList();

            Assert.Equal(3, entries.Count);

            var entry = entries[0];

            Assert.Equal(0, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[1];
            Assert.Equal(1, entry.Index);
            Assert.Equal((int)Code.FailedPrecondition, entry.Status.Code);

            entry = entries[2];
            Assert.Equal(2, entry.Index);
            Assert.Equal((int)Code.DeadlineExceeded, entry.Status.Code);
        }
Example #11
0
        /// <summary>
        /// Insert Test Data into Google Cloud Bigtable
        /// </summary>
        /// <returns></returns>
        public bool InsertTestData(string columnName, string columnValue)
        {
            try
            {
                var             bigtableClient = BigtableClient.Create();
                List <Mutation> Cols           = new List <Mutation>();
                TableName       _table         = new TableName(ProjectId, InstanceId, TableName);

                var request = new MutateRowsRequest
                {
                    TableNameAsTableName = _table,
                };
                request.Entries.Add(Mutations.CreateEntry(Guid.NewGuid().ToString(),
                                                          Mutations.SetCell(ColumnFamily, columnName, columnValue)));
                bigtableClient.MutateRows(request);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return(true);
        }
Example #12
0
            internal void DoHelloWorld()
            {
                #region 1. Create table with column family.

                try
                {
                    Console.WriteLine($"Create new table: {_settings.TableName} with column family {_settings.ColumnFamily}, Instance: {_settings.InstanceId}");

                    // Check whether a table with given TableName already exists.
                    if (!DoesTableExist(_bigtableTableAdminClient, _tableNameAdmin))
                    {
                        _bigtableTableAdminClient.CreateTable(
                            new InstanceName(_settings.ProjectId, _settings.InstanceId),
                            _settings.TableName,
                            new Table
                        {
                            Granularity    = Table.Types.TimestampGranularity.Millis,
                            ColumnFamilies =
                            {
                                {
                                    _settings.ColumnFamily, new ColumnFamily
                                    {
                                        GcRule = new GcRule
                                        {
                                            MaxNumVersions = 1
                                        }
                                    }
                                }
                            }
                        });
                        Console.WriteLine(DoesTableExist(_bigtableTableAdminClient, _tableNameAdmin)
                            ? $"Table {_settings.TableName} created succsessfully\n"
                            : $"There was a problem creating a table {_settings.TableName}");
                    }
                    else
                    {
                        Console.WriteLine($"Table: {_settings.TableName} already exist");
                    }

                    #endregion

                    #region 2. Insert multiple rows.

                    /* Each row has a unique row key.
                     *
                     * Note: This example uses sequential numeric IDs for simplicity, but
                     * this can result in poor performance in a production application.
                     * Since rows are stored in sorted order by key, sequential keys can
                     * result in poor distribution of operations across nodes.
                     *
                     * For more information about how to design a Bigtable schema for the
                     * best performance, see the documentation:
                     *
                     * https://cloud.google.com/bigtable/docs/schema-design */

                    Console.WriteLine($"Write some greetings to the table {_settings.TableName}");

                    // Insert 1 row using MutateRow()
                    _greetingIndex = 0;
                    try
                    {
                        _bigtableClient.MutateRow(_tableNameClient, _settings.RowKeyPrefix + _greetingIndex, MutationBuilder(_greetingIndex));
                        Console.WriteLine($"\tGreeting: --{_settings.Greetings[_greetingIndex]}-- written successfully");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"\tFailed to write Greeting: --{_settings.Greetings[_greetingIndex]}");
                        Console.WriteLine(ex.Message);
                        throw;
                    }

                    // Insert multiple rows using MutateRows()
                    // Build a MutateRowsRequest (contains table name and a collection of entries).
                    MutateRowsRequest request = new MutateRowsRequest
                    {
                        TableNameAsTableName = _tableNameClient
                    };

                    _mapToOriginalGreetingIndex = new List <int>();

                    while (++_greetingIndex < _settings.Greetings.Length)
                    {
                        _mapToOriginalGreetingIndex.Add(_greetingIndex);
                        // Build an entry for every greeting (contains of row key and a collection of mutations).
                        request.Entries.Add(Mutations.CreateEntry(_settings.RowKeyPrefix + _greetingIndex,
                                                                  MutationBuilder(_greetingIndex)));
                    }

                    BigtableClient.MutateRowsStream response = _bigtableClient.MutateRows(request);

                    Task write = CheckWrittenAsync(response);
                    write.Wait();

                    #endregion

                    #region Read the first row

                    Console.WriteLine("Read the first row");

                    int rowIndex = 0;

                    Row rowRead = _bigtableClient.ReadRow(_tableNameClient, _settings.RowKeyPrefix + rowIndex);
                    Console.WriteLine(
                        $"\tRow key: {rowRead.Key.ToStringUtf8()}, Value: {rowRead.Families[0].Columns[0].Cells[0].Value.ToStringUtf8()}");

                    #endregion

                    #region Read all rows.

                    BigtableClient.ReadRowsStream responseRead = _bigtableClient.ReadRows(_tableNameClient);

                    Task printRead = PrintReadRowsAsync(responseRead);
                    printRead.Wait();

                    #endregion

                    #region Delete table.

                    Console.WriteLine($"Delete table: {_settings.TableName}");

                    _bigtableTableAdminClient.DeleteTable(_tableNameAdmin);
                    if (DoesTableExist(_bigtableTableAdminClient, _tableNameAdmin) == false)
                    {
                        Console.WriteLine($"Table: {_settings.TableName} deleted succsessfully");
                    }

                    #endregion
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
Example #13
0
        private static void DoHelloWorld()
        {
            try
            {
                // [START bigtable_hw_connect]
                // BigtableTableAdminClient API lets us create, manage and delete tables.
                BigtableTableAdminClient bigtableTableAdminClient = BigtableTableAdminClient.Create();

                // BigtableClient API lets us read and write to a table.
                BigtableClient bigtableClient = BigtableClient.Create();
                // [END bigtable_hw_connect]

                // [START bigtable_hw_create_table]
                // Create a table with a single column family.
                Console.WriteLine($"Create new table: {tableId} with column family: {columnFamily}, instance: {instanceId}");

                // Check whether a table with given TableName already exists.
                if (!TableExist(bigtableTableAdminClient))
                {
                    bigtableTableAdminClient.CreateTable(
                        new InstanceName(projectId, instanceId),
                        tableId,
                        new Table
                    {
                        Granularity    = Table.Types.TimestampGranularity.Millis,
                        ColumnFamilies =
                        {
                            {
                                columnFamily, new ColumnFamily
                                {
                                    GcRule = new GcRule
                                    {
                                        MaxNumVersions = 1
                                    }
                                }
                            }
                        }
                    });
                    // Confirm that table was created successfully.
                    Console.WriteLine(TableExist(bigtableTableAdminClient)
                        ? $"Table {tableId} created successfully\n"
                        : $"There was a problem creating a table {tableId}");
                }
                else
                {
                    Console.WriteLine($"Table: {tableId} already exists");
                }
                // [END bigtable_hw_create_table]

                // [START bigtable_hw_write_rows]
                // Initialize Google.Cloud.Bigtable.V2.TableName object.
                Google.Cloud.Bigtable.Common.V2.TableName tableName = new Google.Cloud.Bigtable.Common.V2.TableName(projectId, instanceId, tableId);

                // Write some rows

                /* Each row has a unique row key.
                 *
                 *     Note: This example uses sequential numeric IDs for simplicity, but
                 *     this can result in poor performance in a production application.
                 *     Since rows are stored in sorted order by key, sequential keys can
                 *     result in poor distribution of operations across nodes.
                 *
                 *     For more information about how to design a Bigtable schema for the
                 *     best performance, see the documentation:
                 *
                 *     https://cloud.google.com/bigtable/docs/schema-design */

                Console.WriteLine($"Write some greetings to the table {tableId}");

                // Insert 1 row using MutateRow()
                s_greetingIndex = 0;
                try
                {
                    bigtableClient.MutateRow(tableName, rowKeyPrefix + s_greetingIndex, MutationBuilder());
                    Console.WriteLine($"\tGreeting:   -- {s_greetings[s_greetingIndex],-18}-- written successfully");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"\tFailed to write greeting: --{s_greetings[s_greetingIndex]}");
                    Console.WriteLine(ex.Message);
                    throw;
                }

                // Insert multiple rows using MutateRows()
                // Build a MutateRowsRequest (contains table name and a collection of entries).
                MutateRowsRequest request = new MutateRowsRequest
                {
                    TableNameAsTableName = tableName
                };

                s_mapToOriginalGreetingIndex = new List <int>();
                while (++s_greetingIndex < s_greetings.Length)
                {
                    s_mapToOriginalGreetingIndex.Add(s_greetingIndex);
                    // Build an entry for every greeting (consists of rowkey and a collection of mutations).
                    string rowKey = rowKeyPrefix + s_greetingIndex;
                    request.Entries.Add(Mutations.CreateEntry(rowKey, MutationBuilder()));
                }

                // Make the request to write multiple rows.
                MutateRowsResponse response = bigtableClient.MutateRows(request);

                // Check the status code of each entry to ensure that it was written successfully.
                foreach (MutateRowsResponse.Types.Entry entry in response.Entries)
                {
                    s_greetingIndex = s_mapToOriginalGreetingIndex[(int)entry.Index];
                    if (entry.Status.Code == 0)
                    {
                        Console.WriteLine($"\tGreeting:   -- {s_greetings[s_greetingIndex],-18}-- written successfully");
                    }
                    else
                    {
                        Console.WriteLine($"\tFailed to write greeting: --{s_greetings[s_greetingIndex]}");
                        Console.WriteLine(entry.Status.Message);
                    }
                }

                Mutation MutationBuilder() =>
                Mutations.SetCell(columnFamily, columnName, s_greetings[s_greetingIndex], new BigtableVersion(DateTime.UtcNow));

                //[END bigtable_hw_write_rows]

                // [START bigtable_hw_create_filter]
                RowFilter filter = RowFilters.CellsPerRowLimit(1);
                // [END bigtable_hw_create_filter]

                // [START bigtable_hw_get_with_filter]
                // Read from the table.
                Console.WriteLine("Read the first row");

                int rowIndex = 0;

                // Read a specific row. Apply a filter to return latest only cell value accross entire row.
                Row rowRead = bigtableClient.ReadRow(
                    tableName, rowKey: rowKeyPrefix + rowIndex, filter: filter);
                Console.WriteLine(
                    $"\tRow key: {rowRead.Key.ToStringUtf8()} " +
                    $"  -- Value: {rowRead.Families[0].Columns[0].Cells[0].Value.ToStringUtf8(),-16} " +
                    $"  -- Time Stamp: {rowRead.Families[0].Columns[0].Cells[0].TimestampMicros}");
                // [END bigtable_hw_get_with_filter]

                // [START bigtable_hw_scan_with_filter]
                Console.WriteLine("Read all rows using streaming");
                // stream the content of the whole table. Apply a filter to return latest only cell values accross all rows.
                ReadRowsStream responseRead = bigtableClient.ReadRows(tableName, filter: filter);

                Task printRead = PrintReadRowsAsync();
                printRead.Wait();

                async Task PrintReadRowsAsync()
                {
                    await responseRead.ForEachAsync(row =>
                    {
                        Console.WriteLine($"\tRow key: {row.Key.ToStringUtf8()} " +
                                          $"  -- Value: {row.Families[0].Columns[0].Cells[0].Value.ToStringUtf8(),-16} " +
                                          $"  -- Time Stamp: {row.Families[0].Columns[0].Cells[0].TimestampMicros}");
                    });
                }
                // [END bigtable_hw_scan_with_filter]

                // [START bigtable_hw_delete_table]
                // Clean up. Delete the table.
                Console.WriteLine($"Delete table: {tableId}");

                bigtableTableAdminClient.DeleteTable(name: tableName);
                if (!TableExist(bigtableTableAdminClient))
                {
                    Console.WriteLine($"Table: {tableId} deleted successfully");
                }
                // [END bigtable_hw_delete_table]
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception while running HelloWorld: {ex.Message}");
            }
        }
        public async Task MultipleRetries()
        {
            var request = new MutateRowsRequest
            {
                Entries =
                {
                    Mutations.CreateEntry("a", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("b", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("c", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("d", Mutations.DeleteFromRow()),
                    Mutations.CreateEntry("e", Mutations.DeleteFromRow())
                }
            };
            var client = MutateRowsStreamUtilities.CreateClientForMutateRowsRetries(
                entriesForInitialResponse: new[]
            {
                MutateRowsStreamUtilities.CreateEntry(0, Code.Ok),
                MutateRowsStreamUtilities.CreateEntry(1, Code.DeadlineExceeded),
                MutateRowsStreamUtilities.CreateEntry(2, Code.Ok),
                MutateRowsStreamUtilities.CreateEntry(3, Code.DeadlineExceeded),
                MutateRowsStreamUtilities.CreateEntry(4, Code.DeadlineExceeded)
            },
                entriesForRetryResponses: new[]
            {
                // 1st retry response entries
                new[]
                {
                    // Original entry 1
                    MutateRowsStreamUtilities.CreateEntry(0, Code.Ok),
                    // Original entry 3
                    MutateRowsStreamUtilities.CreateEntry(1, Code.DeadlineExceeded),
                    // Original entry 4
                    MutateRowsStreamUtilities.CreateEntry(2, Code.Ok)
                },
                // 2nd retry response entries
                new[]
                {
                    // Original entry 3
                    MutateRowsStreamUtilities.CreateEntry(0, Code.FailedPrecondition)
                }
            });

            var entries = (await client.MutateRowsAsync(request)).Entries.OrderBy(e => e.Index).ToList();

            Assert.Equal(5, entries.Count);

            var entry = entries[0];

            Assert.Equal(0, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[1];
            Assert.Equal(1, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[2];
            Assert.Equal(2, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);

            entry = entries[3];
            Assert.Equal(3, entry.Index);
            Assert.Equal((int)Code.FailedPrecondition, entry.Status.Code);

            entry = entries[4];
            Assert.Equal(4, entry.Index);
            Assert.Equal((int)Code.Ok, entry.Status.Code);
        }
 public override MutateRowsStream MutateRows(MutateRowsRequest request, CallSettings callSettings = null) =>
 _mockMutateRowsStreams.Count != 0 ? _mockMutateRowsStreams.Dequeue() : throw new RequestMadeException();
 public override Task <MutateRowsResponse> MutateRowsAsync(MutateRowsRequest request, CallSettings callSettings = null) =>
 ConvertResult(request, callSettings, GetUnderlyingClient().MutateRows(request, callSettings));
 public override MutateRowsResponse MutateRows(MutateRowsRequest request, CallSettings callSettings = null) =>
 Task.Run(() => MutateRowsAsync(request, callSettings)).ResultWithUnwrappedExceptions();
 public override MutateRowsStream MutateRows(MutateRowsRequest request, CallSettings callSettings = null) =>
 throw new RequestMadeException();