You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ph...@apache.org on 2018/01/10 14:00:16 UTC
nifi-minifi-cpp git commit: MINIFICPP-362: Prevent segfault is there
is no content for a flow file
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 <ph...@apache.org>
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 <ph...@apache.org>
Authored: Mon Jan 8 19:05:11 2018 -0500
Committer: Marc Parisi <ph...@apache.org>
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);