[
https://issues.apache.org/jira/browse/QPID-5767?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13998809#comment-13998809
]
Pavel Moravec commented on QPID-5767:
-------------------------------------
Relevant review request: https://reviews.apache.org/r/21486/
> [C++ broker][linearstore] broker segfaults when recovering journal file with
> damaged header
> -------------------------------------------------------------------------------------------
>
> Key: QPID-5767
> URL: https://issues.apache.org/jira/browse/QPID-5767
> Project: Qpid
> Issue Type: Bug
> Components: C++ Broker
> Affects Versions: 0.26
> Reporter: Pavel Moravec
> Assignee: Pavel Moravec
> Priority: Minor
> Labels: easyfix, patch
>
> Description of problem:
> If journal file has corrupted header (example below), especially if EFP
> identity is invalid, broker segfaults.
> The reason is:
> EmptyFilePool* EmptyFilePoolManager::getEmptyFilePool(const
> efpPartitionNumber_t partitionNumber,
> const efpDataSize_kib_t
> efpDataSize_kib) {
> EmptyFilePoolPartition* efppp = getEfpPartition(partitionNumber);
> if (efppp != 0)
> return efppp->getEmptyFilePool(efpDataSize_kib);
> return 0;
> }
> returns null pointer that is taken in:
> void RecoveryManager::analyzeJournals(const std::vector<std::string>*
> preparedTransactionListPtr,
> EmptyFilePoolManager*
> emptyFilePoolManager,
> EmptyFilePool** emptyFilePoolPtrPtr) {
> // Analyze file headers of existing journal files
> efpIdentity_t efpIdentity;
> analyzeJournalFileHeaders(efpIdentity);
> *emptyFilePoolPtrPtr =
> emptyFilePoolManager->getEmptyFilePool(efpIdentity);
> efpFileSize_kib_ = (*emptyFilePoolPtrPtr)->fileSize_kib();
> One real world example to get damaged journal (header): disk gets out of free
> space just when generating a new journal file, such that the file is created
> as truncated and contains just zeroes.
> Version-Release number of selected component (if applicable):
> qpid-cpp 0.22-38
> How reproducible:
> 100%
> Steps to Reproduce:
> 0. Start broker with empty provisioning
> 1. Create a durable queue:
> qpid-config add queue q --durable
> 2. Create an empty "damaged" journal file and set its permissions:
> dd if=/dev/zero of=/var/lib/qpidd/qls/jrnl/q/$(uuidgen).jrnl bs=1024
> count=2052
> chown qpidd:qpidd /var/lib/qpidd/qls/jrnl/q/*
> (To have the reproducer really reliable, remove the journal file that
> linearstore created. Just to have there only the "damaged" file with 0s.)
> 3. Restart broker
> Actual results:
> Broker segfaults, logging:
> 2014-05-15 12:42:00.421721427 [Store] warning Linear Store: Journal "q":
> Journal file
> /var/lib/qpidd/qls/jrnl/q/d09e7bfb-5efa-4d96-9071-ad1053377d36.jrnl is
> uninitialized
> 2014-05-15 12:42:00.616301329 [System] debug Exception constructed: Cannot
> read from child process.
> 2014-05-15 12:42:00.616558206 [Broker] critical Unexpected error: Cannot read
> from child process.
> Expected results:
> Broker raises critical exception (stopping its kick-off) with a message like
> "Journal file .. has unknown EFP identity (pn=0,ds=0), please fix it".
> Additional info:
--
This message was sent by Atlassian JIRA
(v6.2#6252)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]