Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 37 additions & 35 deletions src/iocore/cache/CacheProcessor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1115,41 +1115,43 @@ register_cache_stats(CacheStatsBlock *rsb, const std::string &prefix)
rsb->fragment_document_count[2] = ts::Metrics::Counter::createPtr(prefix + ".frags_per_doc.3+");

// And then everything else
rsb->bytes_used = ts::Metrics::Gauge::createPtr(prefix + ".bytes_used");
rsb->bytes_total = ts::Metrics::Gauge::createPtr(prefix + ".bytes_total");
rsb->stripes = ts::Metrics::Gauge::createPtr(prefix + ".stripes");
rsb->ram_cache_bytes_total = ts::Metrics::Gauge::createPtr(prefix + ".ram_cache.total_bytes");
rsb->ram_cache_bytes = ts::Metrics::Gauge::createPtr(prefix + ".ram_cache.bytes_used");
rsb->ram_cache_hits = ts::Metrics::Counter::createPtr(prefix + ".ram_cache.hits");
rsb->last_open_read_hits = ts::Metrics::Counter::createPtr(prefix + ".last_open_read.hits");
rsb->agg_buffer_hits = ts::Metrics::Counter::createPtr(prefix + ".aggregation_buffer.hits");
rsb->ram_cache_misses = ts::Metrics::Counter::createPtr(prefix + ".ram_cache.misses");
rsb->all_mem_misses = ts::Metrics::Counter::createPtr(prefix + ".all_memory_caches.misses");
rsb->pread_count = ts::Metrics::Counter::createPtr(prefix + ".pread_count");
rsb->percent_full = ts::Metrics::Gauge::createPtr(prefix + ".percent_full");
rsb->read_seek_fail = ts::Metrics::Counter::createPtr(prefix + ".read.seek.failure");
rsb->read_invalid = ts::Metrics::Counter::createPtr(prefix + ".read.invalid");
rsb->write_backlog_failure = ts::Metrics::Counter::createPtr(prefix + ".write.backlog.failure");
rsb->direntries_total = ts::Metrics::Gauge::createPtr(prefix + ".direntries.total");
rsb->direntries_used = ts::Metrics::Gauge::createPtr(prefix + ".direntries.used");
rsb->directory_collision = ts::Metrics::Counter::createPtr(prefix + ".directory_collision");
rsb->read_busy_success = ts::Metrics::Counter::createPtr(prefix + ".read_busy.success");
rsb->read_busy_failure = ts::Metrics::Counter::createPtr(prefix + ".read_busy.failure");
rsb->write_bytes = ts::Metrics::Counter::createPtr(prefix + ".write_bytes_stat");
rsb->hdr_vector_marshal = ts::Metrics::Counter::createPtr(prefix + ".vector_marshals");
rsb->hdr_marshal = ts::Metrics::Counter::createPtr(prefix + ".hdr_marshals");
rsb->hdr_marshal_bytes = ts::Metrics::Counter::createPtr(prefix + ".hdr_marshal_bytes");
rsb->gc_bytes_evacuated = ts::Metrics::Counter::createPtr(prefix + ".gc_bytes_evacuated");
rsb->gc_frags_evacuated = ts::Metrics::Counter::createPtr(prefix + ".gc_frags_evacuated");
rsb->directory_wrap = ts::Metrics::Counter::createPtr(prefix + ".wrap_count");
rsb->directory_sync_count = ts::Metrics::Counter::createPtr(prefix + ".sync.count");
rsb->directory_sync_bytes = ts::Metrics::Counter::createPtr(prefix + ".sync.bytes");
rsb->directory_sync_time = ts::Metrics::Counter::createPtr(prefix + ".sync.time");
rsb->span_errors_read = ts::Metrics::Counter::createPtr(prefix + ".span.errors.read");
rsb->span_errors_write = ts::Metrics::Counter::createPtr(prefix + ".span.errors.write");
rsb->span_failing = ts::Metrics::Gauge::createPtr(prefix + ".span.failing");
rsb->span_offline = ts::Metrics::Gauge::createPtr(prefix + ".span.offline");
rsb->span_online = ts::Metrics::Gauge::createPtr(prefix + ".span.online");
rsb->bytes_used = ts::Metrics::Gauge::createPtr(prefix + ".bytes_used");
rsb->bytes_total = ts::Metrics::Gauge::createPtr(prefix + ".bytes_total");
rsb->stripes = ts::Metrics::Gauge::createPtr(prefix + ".stripes");
rsb->ram_cache_bytes_total = ts::Metrics::Gauge::createPtr(prefix + ".ram_cache.total_bytes");
rsb->ram_cache_bytes = ts::Metrics::Gauge::createPtr(prefix + ".ram_cache.bytes_used");
rsb->ram_cache_hits = ts::Metrics::Counter::createPtr(prefix + ".ram_cache.hits");
rsb->last_open_read_hits = ts::Metrics::Counter::createPtr(prefix + ".last_open_read.hits");
rsb->agg_buffer_hits = ts::Metrics::Counter::createPtr(prefix + ".aggregation_buffer.hits");
rsb->ram_cache_misses = ts::Metrics::Counter::createPtr(prefix + ".ram_cache.misses");
rsb->all_mem_misses = ts::Metrics::Counter::createPtr(prefix + ".all_memory_caches.misses");
rsb->pread_count = ts::Metrics::Counter::createPtr(prefix + ".pread_count");
rsb->percent_full = ts::Metrics::Gauge::createPtr(prefix + ".percent_full");
rsb->read_seek_fail = ts::Metrics::Counter::createPtr(prefix + ".read.seek.failure");
rsb->read_invalid = ts::Metrics::Counter::createPtr(prefix + ".read.invalid");
rsb->write_backlog_failure = ts::Metrics::Counter::createPtr(prefix + ".write.backlog.failure");
rsb->direntries_total = ts::Metrics::Gauge::createPtr(prefix + ".direntries.total");
rsb->direntries_used = ts::Metrics::Gauge::createPtr(prefix + ".direntries.used");
rsb->directory_collision = ts::Metrics::Counter::createPtr(prefix + ".directory_collision");
rsb->read_busy_success = ts::Metrics::Counter::createPtr(prefix + ".read_busy.success");
rsb->read_busy_failure = ts::Metrics::Counter::createPtr(prefix + ".read_busy.failure");
rsb->write_bytes = ts::Metrics::Counter::createPtr(prefix + ".write_bytes_stat");
rsb->hdr_vector_marshal = ts::Metrics::Counter::createPtr(prefix + ".vector_marshals");
rsb->hdr_marshal = ts::Metrics::Counter::createPtr(prefix + ".hdr_marshals");
rsb->hdr_marshal_bytes = ts::Metrics::Counter::createPtr(prefix + ".hdr_marshal_bytes");
rsb->gc_bytes_evacuated = ts::Metrics::Counter::createPtr(prefix + ".gc_bytes_evacuated");
rsb->gc_frags_evacuated = ts::Metrics::Counter::createPtr(prefix + ".gc_frags_evacuated");
rsb->directory_wrap = ts::Metrics::Counter::createPtr(prefix + ".wrap_count");
rsb->directory_sync_count = ts::Metrics::Counter::createPtr(prefix + ".sync.count");
rsb->directory_sync_bytes = ts::Metrics::Counter::createPtr(prefix + ".sync.bytes");
rsb->directory_sync_time = ts::Metrics::Counter::createPtr(prefix + ".sync.time");
rsb->span_errors_read = ts::Metrics::Counter::createPtr(prefix + ".span.errors.read");
rsb->span_errors_write = ts::Metrics::Counter::createPtr(prefix + ".span.errors.write");
rsb->span_failing = ts::Metrics::Gauge::createPtr(prefix + ".span.failing");
rsb->span_offline = ts::Metrics::Gauge::createPtr(prefix + ".span.offline");
rsb->span_online = ts::Metrics::Gauge::createPtr(prefix + ".span.online");
rsb->stripe_lock_contention = ts::Metrics::Counter::createPtr(prefix + ".stripe.lock_contention");
rsb->writer_lock_contention = ts::Metrics::Counter::createPtr(prefix + ".writer.lock_contention");
}

