Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NIFI-2933 Remote input/output ports at any PG #3351

Closed
wants to merge 16 commits into from

Conversation

ijokarumawak
Copy link
Member

NOTE: NiFi Registry needs to be updated in order to support Flow versioning with the added 'Allow Remote Access' port configuration.


Thank you for submitting a contribution to Apache NiFi.

In order to streamline the review of the contribution we ask you
to ensure the following steps have been taken:

For all changes:

  • Is there a JIRA ticket associated with this PR? Is it referenced
    in the commit message?

  • Does your PR title start with NIFI-XXXX where XXXX is the JIRA number you are trying to resolve? Pay particular attention to the hyphen "-" character.

  • Has your PR been rebased against the latest commit within the target branch (typically master)?

  • Is your initial contribution a single, squashed commit?

For code changes:

  • Have you ensured that the full suite of tests is executed via mvn -Pcontrib-check clean install at the root nifi folder?
  • Have you written or updated unit tests to verify your changes?
  • If adding new dependencies to the code, are these dependencies licensed in a way that is compatible for inclusion under ASF 2.0?
  • If applicable, have you updated the LICENSE file, including the main LICENSE file under nifi-assembly?
  • If applicable, have you updated the NOTICE file, including the main NOTICE file found under nifi-assembly?
  • If adding new Properties, have you added .displayName in addition to .name (programmatic access) for each of the new properties?

For documentation related changes:

  • Have you ensured that format looks appropriate for the output in which it is rendered?

Note:

Please ensure that once the PR is submitted, you check travis-ci for build issues and submit an update to your PR as soon as possible.

@markap14
Copy link
Contributor

markap14 commented Mar 7, 2019

Thanks @ijokarumawak! Will review...

@markap14
Copy link
Contributor

markap14 commented Mar 8, 2019

@ijokarumawak I've been testing and reviewing this - great work! I tried to do some weird things to see if I could cause any errors, but you seem to have caught all of the corner cases that I could think of :)
I left a handful of comments in the PR, mostly just minor things that need to be addressed, or naming conventions that I felt could be made more clear. Nothing big.

I did notice a couple of things during testing that I wanted to call out though:

  • If I configure a Root Group Port, I have the checkbox for "Allow Remote Access." But if I uncheck it and hit Apply, I get an error. Since we don't allow the user to disable Remote Access, we should not allow them to change that in the UI.

  • If we're going to have the ability to drag a Port on and then configure to set "Allow Remote Access," I feel like the dialog that asks for a name should also include that checkbox so that it can be set when creating the Port.

  • I was a little surprised by the implementation, that a single Local Port can be configured to allow for Remote Access or not, but in either case it still functions as a Local Port. This feels a little odd to me, because a single component on the graph is serving two very different purposes. I feel like it should be either a Local Port or a Remote Port, not both. Thoughts on this?

  • While sending data to a port on a secure instance, I revoked my node's permissions to send data to the port. This worked as expected but produced a confusing error message:

