summaryrefslogtreecommitdiffstats
path: root/libstats
diff options
context:
space:
mode:
authorYao Chen <yaochen@google.com>2018-08-20 16:15:33 -0700
committerYao Chen <yaochen@google.com>2018-10-03 10:42:34 -0700
commit6301054b38809901a1a1bae5d870875fce0c513d (patch)
tree3e29609989d9ab826d53cabdf69941dbbdadd35f /libstats
parent546b539b47992dbe9aab1d69be867ffd6eed2011 (diff)
downloadsystem_core-6301054b38809901a1a1bae5d870875fce0c513d.tar.gz
system_core-6301054b38809901a1a1bae5d870875fce0c513d.tar.bz2
system_core-6301054b38809901a1a1bae5d870875fce0c513d.zip
Add a function to allow statslog failure.
+ Record all types of failures which lead to log loss + Only record eventual failure after the retries to get a accurate log loss count. Bug: 80538532 Test: manually tested Change-Id: I23a55e62e140bf22ae5aa9e6c40539d51149cd66 Merged-In: I23a55e62e140bf22ae5aa9e6c40539d51149cd66 (cherry picked from commit ad3a40bf76b670878760738765154448772243fb)
Diffstat (limited to 'libstats')
-rw-r--r--libstats/include/stats_event_list.h1
-rw-r--r--libstats/stats_event_list.c4
-rw-r--r--libstats/statsd_writer.c22
-rw-r--r--libstats/statsd_writer.h2
4 files changed, 20 insertions, 9 deletions
diff --git a/libstats/include/stats_event_list.h b/libstats/include/stats_event_list.h
index 5d174ae03..28da27072 100644
--- a/libstats/include/stats_event_list.h
+++ b/libstats/include/stats_event_list.h
@@ -24,6 +24,7 @@ extern "C" {
#endif
void reset_log_context(android_log_context ctx);
int write_to_logger(android_log_context context, log_id_t id);
+void note_log_drop();
#ifdef __cplusplus
}
diff --git a/libstats/stats_event_list.c b/libstats/stats_event_list.c
index 3d746db18..51408e071 100644
--- a/libstats/stats_event_list.c
+++ b/libstats/stats_event_list.c
@@ -119,6 +119,10 @@ int write_to_logger(android_log_context ctx, log_id_t id) {
return retValue;
}
+void note_log_drop() {
+ statsdLoggerWrite.noteDrop();
+}
+
/* log_init_lock assumed */
static int __write_to_statsd_initialize_locked() {
if (!statsdLoggerWrite.open || ((*statsdLoggerWrite.open)() < 0)) {
diff --git a/libstats/statsd_writer.c b/libstats/statsd_writer.c
index 9953bba2e..afe401f5c 100644
--- a/libstats/statsd_writer.c
+++ b/libstats/statsd_writer.c
@@ -38,6 +38,7 @@
#define min(x, y) ((y) ^ (((x) ^ (y)) & -((x) < (y))))
static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
+static atomic_int dropped = 0;
void statsd_writer_init_lock() {
/*
@@ -59,14 +60,16 @@ static int statsdAvailable();
static int statsdOpen();
static void statsdClose();
static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr);
+static void statsdNoteDrop();
struct android_log_transport_write statsdLoggerWrite = {
- .name = "statsd",
- .sock = -EBADF,
- .available = statsdAvailable,
- .open = statsdOpen,
- .close = statsdClose,
- .write = statsdWrite,
+ .name = "statsd",
+ .sock = -EBADF,
+ .available = statsdAvailable,
+ .open = statsdOpen,
+ .close = statsdClose,
+ .write = statsdWrite,
+ .noteDrop = statsdNoteDrop,
};
/* log_init_lock assumed */
@@ -131,6 +134,10 @@ static int statsdAvailable() {
return 1;
}
+static void statsdNoteDrop() {
+ atomic_fetch_add_explicit(&dropped, 1, memory_order_relaxed);
+}
+
static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) {
ssize_t ret;
int sock;
@@ -138,7 +145,6 @@ static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) {
struct iovec newVec[nr + headerLength];
android_log_header_t header;
size_t i, payloadSize;
- static atomic_int dropped;
sock = atomic_load(&statsdLoggerWrite.sock);
if (sock < 0) switch (sock) {
@@ -252,8 +258,6 @@ static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) {
if (ret > (ssize_t)sizeof(header)) {
ret -= sizeof(header);
- } else if (ret == -EAGAIN) {
- atomic_fetch_add_explicit(&dropped, 1, memory_order_relaxed);
}
return ret;
diff --git a/libstats/statsd_writer.h b/libstats/statsd_writer.h
index 82e14e04f..728944153 100644
--- a/libstats/statsd_writer.h
+++ b/libstats/statsd_writer.h
@@ -38,6 +38,8 @@ struct android_log_transport_write {
void (*close)(); /* free up resources */
/* write log to transport, returns number of bytes propagated, or -errno */
int (*write)(struct timespec* ts, struct iovec* vec, size_t nr);
+ /* note one log drop */
+ void (*noteDrop)();
};
#endif // ANDROID_STATS_LOG_STATS_WRITER_H