You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apex.apache.org by "Sanjay M Pujare (JIRA)" <ji...@apache.org> on 2016/08/18 05:21:20 UTC
[jira] [Commented] (APEXCORE-510) Enforce DefaultOutputPort.emit()
or Sink.put() thread affinity
[ https://issues.apache.org/jira/browse/APEXCORE-510?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15425917#comment-15425917 ]
Sanjay M Pujare commented on APEXCORE-510:
------------------------------------------
One way to do this as follows:
- In DefaultOutputPort we add a data field 'operatorThread' to save a Thread object.
- In DefaultOutputPort.emit() we verify that Thread.currentThread() == operatorThread else throw an exception. Either make emit() final or split emit into 2 functions - one final one (having the check) calling the other overridable method.
- In the engine in Node.setup(), add a call to operator.setupThreadObject() after operator.setup()
- Operator.setupThreadObject() uses Java reflection to find all data member objects in the current class of type DefaultOutputPort and sets the operatorThread object in each of those objects to Thread.currentThread()
> Enforce DefaultOutputPort.emit() or Sink.put() thread affinity
> --------------------------------------------------------------
>
> Key: APEXCORE-510
> URL: https://issues.apache.org/jira/browse/APEXCORE-510
> Project: Apache Apex Core
> Issue Type: Improvement
> Reporter: Vlad Rozov
>
> Apex platform assumes that an operator interacts with the platform using the dedicated operator thread. Currently, operators may create worker threads and emit tuples from a worker thread. This leads to undefined behavior and hard to find bugs, so it should be possible to enforce that DefaultOutputPort.emit() and/or Sink.put() are called on the operator thread.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)