2019-03-07 13:44:51,046 ERROR [Timer-Driven Process Thread-1] o.a.n.r.p.socket.SocketClientProtocol SocketClientProtocol[CommsID=43359ff0-85be-42d3-9487-ed2c675c75b2] received unexpected response User Not Authorized: org.apache.nifi.remote.StandardPublicPort@2c831d3f authorization failed for user CN=localhost, OU=NIFI because Unable to modify data transfers to Input Port with ID 5970d42e-0169-1000-ffff-ffffbe062e3b. from Peer[url=nifi://localhost:9001] when negotiating Codec

A quick search through the PR for the phrase "modify data transfers" did not yield any results, so it's possible that this error message has always been like this. If that's the case, then I don't want to hold up this PR for it, but we can probably create a JIRA to make that more clear.

@ijokarumawak
Copy link
Member Author

Thanks @markap14 for reviewing this!

The last commit resolves most review comments except the big one, separate private LocalPort and public LocalPort.

I've been feeling the same oddness with current implementation as Mark called out. Now I think the 'Allow Remote Access' property should be immutable once the LocalPort is created.

BTW, port type names are confusing. It may be useful if we document it somewhere.. Currently, terminologies are like these with this branch:

  • RemotePort: Resides in a RemoteProcessGroup, representing a port at the remote Site-to-Site target NiFi instance.
  • RootGroupPort: Resides in the root ProcessGroup of a local flow. Always accessible remotely.
  • LocalPort:
    • public LocalPort: Enabled 'Allow Remote Access'. Only accepts incoming connections via S2S.
    • private LocalPort: Only accepts incoming connections via local connections.

I will refactor this PR as follows, to make 'Allow Remote Access' immutable:

  • Show 'Allow Remote Access' as checkbox at the initial port creation dialog
  • After creation, show it as a label in the Port configuration dialog instead of checkbox
  • Hide 'Concurrent Tasks' for Local private port.
  • Revert some UI Javascripts those were needed to support dynamic port type change
  • Modify server side validations those were needed to support dynamic port type change

For authorization error message improvement, I created https://issues.apache.org/jira/browse/NIFI-6114

@markap14
Copy link
Contributor

markap14 commented Mar 12, 2019

@ijokarumawak sounds good. Though I think rather than a checkbox in the UI indicating whether or not we allow Remote Access... I would lean more toward a drop-down that allows user to choose the type of port: 'Local Port' vs 'Site to Site Port'.

I also agree that the port terminology is getting a big confusing. I wonder if we should rename RemotePort to RemoteGroupPort. And then we can probably get rid of RootGroupPort all together and instead just have LocalPort and SiteToSitePort (or whatever we want to call it). The RootGroupPort really was meant to differentiate between a local port and one that is capable of performance site-to-site functions. So I think it makes sense to instead just use that sort of terminology, no?

@ijokarumawak
Copy link
Member Author

image

Refactored UI.

@markap14 Yes, I agree with you. If we can remove RootGroupPort, then those component names will be much cleaner. I'm going to do further refactoring with that approach.

Copy link
Contributor

@mcgilman mcgilman left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR @ijokarumawak! I've left a few comments here. Another observation I have that wasn't part of this changeset but noticed when testing is the number of ports we list on the [R]PG on the canvas reflects the ports eligible for connections. This may no longer be the case if all ports are remote and the user is attempting a local connection. I believe this approach is the correct one but we likely need to clarify the UX around it.

@moranr Any thoughts?

@@ -23,5 +23,16 @@
<input id="new-port-name" type="text"/>
</div>
</div>
<div class="setting">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make this dialog larger so that there is no scrolling? The contents appear a little tight.

Also when opening on the root group, can we hide this setting since we only allow for one option?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made the dialog larger. So there's no scrolling border. Also hide the combo on the root group.

I also wanted to change the dialog size on the root group or on child groups, however, dialog elements height and min-highet are updated automatically (I assume JQuery does that). I gave up changing the dialog size. There are unnecessary space if the dialog is shown on the root group. I hope it's still acceptable.

@ijokarumawak
Copy link
Member Author

@mcgilman Thanks for reviewing. I hope the last commit addresses all your comments, except the one about the number of port on the canvas.

I'm not sure if I understand it correctly, but I found that a child PG shows total number of ports regardless of public/local, while it only shows total num of FlowFiles and received bytes for local connections.
I think the child PG on the parent PG should show the total num of FlowFiles and received bytes including both public and local connections as its In value.

Is this the same concern you mentioned above?

image

image

@mcgilman
Copy link
Contributor

@ijokarumawak My comment regarding the port count was focused on the number of available ports. Without drilling into the group, that figure currently represents the number of ports the user could connect to if they dragged a connection to/from it. Now that is not the case. With this PR, if there were 2 remote ports and 0 local ports that figure would report 2 even though there would be none available if the user dragged a connection to/from it. I'd like to get @moranr and @andrewmlim thoughts on this.

@ijokarumawak
Copy link
Member Author

Thanks for the clarification @mcgilman. Then I will wait for remarks from @moranr and @andrewmlim.

@andrewmlim
Copy link
Contributor

@moranr and I started our review on the UX impact of this. Still working through and will likely ask Matthew Clarke (reporter for https://issues.apache.org/jira/browse/NIFI-2933) for his input, especially around the FlowFile stats shown on the child process group.

In the meantime, wanted to note what looks to be a bug. When a child group has no local output ports, connecting the group to a component on the canvas shows the following pop-up

not_authorized
:

But my environment was not secure and has no authorizations.

@ijokarumawak
Copy link
Member Author

Thanks @andrewmlim for finding that wrong message! I fixed that.

@ekovacs
Copy link
Contributor

ekovacs commented Mar 28, 2019

Hi @ijokarumawak

i checked out the PR and played around with it. There are a few remarks / questions i have:

  1. any port dragged onto the root canvas is public by default. I only have the ability to select the type of the port if i am already in a PG.

  2. if i create a simple, 2 part flow like this:
    a.) "generate flowfile" => "Remote Process Group" and
    b.) "input port" => "logAttribute"

and then i want to group 'b.)' part of the flow into a PG, i'll get a:
"Cannot move Ports from the Root Group to a Non-Root Group".
i see that this limitation is not brought in by this PR, but existed previously in the master, along with some other checks:

throw new IllegalStateException("Cannot move Ports from the Root Group to a Non-Root Group");

do we want to keep these limitations?

  1. I create a PG, and in that PG i created a public port. Modified a.) part of the flow.: Disabled transmission. Deleted Connection. Created a new connection: "to input", selected the: "public port in child". Enabled transmission. FLowfiles started to flow to the PG's public port, this is good.
    While transitting, i created another connection: "to input" selected: "port-on-root-canvas". Flow files are being queued up for this connection. unless i stop transmission and start transmission for the Remote Process Group. see attached picture.
    Screen Shot 2019-03-28 at 12 20 40

  2. After 3., i deleted the connection with the queued flowfiles. RPG still shows "XYZ -> 2". yet it transmits only to one public port (one that is in the child PG)
    Screen Shot 2019-03-28 at 12 27 48