void
Expand Down
2 changes: 1 addition & 1 deletion src/iocore/cache/CacheRead.cc
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ CacheVC::openReadFromWriter(int event, Event *e)
CACHE_TRY_LOCK(writer_lock, write_vc->mutex, mutex->thread_holding);
if (!writer_lock.is_locked()) {
DDbg(dbg_ctl_cache_read_agg, "%p: key: %X lock miss", this, first_key.slice32(1));
VC_SCHED_LOCK_RETRY();
VC_SCHED_WRITER_LOCK_RETRY();
}
MUTEX_RELEASE(lock);

Expand Down
20 changes: 20 additions & 0 deletions src/iocore/cache/P_CacheInternal.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,28 @@ struct EvacuationBlock;

#define VC_LOCK_RETRY_EVENT() \
do { \
ts::Metrics::Counter::increment(cache_rsb.stripe_lock_contention); \
if (stripe && stripe->cache_vol) { \
ts::Metrics::Counter::increment(stripe->cache_vol->vol_rsb.stripe_lock_contention); \
} \
trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay), event); \
return EVENT_CONT; \
} while (0)

#define VC_SCHED_LOCK_RETRY() \
do { \
ts::Metrics::Counter::increment(cache_rsb.stripe_lock_contention); \
if (stripe && stripe->cache_vol) { \
ts::Metrics::Counter::increment(stripe->cache_vol->vol_rsb.stripe_lock_contention); \
} \
trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay)); \
return EVENT_CONT; \
} while (0)

