Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f0c63c4 authored by yaochen's avatar yaochen Committed by android-build-merger
Browse files

Merge "Report last atom tag of the failed stats log."

am: b7080aab

Change-Id: I1dd7df47f782032ddf7ab1a0e325393b3a14a052
parents 930d0405 b7080aab
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -25,7 +25,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(int error);
void note_log_drop(int error, int atom_tag);
void stats_log_close();
int android_log_write_char_array(android_log_context ctx, const char* value, size_t len);
extern int (*write_to_statsd)(struct iovec* vec, size_t nr);
+2 −2
Original line number Diff line number Diff line
@@ -120,8 +120,8 @@ int write_to_logger(android_log_context ctx, log_id_t id) {
    return retValue;
}

void note_log_drop(int error) {
    statsdLoggerWrite.noteDrop(error);
void note_log_drop(int error, int tag) {
    statsdLoggerWrite.noteDrop(error, tag);
}

void stats_log_close() {
+19 −4
Original line number Diff line number Diff line
@@ -47,9 +47,18 @@
#endif
#endif

#ifndef htole64
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define htole64(x) (x)
#else
#define htole64(x) __bswap_64(x)
#endif
#endif

static pthread_mutex_t log_init_lock = PTHREAD_MUTEX_INITIALIZER;
static atomic_int dropped = 0;
static atomic_int log_error = 0;
static atomic_int atom_tag = 0;

void statsd_writer_init_lock() {
    /*
@@ -152,9 +161,10 @@ static int statsdAvailable() {
    return 1;
}

static void statsdNoteDrop(int error) {
static void statsdNoteDrop(int error, int tag) {
    atomic_fetch_add_explicit(&dropped, 1, memory_order_relaxed);
    atomic_exchange_explicit(&log_error, error, memory_order_relaxed);
    atomic_exchange_explicit(&atom_tag, tag, memory_order_relaxed);
}

static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) {
@@ -203,12 +213,17 @@ static int statsdWrite(struct timespec* ts, struct iovec* vec, size_t nr) {
    if (sock >= 0) {
        int32_t snapshot = atomic_exchange_explicit(&dropped, 0, memory_order_relaxed);
        if (snapshot) {
            android_log_event_int_t buffer;
            android_log_event_long_t buffer;
            header.id = LOG_ID_STATS;
            // store the last log error in the tag field. This tag field is not used by statsd.
            buffer.header.tag = htole32(atomic_load(&log_error));
            buffer.payload.type = EVENT_TYPE_INT;
            buffer.payload.data = htole32(snapshot);
            buffer.payload.type = EVENT_TYPE_LONG;
            // format:
            // |atom_tag|dropped_count|
            int64_t composed_long = atomic_load(&atom_tag);
            // Send 2 int32's via an int64.
            composed_long = ((composed_long << 32) | ((int64_t)snapshot));
            buffer.payload.data = htole64(composed_long);

            newVec[headerLength].iov_base = &buffer;
            newVec[headerLength].iov_len = sizeof(buffer);
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ struct android_log_transport_write {
    /* 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)(int error);
    void (*noteDrop)(int error, int tag);
};

#endif  // ANDROID_STATS_LOG_STATS_WRITER_H