@moranr
Copy link
Contributor

moranr commented Mar 28, 2019

@andrewmlim and I reviewed and would like recommend the following changes.

For the Process Group canvas component
Include a count of remote process groups to the In/Out stat lines. Being able to distinguish local from remote at this level can be useful. It also helps provide a some clarity when trying to connect to a group and seeing the no local ports message. Here is an example showing the additional remote port count:
Screen Shot 2019-03-28 at 1 09 49 PM

For the Add (input) Port dialog
Screen Shot 2019-03-28 at 1 17 40 PM
Change dialog title to:

Add Input Port

Change "Receive Data From" label to:

Receive From

Change "Receive From" label tooltip to:

Specify where FlowFiles are received from

Change "Local connections" menu option tooltip to:

Receive FlowFiles from components in parent process groups

Change "Site-to-Site connections" menu option to:

Remote connections (site-to-site)

Change "Remote connections (site-to-site)" menu option tooltip to:

Receive FlowFiles from remote process group (site-to-site)

For the Add (output) Port dialog
Screen Shot 2019-03-28 at 1 27 26 PM
Change dialog title to:

Add Output Port

Change "Transfer Data To" label to:

Send To

Change "Send To" label tooltip to:

Specify where FlowFiles are sent

Change "Local connections" menu option tooltip to:

Send FlowFiles to components in parent process groups

Change "Site-to-Site connections" menu option to:

Remote connections (site-to-site)

Change "Remote connections (site-to-site)" menu option tooltip to:

Send FlowFiles to remote process group (site-to-site)

For the no name error dialog
blank_name

Change dialog title to:

Configuration Error

Change dialog message to:

The port name must be specified.

The error dialog should open on top of the Add Port dialog. Clicking OK should take the user back to the Add Port dialog. The current implementation of the Add Remote Process Group dialog work this way (screenshot below).
Screen Shot 2019-03-28 at 1 53 37 PM

For the duplicate name error dialog
Screen Shot 2019-03-28 at 2 00 10 PM

Change dialog title to:

Configuration Error

Change dialog message to:

The port name must be unique throughout the flow.

Dialog behavior should be the same as described in the previous example (no name error dialog).

@andrewmlim
Copy link
Contributor

@moranr and I did get some feedback from Matt Clarke. One issue he brought up is the following.

When creating a connection to a remote port within a child process group, within the Create Connection dialog, the port is labeled as being associated with the root process group not the child process. To illustrate:

On my root PG, I have:

-a child process group ("child_pg") that contains a remote input port ("remote_input_port")
-a RPG that points to the same NiFi instance
-a funnel

setup

If I connect the funnel to the RPG, I see the following:

create_connection

The input port is not within the group "NiFi Flow" (the root pg), so it should say "child_pg".

If there was a local input port in the child process group, if the funnel was connected to the child process group, the proper distinction is made that the local input port is within "child_pg".

local_example

@ijokarumawak
Copy link
Member Author

Hi @ekovacs Here are the answers for your questions:

  1. any port dragged onto the root canvas is public by default. I only have the ability to select the type of the port if i am already in a PG.

This is by design. Having local port in the root PG doesn't make sense because no connection can be made from/to such local port since there won't be a parent PG of the root PG.

  1. if i create a simple, 2 part flow like this:
    "Cannot move Ports from the Root Group to a Non-Root Group".
    do we want to keep these limitations?

Good catch, thanks. I will consider removing this limitation.

  1. I create a PG, and in that PG i created a public port. Modified a.) part of the flow.: Disabled

This is expected. Adding new connection to RemoteProcessGroup while it is transmitting, doesn't start transmission for the newly connected remote port. Each port connection has its own transmission status. You can see it by right clicking the RPG and select 'Manage remote ports' and start transmitting individually from there.

  1. After 3., i deleted the connection with the queued flowfiles. RPG still shows "XYZ -> 2". yet it transmits only to one public port (one that is in the child PG)

This is expected. The '2' representing the number of available ports. Not necessary mean actively transmitting. In your case there are two possible ports (in the root and in the child PG).

@ijokarumawak
Copy link
Member Author

Thanks @moranr and @andrewmlim for the UX related feedback. I've started incorporating them. Will let you guys know when I finished updating all.

One thing, port name/id duplication have been implemented as 409 (conflict) error at the server side, while empty port name error returned with 400 (bad request) status code.
Generally, NiFi UI dialogs close if it receives error other than 400.

There are few options, which one do you think the best??

  1. Change server's return code from 409 to 400 for port duplication. I can do this, but not confident enough, because 409 also does make sense in case if another port has been added by a different user..
  2. Keeps the port new/config dialog open with empty port name, but close it with duplicate error or any other errors than 400. This is the common behavior for UI.
  3. Keeps the port new/config dialog open regardless of the status code. This can be a weird UX sometimes. For example, when admin revokes the user's privilege before user completed the dialog, but the dialog should be closed because retrying won't success..

