Repository: nifi-minifi-cpp Updated Branches: refs/heads/master a8703b5c7 -> 3e23e20fe
MINIFICPP-362: Prevent segfault is there is no content for a flow file This closes #233. Signed-off-by: Marc Parisi <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/3e23e20f Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/3e23e20f Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/3e23e20f Branch: refs/heads/master Commit: 3e23e20feab09ffaa7c882327df5c17f0fe85efd Parents: a8703b5 Author: Marc Parisi <[email protected]> Authored: Mon Jan 8 19:05:11 2018 -0500 Committer: Marc Parisi <[email protected]> Committed: Wed Jan 10 08:56:22 2018 -0500 ---------------------------------------------------------------------- libminifi/src/core/ProcessSession.cpp | 8 +++-- libminifi/test/unit/ProcessorTests.cpp | 50 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/3e23e20f/libminifi/src/core/ProcessSession.cpp ---------------------------------------------------------------------- diff --git a/libminifi/src/core/ProcessSession.cpp b/libminifi/src/core/ProcessSession.cpp index 5bcadda..bdfddc5 100644 --- a/libminifi/src/core/ProcessSession.cpp +++ b/libminifi/src/core/ProcessSession.cpp @@ -164,8 +164,12 @@ std::shared_ptr<core::FlowFile> ProcessSession::clone(const std::shared_ptr<core void ProcessSession::remove(const std::shared_ptr<core::FlowFile> &flow) { flow->setDeleted(true); - flow->getResourceClaim()->decreaseFlowFileRecordOwnedCount(); - logger_->log_debug("Auto terminated %s %llu %s", flow->getResourceClaim()->getContentFullPath(), flow->getResourceClaim()->getFlowFileRecordOwnedCount(), flow->getUUIDStr()); + if (flow->getResourceClaim() != nullptr) { + flow->getResourceClaim()->decreaseFlowFileRecordOwnedCount(); + logger_->log_debug("Auto terminated %s %llu %s", flow->getResourceClaim()->getContentFullPath(), flow->getResourceClaim()->getFlowFileRecordOwnedCount(), flow->getUUIDStr()); + } else { + logger_->log_debug("Flow does not contain content. no resource claim to decrement."); + } process_context_->getFlowFileRepository()->Delete(flow->getUUIDStr()); _deletedFlowFiles[flow->getUUIDStr()] = flow; std::string reason = process_context_->getProcessorNode()->getName() + " drop flow record " + flow->getUUIDStr(); http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/3e23e20f/libminifi/test/unit/ProcessorTests.cpp ---------------------------------------------------------------------- diff --git a/libminifi/test/unit/ProcessorTests.cpp b/libminifi/test/unit/ProcessorTests.cpp index d041ec4..94618a1 100644 --- a/libminifi/test/unit/ProcessorTests.cpp +++ b/libminifi/test/unit/ProcessorTests.cpp @@ -247,6 +247,56 @@ TEST_CASE("Test Find file", "[getfileCreate3]") { testController.runSession(plan, false, verifyReporter); } +class TestProcessorNoContent : public minifi::core::Processor { + public: + explicit TestProcessorNoContent(std::string name, uuid_t uuid = NULL) + : Processor(name, uuid), + Success("success", "All files are routed to success") { + } + // Destructor + virtual ~TestProcessorNoContent() { + } + + core::Relationship Success; + + /** + * Function that's executed when the processor is scheduled. + * @param context process context. + * @param sessionFactory process session factory that is used when creating + * ProcessSession objects. + */ + void onSchedule(core::ProcessContext *context, core::ProcessSessionFactory *sessionFactory) { + } + /** + * Execution trigger for the GetFile Processor + * @param context processor context + * @param session processor session reference. + */ + virtual void onTrigger(core::ProcessContext *context, core::ProcessSession *session) { + auto ff = session->create(); + ff->addAttribute("Attribute", "AttributeValue"); + session->transfer(ff, Success); + } +}; + +REGISTER_RESOURCE(TestProcessorNoContent); + +TEST_CASE("TestEmptyContent", "[emptyContent]") { + TestController testController; + LogTestController::getInstance().setDebug<minifi::processors::LogAttribute>(); + LogTestController::getInstance().setDebug<minifi::core::ProcessSession>(); + LogTestController::getInstance().setDebug<TestPlan>(); + + std::shared_ptr<TestPlan> plan = testController.createPlan(); + std::shared_ptr<core::Processor> getfile = plan->addProcessor("TestProcessorNoContent", "TestProcessorNoContent"); + + plan->runNextProcessor(); + + // segfault + + LogTestController::getInstance().reset(); +} + int fileSize(const char *add) { std::ifstream mySource; mySource.open(add, std::ios_base::binary);
