Merge pull request #18918 from arjunroy/md_interned_leak_fix

Fix regression where we do not properly account for freed interned metadata.
pull/18927/head
Arjun Roy 6 years ago committed by GitHub
commit 046e28f77c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      src/core/lib/transport/metadata.cc

@ -211,7 +211,6 @@ void grpc_mdctx_global_shutdown() {
mdtab_shard* shard = &g_shards[i]; mdtab_shard* shard = &g_shards[i];
gpr_mu_destroy(&shard->mu); gpr_mu_destroy(&shard->mu);
gc_mdtab(shard); gc_mdtab(shard);
/* TODO(ctiller): GPR_ASSERT(shard->count == 0); */
if (shard->count != 0) { if (shard->count != 0) {
gpr_log(GPR_DEBUG, "WARNING: %" PRIuPTR " metadata elements were leaked", gpr_log(GPR_DEBUG, "WARNING: %" PRIuPTR " metadata elements were leaked",
shard->count); shard->count);
@ -219,6 +218,7 @@ void grpc_mdctx_global_shutdown() {
abort(); abort();
} }
} }
GPR_DEBUG_ASSERT(shard->count == 0);
gpr_free(shard->elems); gpr_free(shard->elems);
} }
} }
@ -251,7 +251,9 @@ static void gc_mdtab(mdtab_shard* shard) {
GPR_TIMER_SCOPE("gc_mdtab", 0); GPR_TIMER_SCOPE("gc_mdtab", 0);
size_t num_freed = 0; size_t num_freed = 0;
for (size_t i = 0; i < shard->capacity; ++i) { for (size_t i = 0; i < shard->capacity; ++i) {
num_freed += InternedMetadata::CleanupLinkedMetadata(&shard->elems[i]); intptr_t freed = InternedMetadata::CleanupLinkedMetadata(&shard->elems[i]);
num_freed += freed;
shard->count -= freed;
} }
gpr_atm_no_barrier_fetch_add(&shard->free_estimate, gpr_atm_no_barrier_fetch_add(&shard->free_estimate,
-static_cast<intptr_t>(num_freed)); -static_cast<intptr_t>(num_freed));

Loading…
Cancel
Save