@andrewmlim
Copy link
Contributor

Thanks @ijokarumawak for providing more context around the 409/400 behavior in the application. Can you provide some other UI examples where a 409 error occurs and the dialog closes?

@ijokarumawak
Copy link
Member Author

@andrewmlim I checked other dialogs and found that:

  • Connection configuration dialog closes regardless of the result code. Even closes the dialog 400. Probably we should update this to provide consistent UX.
  • Processor / RPG dialog closes with only successful 200. All dialogs should follow this.

I was confused with the current implementation of the Port configuration dialog.
Currently (before this PR), Port config dialog source code has following comments and closes dialog when it receives non-successful response codes other than 400.

// handle bad request locally to keep the dialog open, allowing the user
// to make changes. if the request fails for another reason, the dialog
// should be closed so the issue can be addressed (stale flow for instance)

On the other hand, RemoteProcessGroup (or Processor for example) configuration dialog does NOT close with status code such as 400 (bad request), 403 (forbidden) or 409 (conflict). It closes the dialog with only 200 (success) response.

I think we should follow RemoteProcessGroup dialog style. Close the dialog only it receives 200. This PR already does so.

@ijokarumawak
Copy link
Member Author

@andrewmlim About the feedback from Matthew Clarke posted earlier.

All public ports are exposed to RPGs as a flat structure. ProcessGroup hierarchy is not shared to remote instances. The root process group name is the only known PG name at the S2S client side.

Maybe the component name RemoteProcessGroup is getting a bit confusing once we allow any PG to have public port.. I wish it could have been RemoteNiFi.
In order to share process group hierarchy, we need to alter S2S protocol. I don't think that's a good idea.

Instead, we can change label text in case connection source/target is a RemoteGroupPort.
image

I'd like to ask @mcgilman or @markap14 their opinion if possible.

@andrewmlim
Copy link
Contributor

