summaryrefslogtreecommitdiff
path: root/logd/SerializedFlushToStateTest.cpp
AgeCommit message (Collapse)Author
2020-10-08Remove liblog, logcat, logd, logwrapperBaligh Uddin
These subdirectories have moved to platform/system/logging. BUG: 168791309 Test: Local build + TH Change-Id: Iaee2ff59d4450f3e59dc9ea8b0e257b2de53e478
2020-10-07logd: single std::mutex for locking log buffers and tracking readersTom Cherry
There are only three places where the log buffer lock is not already held when the reader lock is taken: 1) In LogReader, when a new reader connects 2) In LogReader, when a misbehaving reader disconnects 3) LogReaderThread::ThreadFunction() 1) and 2) happen sufficiently rarely that there's no impact if they additionally held a global lock. 3) is refactored in this CL. Previously, it would do the below in a loop 1) Lock the reader lock then wait on a condition variable 2) Unlock the reader lock 3) Lock the log buffer lock in LogBuffer::FlushTo() 4) In each iteration in the LogBuffer::FlushTo() loop 1) Lock then unlock the reader lock in FilterSecondPass() 2) Unlock the log buffer lock to send the message, then re-lock it 5) Unlock the log buffer lock when leaving LogBuffer::FlushTo() If these locks are collapsed into a single lock, then this simplifies to: 1) Lock the single lock then wait on a condition variable 2) In each iteration in the LogBuffer::FlushTo() loop 1) Unlock the single lock to send the message, then re-lock it Collapsing both these locks into a single lock simplifes the code and removes the overhead of acquiring the second lock, in the majority of use cases where the first lock is already held. Secondly, this lock will be a plain std::mutex instead of a RwLock. RwLock's are appropriate when there is a substantial imbalance between readers and writers and high contention, neither are true for logd. Bug: 169736426 Test: logging unit tests Change-Id: Ia511506f2d0935a5321c1b2f65569066f91ecb06
2020-09-18logd: remove min heap in SerializedFlushToStateTom Cherry
There was a bug in SerializedFlushToState::Prune() caused by an access to a SerializedLogEntry raw pointer as a member of a MinHeapElement, which was deleted earlier in the function. Instead of just fixing the order of the access and the deletion, I sought out to remove the raw pointer entirely. In doing so, I noticed that the min heap doesn't provide significant benefit, since we'll only ever have 8 log buffers so scalability is not an issue. Therefore this change removes the min heap entirely and uses the existing log_position_ and logs_needed_from_next_position_ members to keep track of which are the next unread logs. It also adds a smoke test for SerializedFlushToState::Prune() and additional CHECK() statements to help prevent future errors. Bug: 168869299 Test: unit tests Change-Id: Id4d5fdbaff2fe6dc49c38f01e73f900f84d3696b
2020-06-24logd: fix use after resize of contents_ vectorTom Cherry
SerializedFlushToState::PopNextUnreadLog() was calling AddMinHeapEntry() to replenish the element that was just popped off of the heap, however AddMinHeapEntry() also manages reference counts for the buffers, and this resulting in the following scenario: PopNextUnreadLog() returns a pointer referencing log buffer #1 AddMinHeapEntry() sees that all logs from buffer #1 has been read, so it decrements the reference count The caller of PopNextUnreadLog() uses the result which references invalid memory. This calls CheckForNewLogs() within HasUnreadLogs() instead of requiring a separate call, which fixes an additional issue where continuing from the loop in SerializedLogBuffer::FlushTo() may not pick up subsequent logs in a given log buffer, since CheckForNewLogs() wouldn't be called. This was exacerbated by the above change. This adds a test to check the reference counts for this case and fixes an argument mismatch in SerializedFlushToStateTest. This adds the corpus that surfaced the issue. Bug: 159753229 Bug: 159783005 Test: these unit tests, run fuzzer without error Change-Id: Ib2636dfc14293b7e2cd00876b9def6e9dbbff4ce
2020-06-12logd: add a SerializedLogBuffer suitable for compressionTom Cherry
Initial commit for a SerializedLogBuffer. The intention here is for the serialized data to be compressed (currently using zlib) to allow for substantially longer logs in the same memory footprint. Test: unit tests Change-Id: I2528e4e1ff1cf3bc91130173a107f371f04d911a