Merge "logd: always compress SerializedLogChunk in FinishWriting()"
diff --git a/logd/SerializedFlushToState.cpp b/logd/SerializedFlushToState.cpp
index 2633348..b02ccc3 100644
--- a/logd/SerializedFlushToState.cpp
+++ b/logd/SerializedFlushToState.cpp
@@ -31,7 +31,7 @@
SerializedFlushToState::~SerializedFlushToState() {
log_id_for_each(i) {
if (log_positions_[i]) {
- log_positions_[i]->buffer_it->DecReaderRefCount(true);
+ log_positions_[i]->buffer_it->DecReaderRefCount();
}
}
}
@@ -78,7 +78,7 @@
logs_needed_from_next_position_[log_id] = true;
} else {
// Otherwise, if there is another buffer piece, move to that and do the same check.
- buffer_it->DecReaderRefCount(true);
+ buffer_it->DecReaderRefCount();
++buffer_it;
buffer_it->IncReaderRefCount();
log_positions_[log_id]->read_offset = 0;
@@ -134,7 +134,7 @@
}
// // Decrease the ref count since we're deleting our reference.
- buffer_it->DecReaderRefCount(false);
+ buffer_it->DecReaderRefCount();
// Delete in the reference.
log_positions_[log_id].reset();
diff --git a/logd/SerializedLogBuffer.cpp b/logd/SerializedLogBuffer.cpp
index a626d30..972a3f3 100644
--- a/logd/SerializedLogBuffer.cpp
+++ b/logd/SerializedLogBuffer.cpp
@@ -123,7 +123,7 @@
stats_->Subtract(entry->ToLogStatisticsElement(log_id));
read_offset += entry->total_len();
}
- chunk.DecReaderRefCount(false);
+ chunk.DecReaderRefCount();
}
void SerializedLogBuffer::NotifyReadersOfPrune(
diff --git a/logd/SerializedLogChunk.cpp b/logd/SerializedLogChunk.cpp
index e444856..de641d6 100644
--- a/logd/SerializedLogChunk.cpp
+++ b/logd/SerializedLogChunk.cpp
@@ -31,7 +31,6 @@
<< " size used: " << write_offset_
<< " compressed size: " << compressed_log_.size();
}
- contents_.Resize(0);
}
// TODO: Develop a better reference counting strategy to guard against the case where the writer is
@@ -44,13 +43,13 @@
CompressionEngine::GetInstance().Decompress(compressed_log_, contents_);
}
-void SerializedLogChunk::DecReaderRefCount(bool compress) {
+void SerializedLogChunk::DecReaderRefCount() {
CHECK_NE(reader_ref_count_, 0U);
if (--reader_ref_count_ != 0) {
return;
}
- if (compress && !writer_active_) {
- Compress();
+ if (!writer_active_) {
+ contents_.Resize(0);
}
}
@@ -83,18 +82,19 @@
}
if (new_write_offset == 0) {
- DecReaderRefCount(false);
+ DecReaderRefCount();
return true;
}
- // Clear the old compressed logs and set write_offset_ appropriately for DecReaderRefCount()
- // to compress the new partially cleared log.
+ // Clear the old compressed logs and set write_offset_ appropriately to compress the new
+ // partially cleared log.
if (new_write_offset != write_offset_) {
compressed_log_.Resize(0);
write_offset_ = new_write_offset;
+ Compress();
}
- DecReaderRefCount(true);
+ DecReaderRefCount();
return false;
}
diff --git a/logd/SerializedLogChunk.h b/logd/SerializedLogChunk.h
index 50bae63..0991eac 100644
--- a/logd/SerializedLogChunk.h
+++ b/logd/SerializedLogChunk.h
@@ -30,9 +30,7 @@
void Compress();
void IncReaderRefCount();
- // Decrease the reader ref count and compress the log if appropriate. `compress` should only be
- // set to false in the case that the log buffer will be deleted afterwards.
- void DecReaderRefCount(bool compress);
+ void DecReaderRefCount();
// Must have no readers referencing this. Return true if there are no logs left in this chunk.
bool ClearUidLogs(uid_t uid, log_id_t log_id, LogStatistics* stats);
@@ -50,8 +48,9 @@
void FinishWriting() {
writer_active_ = false;
+ Compress();
if (reader_ref_count_ == 0) {
- Compress();
+ contents_.Resize(0);
}
}
diff --git a/logd/SerializedLogChunkTest.cpp b/logd/SerializedLogChunkTest.cpp
index 2b478a3..f10b9c6 100644
--- a/logd/SerializedLogChunkTest.cpp
+++ b/logd/SerializedLogChunkTest.cpp
@@ -113,8 +113,7 @@
TEST(SerializedLogChunk, catch_DecCompressedRef_CHECK) {
size_t chunk_size = 10 * 4096;
auto chunk = SerializedLogChunk{chunk_size};
- EXPECT_DEATH({ chunk.DecReaderRefCount(true); }, "");
- EXPECT_DEATH({ chunk.DecReaderRefCount(false); }, "");
+ EXPECT_DEATH({ chunk.DecReaderRefCount(); }, "");
}
// Check that the CHECK() in ClearUidLogs() if the ref count is greater than 0 is caught.
@@ -123,7 +122,7 @@
auto chunk = SerializedLogChunk{chunk_size};
chunk.IncReaderRefCount();
EXPECT_DEATH({ chunk.ClearUidLogs(1000, LOG_ID_MAIN, nullptr); }, "");
- chunk.DecReaderRefCount(false);
+ chunk.DecReaderRefCount();
}
class UidClearTest : public testing::TestWithParam<bool> {
@@ -144,7 +143,7 @@
check(chunk_);
if (finish_writing) {
- chunk_.DecReaderRefCount(false);
+ chunk_.DecReaderRefCount();
}
}