@ijokarumawak Thanks for your latest comments. I filed two Jiras to make the UX consistent during Processor Configuration (https://issues.apache.org/jira/browse/NIFI-6160) and for Connection Configuration when required fields are missing (https://issues.apache.org/jira/browse/NIFI-6170).

I agree that we should hold off/discuss further the improvement Matt Clarke raised if a change to the S2S protocol is required to implement it. Thanks for providing that context. Changing the label text is an interesting workaround for now. Will wait for thoughts from @mcgilman and @markap14.

@markap14
Copy link
Contributor

markap14 commented Apr 9, 2019

Personally I am fine with the idea of changing "Within Group" to indicate "Remote NiFi instance." Would even consider adding the remote instance's URL ("Remote NiFi instance http://other-nifi.org.com:8080").

I am also in favor of keeping the dialog open on any failure condition.

@ijokarumawak
Copy link
Member Author

Thanks @markap14 for sharing your thoughts.

I've implemented experiment code to change the label text and show remote url.
@andrewmlim @moranr How do you think?

Connection to a Remote Input Port
image

Connection from a Remote Output Port
image

@moranr
Copy link
Contributor

moranr commented Apr 10, 2019

I like the addition of the URL.

However, for a connection to a remote input port, I would suggest keeping as it was before and simply add an indicator that it's "remote." So instead of Remote NiFi Instance in the screenshot above, something like:

Within Group (Remote)

This is consistent with the the other scenario and the labels still read like a narrative as they were designed (e.g., From/To..., Within..., etc.).

@ijokarumawak
Copy link
Member Author

@moranr Thanks, that makes sense, too. I've updated the code to make the labels narrative. How about this?

Connection to a Remote Input Port
image

Connection from a Remote Output Port
image

@andrewmlim
Copy link
Contributor

I vote for Within Remote Group first. Within Group (Remote) second.

@ijokarumawak
Copy link
Member Author

I vote for Within Remote Group. Updated the code.

image

image

@markap14
Copy link
Contributor

Hey @ijokarumawak it looks like this PR now has some conflicts. Can you rebase against master so that we can finish up the review?

@ijokarumawak
Copy link
Member Author

Thanks @markap14 for checking. Rebased with the latest master.

@markap14
Copy link
Contributor

Thanks for rebasing, @ijokarumawak. Things seemed to work OK on a standalone, insecure nifi. Then I tried starting up a 2-node secure cluster. When I attempted to create a Process Group, I got an NPE:

2019-04-29 15:30:27,425 ERROR [NiFi Web Server-25] o.a.nifi.web.api.config.ThrowableMapper An unexpected error has occurred: java.lang.RuntimeException: Failed to serialize entity for cluster replication. Returning Internal Server Error response.
java.lang.RuntimeException: Failed to serialize entity for cluster replication
	at org.apache.nifi.cluster.coordination.http.replication.okhttp.OkHttpReplicationClient.serializeEntity(OkHttpReplicationClient.java:259)
	at org.apache.nifi.cluster.coordination.http.replication.okhttp.OkHttpReplicationClient.createRequestBody(OkHttpReplicationClient.java:233)
	at org.apache.nifi.cluster.coordination.http.replication.okhttp.OkHttpReplicationClient.prepareRequest(OkHttpReplicationClient.java:98)
	at org.apache.nifi.cluster.coordination.http.replication.ThreadPoolRequestReplicator.performVerification(ThreadPoolRequestReplicator.java:619)
	at org.apache.nifi.cluster.coordination.http.replication.ThreadPoolRequestReplicator.replicate(ThreadPoolRequestReplicator.java:445)
	at org.apache.nifi.cluster.coordination.http.replication.ThreadPoolRequestReplicator.replicate(ThreadPoolRequestReplicator.java:301)
	at org.apache.nifi.cluster.coordination.http.replication.ThreadPoolRequestReplicator.replicate(ThreadPoolRequestReplicator.java:227)
	at org.apache.nifi.cluster.coordination.http.replication.ThreadPoolRequestReplicator.replicate(ThreadPoolRequestReplicator.java:164)
	at org.apache.nifi.web.api.ApplicationResource.replicateNodeResponse(ApplicationResource.java:1081)
	at org.apache.nifi.web.api.ApplicationResource.replicateNodeResponse(ApplicationResource.java:1053)
	at org.apache.nifi.web.api.ApplicationResource.replicate(ApplicationResource.java:1044)
	at org.apache.nifi.web.api.ApplicationResource.replicate(ApplicationResource.java:1028)
	at org.apache.nifi.web.api.ProcessGroupResource.createProcessGroup(ProcessGroupResource.java:1716)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200)
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
	at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
	at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1655)
	at org.apache.nifi.web.filter.RequestLogger.doFilter(RequestLogger.java:66)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.apache.nifi.web.security.NiFiAuthenticationFilter.doFilter(NiFiAuthenticationFilter.java:60)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.apache.nifi.web.security.NiFiAuthenticationFilter.doFilter(NiFiAuthenticationFilter.java:60)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.apache.nifi.web.security.NiFiAuthenticationFilter.doFilter(NiFiAuthenticationFilter.java:60)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.apache.nifi.web.security.NiFiAuthenticationFilter.authenticate(NiFiAuthenticationFilter.java:99)
	at org.apache.nifi.web.security.NiFiAuthenticationFilter.doFilter(NiFiAuthenticationFilter.java:58)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.apache.nifi.web.filter.TimerFilter.doFilter(TimerFilter.java:51)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.apache.nifi.web.filter.ExceptionFilter.doFilter(ExceptionFilter.java:46)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1634)
	at org.apache.nifi.web.security.headers.StrictTransportSecurityFilter.doFilter(StrictTransportSecurityFilter.java:48)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.apache.nifi.web.security.headers.XSSProtectionFilter.doFilter(XSSProtectionFilter.java:48)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.apache.nifi.web.security.headers.ContentSecurityPolicyFilter.doFilter(ContentSecurityPolicyFilter.java:47)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.apache.nifi.web.security.headers.XFrameOptionsFilter.doFilter(XFrameOptionsFilter.java:48)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1642)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1317)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1219)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:724)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
	at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:61)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:531)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:352)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:281)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:291)
	at org.eclipse.jetty.io.ssl.SslConnection$3.succeeded(SslConnection.java:151)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:762)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:680)
	at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.apache.nifi.web.api.entity.ProcessGroupEntity["component"]->org.apache.nifi.web.api.dto.ProcessGroupDTO["inputPortCount"])
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:394)
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:353)
	at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:727)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:727)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2655)
	at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:381)
	at org.apache.nifi.cluster.coordination.http.replication.okhttp.JsonEntitySerializer.serialize(JsonEntitySerializer.java:39)
	at org.apache.nifi.cluster.coordination.http.replication.okhttp.OkHttpReplicationClient.serializeEntity(OkHttpReplicationClient.java:253)
	... 115 common frames omitted
Caused by: java.lang.NullPointerException: null
	at org.apache.nifi.web.api.dto.ProcessGroupDTO.getInputPortCount(ProcessGroupDTO.java:112)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:688)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:719)
	... 125 common frames omitted

@ijokarumawak
Copy link
Member Author

Thanks for reviewing @markap14 and sorry for the delay. I was taking vacation. Fixed the NPE and DTO deserialization issue which happened after fixing NPE. Please try it again.

@markap14
Copy link
Contributor

@ijokarumawak thanks for the update. Tried testing again today. Now, the secure cluster is working as expected. Unfortunately, though, I'm now running into problems with a standalone, insecure node. I created a simple flow that will use GenerateFlowFile -> RPG (back to http://localhost:8080, using RAW site-to-site protocol). Then created a Process Group that has a 'Public Input Port' in it just sending to an UpdateAttribute. When I Enable Transmission on the RPG, the data doesn't go anywhere. Just stays there. If I attempt to disable transmission on the RPG, it just blocks and never stops.

@ijokarumawak
Copy link
Member Author