// Variant for writer lock contention (write_vc->mutex during read aggregation)
#define VC_SCHED_WRITER_LOCK_RETRY() \
do { \
ts::Metrics::Counter::increment(cache_rsb.writer_lock_contention); \
trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay)); \
return EVENT_CONT; \
} while (0)
Expand Down Expand Up @@ -330,6 +346,10 @@ CacheVC::handleWriteLock(int /* event ATS_UNUSED */, Event *e)
{
CACHE_TRY_LOCK(lock, stripe->mutex, mutex->thread_holding);
if (!lock.is_locked()) {
ts::Metrics::Counter::increment(cache_rsb.stripe_lock_contention);
if (stripe && stripe->cache_vol) {
ts::Metrics::Counter::increment(stripe->cache_vol->vol_rsb.stripe_lock_contention);
}
set_agg_write_in_progress();
trigger = mutex->thread_holding->schedule_in_local(this, HRTIME_MSECONDS(cache_config_mutex_retry_delay));
return EVENT_CONT;
Expand Down
72 changes: 37 additions & 35 deletions src/iocore/cache/P_CacheStats.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,39 +37,41 @@ struct CacheStatsBlock {

ts::Metrics::Counter::AtomicType *fragment_document_count[3] = {nullptr, nullptr, nullptr}; // For 1, 2 and 3+ fragments

ts::Metrics::Gauge::AtomicType *bytes_used = nullptr;
ts::Metrics::Gauge::AtomicType *bytes_total = nullptr;
ts::Metrics::Gauge::AtomicType *stripes = nullptr;
ts::Metrics::Gauge::AtomicType *ram_cache_bytes = nullptr;
ts::Metrics::Gauge::AtomicType *ram_cache_bytes_total = nullptr;
ts::Metrics::Gauge::AtomicType *direntries_total = nullptr;
ts::Metrics::Gauge::AtomicType *direntries_used = nullptr;
ts::Metrics::Counter::AtomicType *ram_cache_hits = nullptr;
ts::Metrics::Counter::AtomicType *last_open_read_hits = nullptr;
ts::Metrics::Counter::AtomicType *agg_buffer_hits = nullptr;
ts::Metrics::Counter::AtomicType *ram_cache_misses = nullptr;
ts::Metrics::Counter::AtomicType *all_mem_misses = nullptr;
ts::Metrics::Counter::AtomicType *pread_count = nullptr;
ts::Metrics::Gauge::AtomicType *percent_full = nullptr;
ts::Metrics::Counter::AtomicType *read_seek_fail = nullptr;
ts::Metrics::Counter::AtomicType *read_invalid = nullptr;
ts::Metrics::Counter::AtomicType *write_backlog_failure = nullptr;
ts::Metrics::Counter::AtomicType *directory_collision = nullptr;
ts::Metrics::Counter::AtomicType *read_busy_success = nullptr;
ts::Metrics::Counter::AtomicType *read_busy_failure = nullptr;
ts::Metrics::Counter::AtomicType *gc_bytes_evacuated = nullptr;
ts::Metrics::Counter::AtomicType *gc_frags_evacuated = nullptr;
ts::Metrics::Counter::AtomicType *write_bytes = nullptr;
ts::Metrics::Counter::AtomicType *hdr_vector_marshal = nullptr;
ts::Metrics::Counter::AtomicType *hdr_marshal = nullptr;
ts::Metrics::Counter::AtomicType *hdr_marshal_bytes = nullptr;
ts::Metrics::Counter::AtomicType *directory_wrap = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_count = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_time = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_bytes = nullptr;
ts::Metrics::Counter::AtomicType *span_errors_read = nullptr;
ts::Metrics::Counter::AtomicType *span_errors_write = nullptr;
ts::Metrics::Gauge::AtomicType *span_offline = nullptr;
ts::Metrics::Gauge::AtomicType *span_online = nullptr;
ts::Metrics::Gauge::AtomicType *span_failing = nullptr;
ts::Metrics::Gauge::AtomicType *bytes_used = nullptr;
ts::Metrics::Gauge::AtomicType *bytes_total = nullptr;
ts::Metrics::Gauge::AtomicType *stripes = nullptr;
ts::Metrics::Gauge::AtomicType *ram_cache_bytes = nullptr;
ts::Metrics::Gauge::AtomicType *ram_cache_bytes_total = nullptr;
ts::Metrics::Gauge::AtomicType *direntries_total = nullptr;
ts::Metrics::Gauge::AtomicType *direntries_used = nullptr;
ts::Metrics::Counter::AtomicType *ram_cache_hits = nullptr;
ts::Metrics::Counter::AtomicType *last_open_read_hits = nullptr;
ts::Metrics::Counter::AtomicType *agg_buffer_hits = nullptr;
ts::Metrics::Counter::AtomicType *ram_cache_misses = nullptr;
ts::Metrics::Counter::AtomicType *all_mem_misses = nullptr;
ts::Metrics::Counter::AtomicType *pread_count = nullptr;
ts::Metrics::Gauge::AtomicType *percent_full = nullptr;
ts::Metrics::Counter::AtomicType *read_seek_fail = nullptr;
ts::Metrics::Counter::AtomicType *read_invalid = nullptr;
ts::Metrics::Counter::AtomicType *write_backlog_failure = nullptr;
ts::Metrics::Counter::AtomicType *directory_collision = nullptr;
ts::Metrics::Counter::AtomicType *read_busy_success = nullptr;
ts::Metrics::Counter::AtomicType *read_busy_failure = nullptr;
ts::Metrics::Counter::AtomicType *gc_bytes_evacuated = nullptr;
ts::Metrics::Counter::AtomicType *gc_frags_evacuated = nullptr;
ts::Metrics::Counter::AtomicType *write_bytes = nullptr;
ts::Metrics::Counter::AtomicType *hdr_vector_marshal = nullptr;
ts::Metrics::Counter::AtomicType *hdr_marshal = nullptr;
ts::Metrics::Counter::AtomicType *hdr_marshal_bytes = nullptr;
ts::Metrics::Counter::AtomicType *directory_wrap = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_count = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_time = nullptr;
ts::Metrics::Counter::AtomicType *directory_sync_bytes = nullptr;
ts::Metrics::Counter::AtomicType *span_errors_read = nullptr;
ts::Metrics::Counter::AtomicType *span_errors_write = nullptr;
ts::Metrics::Gauge::AtomicType *span_offline = nullptr;
ts::Metrics::Gauge::AtomicType *span_online = nullptr;
ts::Metrics::Gauge::AtomicType *span_failing = nullptr;
ts::Metrics::Counter::AtomicType *stripe_lock_contention = nullptr;
ts::Metrics::Counter::AtomicType *writer_lock_contention = nullptr;
};