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);