@markap14 Thanks for testing this again. I tried reproducing the stuck situation you encountered with a non-secure standalone NiFi, but to no avail. Public Input Ports in a child Process Group work fine. Tested:

  • Restart NiFi while GenerateFlowFile -> RPG keep sending data
  • Stop the port and start it again
  • Back-pressure, and recover from it
  • Delete and recreate the same port name

If that is reproducible with your NiFi, would you be able to capture stack-trace for further analysis? Thanks!

@asfgit asfgit closed this in 8a50cb1 May 22, 2019
@markap14
Copy link
Contributor

@ijokarumawak I cannot replicate the issue anymore. Which leads me to think that it was probably a user error (perhaps I had the specific port disabled in the RPG or something...??) But all is looking good at this point. Tried to do some testing of corner cases, stop port while transmitting, stop rpg while transmitting, force backpressure and timeouts, etc. Everything recovered as it should. Great work! Many thanks for this contribution - I know many people will be very happy about it! Have merged to master.

gideonkorir pushed a commit to gideonkorir/nifi that referenced this pull request May 23, 2019
Squashed commit of the following:

commit 66d4658f943c9b5be7a4303450f6ae1e90c40724
Merge: 58f96af fe68d43
Author: gkkorir <gkkorir@Safaricom.co.ke>
Date:   Thu May 23 10:18:15 2019 +0300

    Merge remote-tracking branch 'apache/master' into NIFI-6295

commit 58f96af
Author: gkkorir <gkkorir@Safaricom.co.ke>
Date:   Thu May 23 09:58:36 2019 +0300

    Fix NiFiRecordSerDe deserialization of record

    Squashed commit of the following:

    commit 3373085
    Merge: d04fd4c c470608
    Author: gkkorir <gkkorir@Safaricom.co.ke>
    Date:   Wed May 22 16:30:24 2019 +0300

        Merge remote-tracking branch 'apache/master' into NIFI-6295

    commit d04fd4c
    Author: gkkorir <gkkorir@Safaricom.co.ke>
    Date:   Wed May 22 16:30:00 2019 +0300

        fixed nested structs, arrays and maps in NiFiRecordSerde, added unit tests and fixed broken tests

    commit c470608
    Author: Koji Kawamura <ijokarumawak@apache.org>
    Date:   Wed May 22 16:07:17 2019 +0900

        NIFI-6035 Fix check-style issue

    commit 81ddd02
    Author: Aaron Leon <aaronleon@u.northwestern.edu>
    Date:   Thu Apr 4 23:23:33 2019 -0500

        NIFI-6100 Use setBytes in JdbcCommon for binary types

        This closes apache#3410

        Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

    commit 8245bc3
    Author: Mark Payne <markap14@hotmail.com>
    Date:   Tue May 21 11:03:21 2019 -0400

        NIFI-5922: Ensure that we import any default variable values on flow import

    commit 650c6aa
    Author: samhjelmfelt <samhjelmfelt@yahoo.com>
    Date:   Mon May 20 16:07:22 2019 -0700

        Small fix after rebase

    commit 60b8fca
    Author: Mark Payne <markap14@hotmail.com>
    Date:   Tue May 14 11:37:50 2019 -0400

        NIFI-5922: Bug fixes; initialize, setup, and enable controller services; code cleanup

    commit 146689b
    Author: samhjelmfelt <samhjelmfelt@yahoo.com>
    Date:   Mon Apr 8 15:16:52 2019 -0700

        NIFI-5922: Renaming from NiFi-Fn to NiFi-Stateless
        Fixed docker image and moved it into the nifi-docker project

        Fixed Docker container, YARN runtime, and OpenWhisk runtime

    commit cbafd8f
    Author: Mark Payne <markap14@hotmail.com>
    Date:   Fri Jan 11 09:38:49 2019 -0500

        NIFI-5922: Addressed checkstyle violations; added to README Updates to nifi-fn proposal:
        - Separated into nifi-fn-core, nifi-fn-bootstrap, nifi-fn-nar, nifi-fn-assembly; fully unpacks nars and runs flows
        - Rebased against master and updated to version 1.10.0-SNAPSHOT
        - Removed dependency on nifi-framework-core
        - Added LICENSE/NOTICE files

    commit 417b395
    Author: Sam Hjelmfelt <shjelmfelt@hortonworks.com>
    Date:   Wed Jan 2 16:42:36 2019 -0800

        NIFI-5922: First Commit for NiFi-Stateless

    commit 4d18eaa
    Author: archon <qq349074225@live.com>
    Date:   Mon May 20 21:59:03 2019 +0800

        NIFI-6035: 1.  Add formatWithTimeZone() and toDateWithTimeZone(); 2. Their test code and docs.

        This closes apache#3481

        Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

    commit 4b509aa
    Author: Otto Fowler <ottobackwards@gmail.com>
    Date:   Wed Mar 27 16:46:24 2019 -0400

        NIFI-3221 This closes apache#3396. Add a new property for setting the argument passing strategy, either the existing parameter, or by adding new dynamic parameters, along with implementation and tests
        This allows for passing arguments with quotes.

        Signed-off-by: Joe Witt <joewitt@apache.org>

    commit d1fd1f5
    Author: Michael Karpel <plexaikm@gmail.com>
    Date:   Sun May 12 11:31:02 2019 +0300

        Support for flowfile attribute in TABLE_NAME

        This closes apache#3472

        Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

    commit f08c2ee
    Author: Mark Payne <markap14@hotmail.com>
    Date:   Mon May 13 11:28:21 2019 -0400

        NIFI-6285: Addressed issue that resulted in swapped data not being swapped back in if load balancing strategy changed while data was swapped out; added integration tests for swapping. In testing, also encountered an issue with data being swapped out while swap files were being recovered causing the queue size to be wrong and causing errors about not being able to swap data in, because it attempted to swap the data in twice.

        This closes apache#3473.

        Signed-off-by: Bryan Bende <bbende@apache.org>

    commit 595835f
    Author: Alan Jackoway <alanj@cloudera.com>
    Date:   Thu May 9 09:57:47 2019 -0400

        NIFI-6281 Rename ISO8061_INSTANT_VALIDATOR to ISO8601_INSTANT_VALIDATOR

        ISO8061_INSTANT_VALIDATOR was misnamed - the correct standard is ISO 8601.
        Also updated the error messages to have spaces in them, which is how the ISO site
        displays them.

        This closes apache#3465

        Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

    commit 7825e40
    Author: Bryan Bende <bbende@apache.org>
    Date:   Mon May 6 09:59:36 2019 -0400

        NIFI-6262 - Upgrade to nifi-nar-maven-plugin 1.3.1

        This closes apache#3463.

    commit 3a6e28e
    Author: Endre Zoltan Kovacs <ekovacs@hortonworks.com>
    Date:   Fri May 10 16:02:48 2019 +0200

        NIFI-6289: using charset for byte encoding in ExecuteSparkInteractive

        This closes apache#3468

        Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

    commit 12e2102
    Author: Troy Melhase <troy@troy.io>
    Date:   Thu May 9 18:04:05 2019 -0800

        NIFI-4247 Support ranges in `tls-toolkit` SAN cli option.

        This closes apache#3466.

        Signed-off-by: Andy LoPresto <alopresto@apache.org>

    commit 95fd148
    Author: Scott Aslan <scottyaslan@gmail.com>
    Date:   Fri May 10 18:30:34 2019 -0400

        [NIFI-6292] update variables slickgrid table row ids

        This closes apache#3469

