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)