Skip to content

Commit 8a2d6da

Browse files
authored
fix(bigtable): treat NOT_FOUND and PERMISSION_DENIED on channel refresh as success (#16086)
1 parent d2e9ba4 commit 8a2d6da

3 files changed

Lines changed: 28 additions & 5 deletions

File tree

google/cloud/bigtable/internal/bigtable_stub_factory.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,13 @@ std::shared_ptr<BigtableStub> CreateBigtableStubRandomTwoLeastUsed(
117117
self->set_last_refresh_status(s);
118118
}
119119
if (!s.ok()) {
120-
GCP_LOG(WARNING) << "Failed to refresh connection. Error: " << s;
120+
if (ChannelUsage<BigtableStub>::IsSuccessfulRefreshStatus(s)) {
121+
GCP_LOG(WARNING)
122+
<< "Connection refreshed; treating received Status as non-error: "
123+
<< s;
124+
} else {
125+
GCP_LOG(WARNING) << "Failed to refresh connection. Error: " << s;
126+
}
121127
}
122128
};
123129

google/cloud/bigtable/internal/channel_usage.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,16 @@ class ChannelUsage : public std::enable_shared_from_this<ChannelUsage<T>> {
4343
outstanding_rpcs_(initial_outstanding_rpcs),
4444
last_refresh_status_(std::move(last_refresh_status)) {}
4545

46+
static bool IsSuccessfulRefreshStatus(Status const& s) {
47+
// kPermissionDenied and kNotFound are considered acceptable as those may
48+
// result from a permissions configuration issue and not an actual failure.
49+
return s.ok() || s.code() == StatusCode::kPermissionDenied ||
50+
s.code() == StatusCode::kNotFound;
51+
}
52+
4653
StatusOr<int> instant_outstanding_rpcs() {
4754
std::scoped_lock lk(mu_);
48-
if (!last_refresh_status_.ok()) return last_refresh_status_;
55+
if (!IsRefreshSuccessful(lk)) return last_refresh_status_;
4956
return outstanding_rpcs_;
5057
}
5158

@@ -78,6 +85,10 @@ class ChannelUsage : public std::enable_shared_from_this<ChannelUsage<T>> {
7885
}
7986

8087
private:
88+
bool IsRefreshSuccessful(std::scoped_lock<std::mutex> const&) const {
89+
return IsSuccessfulRefreshStatus(last_refresh_status_);
90+
}
91+
8192
mutable std::mutex mu_;
8293
std::shared_ptr<T> stub_;
8394
int outstanding_rpcs_ = 0;

google/cloud/bigtable/internal/channel_usage_test.cc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,18 @@ TEST(ChannelUsageTest, InstantOutstandingRpcs) {
6363
TEST(ChannelUsageTest, SetLastRefreshStatus) {
6464
auto mock = std::make_shared<MockBigtableStub>();
6565
auto channel = std::make_shared<ChannelUsage<BigtableStub>>(mock);
66-
Status expected_status = internal::InternalError("uh oh");
66+
Status error_status = internal::InternalError("uh oh");
67+
Status not_found_status = internal::NotFoundError("not found");
68+
Status permission_denied_status = internal::PermissionDeniedError("denied");
6769
(void)channel->AcquireStub();
6870
EXPECT_THAT(channel->instant_outstanding_rpcs(), IsOkAndHolds(1));
69-
channel->set_last_refresh_status(expected_status);
71+
channel->set_last_refresh_status(not_found_status);
72+
EXPECT_THAT(channel->instant_outstanding_rpcs(), IsOkAndHolds(1));
73+
channel->set_last_refresh_status(permission_denied_status);
74+
EXPECT_THAT(channel->instant_outstanding_rpcs(), IsOkAndHolds(1));
75+
channel->set_last_refresh_status(error_status);
7076
EXPECT_THAT(channel->instant_outstanding_rpcs(),
71-
StatusIs(expected_status.code()));
77+
StatusIs(error_status.code()));
7278
}
7379

7480
TEST(ChannelUsageTest, MakeWeak) {

0 commit comments

Comments
 (0)