commit fe68d43
Author: thenatog <thenatog@gmail.com>
Date:   Thu May 16 13:19:47 2019 -0400

    NIFI-6280 - Broke out the matching for /access/knox/** and /access/oidc/** to allow the Jetty security filters to be applied in the /access/oidc/logout and /access/knox/logout cases.
    NIFI-6280 - Updated terminology in JwtAuthenticationFilter to authentication instead of authorization. Added stricter token parsing using an explicit regex pattern. Added tests.
    NIFI-6280 - Updated terminology from Authorization to Authentication.
    NIFI-6280 - Updated the access logout method to use getNiFiUserIdentity(). Updated javascript logout method to handle errors.
    NIFI-6280 - Fixing checkstyle issues.
    NIFI-6280 - Added some javadoc comments and logging. Renamed some variables for clarity. Fixed handling of exception when JWT does not match expected format.
    NIFI-6280 - Cleaned up checkstyle, increased log severity level for logout action, and cleaned up Groovy syntax in test.

    This closes apache#3482.

    Signed-off-by: Andy LoPresto <alopresto@apache.org>

commit 8a50cb1
Author: Koji Kawamura <ijokarumawak@apache.org>
Date:   Wed Oct 31 11:56:27 2018 +0900

    NIFI-2933 Remote input/output ports at any PG
    Specify remote access at port creation.
    Incorporated comments, and finished refactoring.
    Renamed RootGroupPort to PublicPort.
    Fix error message for creating a connection from a child PG having only PublicPorts.
    Enhanced ProcessGroup instances rendered in the parent ProcessGroup
    Loosen Port move check, allow moving public port between PG.
    Show 'Remote NiFi Instance' info on Connection dialogs
    Make labels narrative.
    'Within Remote Group'.
    Fixed DTO (de)serialization.
    Return null only if all values are null.

    This closes apache#3351.

    Signed-off-by: Mark Payne <markap14@hotmail.com>

commit a97766d
Author: Matt Gilman <matt.c.gilman@gmail.com>
Date:   Thu May 16 10:02:01 2019 -0400

    NIFI-6302:
    - Ensuring Process Group contents are pruned when appropriate.

    This closes apache#3477.

    Signed-off-by: Mark Payne <markap14@hotmail.com>

commit c470608
Author: Koji Kawamura <ijokarumawak@apache.org>
Date:   Wed May 22 16:07:17 2019 +0900

    NIFI-6035 Fix check-style issue

commit 81ddd02
Author: Aaron Leon <aaronleon@u.northwestern.edu>
Date:   Thu Apr 4 23:23:33 2019 -0500

    NIFI-6100 Use setBytes in JdbcCommon for binary types

    This closes apache#3410

    Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

commit 8245bc3
Author: Mark Payne <markap14@hotmail.com>
Date:   Tue May 21 11:03:21 2019 -0400

    NIFI-5922: Ensure that we import any default variable values on flow import

commit 650c6aa
Author: samhjelmfelt <samhjelmfelt@yahoo.com>
Date:   Mon May 20 16:07:22 2019 -0700

    Small fix after rebase

commit 60b8fca
Author: Mark Payne <markap14@hotmail.com>
Date:   Tue May 14 11:37:50 2019 -0400

    NIFI-5922: Bug fixes; initialize, setup, and enable controller services; code cleanup

commit 146689b
Author: samhjelmfelt <samhjelmfelt@yahoo.com>
Date:   Mon Apr 8 15:16:52 2019 -0700

    NIFI-5922: Renaming from NiFi-Fn to NiFi-Stateless
    Fixed docker image and moved it into the nifi-docker project

    Fixed Docker container, YARN runtime, and OpenWhisk runtime

commit cbafd8f
Author: Mark Payne <markap14@hotmail.com>
Date:   Fri Jan 11 09:38:49 2019 -0500

    NIFI-5922: Addressed checkstyle violations; added to README Updates to nifi-fn proposal:
    - Separated into nifi-fn-core, nifi-fn-bootstrap, nifi-fn-nar, nifi-fn-assembly; fully unpacks nars and runs flows
    - Rebased against master and updated to version 1.10.0-SNAPSHOT
    - Removed dependency on nifi-framework-core
    - Added LICENSE/NOTICE files

commit 417b395
Author: Sam Hjelmfelt <shjelmfelt@hortonworks.com>
Date:   Wed Jan 2 16:42:36 2019 -0800

    NIFI-5922: First Commit for NiFi-Stateless

commit 4d18eaa
Author: archon <qq349074225@live.com>
Date:   Mon May 20 21:59:03 2019 +0800

    NIFI-6035: 1.  Add formatWithTimeZone() and toDateWithTimeZone(); 2. Their test code and docs.

    This closes apache#3481

    Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

commit 4b509aa
Author: Otto Fowler <ottobackwards@gmail.com>
Date:   Wed Mar 27 16:46:24 2019 -0400

    NIFI-3221 This closes apache#3396. Add a new property for setting the argument passing strategy, either the existing parameter, or by adding new dynamic parameters, along with implementation and tests
    This allows for passing arguments with quotes.

    Signed-off-by: Joe Witt <joewitt@apache.org>

commit d1fd1f5
Author: Michael Karpel <plexaikm@gmail.com>
Date:   Sun May 12 11:31:02 2019 +0300

    Support for flowfile attribute in TABLE_NAME

    This closes apache#3472

    Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

commit f08c2ee
Author: Mark Payne <markap14@hotmail.com>
Date:   Mon May 13 11:28:21 2019 -0400

    NIFI-6285: Addressed issue that resulted in swapped data not being swapped back in if load balancing strategy changed while data was swapped out; added integration tests for swapping. In testing, also encountered an issue with data being swapped out while swap files were being recovered causing the queue size to be wrong and causing errors about not being able to swap data in, because it attempted to swap the data in twice.

    This closes apache#3473.

    Signed-off-by: Bryan Bende <bbende@apache.org>

commit 595835f
Author: Alan Jackoway <alanj@cloudera.com>
Date:   Thu May 9 09:57:47 2019 -0400

    NIFI-6281 Rename ISO8061_INSTANT_VALIDATOR to ISO8601_INSTANT_VALIDATOR

    ISO8061_INSTANT_VALIDATOR was misnamed - the correct standard is ISO 8601.
    Also updated the error messages to have spaces in them, which is how the ISO site
    displays them.

    This closes apache#3465

    Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

commit 7825e40
Author: Bryan Bende <bbende@apache.org>
Date:   Mon May 6 09:59:36 2019 -0400

    NIFI-6262 - Upgrade to nifi-nar-maven-plugin 1.3.1

    This closes apache#3463.

commit 3a6e28e
Author: Endre Zoltan Kovacs <ekovacs@hortonworks.com>
Date:   Fri May 10 16:02:48 2019 +0200

    NIFI-6289: using charset for byte encoding in ExecuteSparkInteractive

    This closes apache#3468

    Signed-off-by: Mike Thomsen <mikerthomsen@gmail.com>

commit 12e2102
Author: Troy Melhase <troy@troy.io>
Date:   Thu May 9 18:04:05 2019 -0800

    NIFI-4247 Support ranges in `tls-toolkit` SAN cli option.

    This closes apache#3466.

    Signed-off-by: Andy LoPresto <alopresto@apache.org>

commit 95fd148
Author: Scott Aslan <scottyaslan@gmail.com>
Date:   Fri May 10 18:30:34 2019 -0400

    [NIFI-6292] update variables slickgrid table row ids

    This closes apache#3469
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants