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

[fix][functions] Ensure InternalConfigurationData data model is compatible across different versions #17690

Merged
merged 3 commits into from
Sep 16, 2022

Conversation

nicoloboschi
Copy link
Contributor

@nicoloboschi nicoloboschi commented Sep 16, 2022

Motivation

After #14384, the broker and the client expects that the InternalConfigurationData contains metadataStoreUrl and configurationMetadataStoreUrl fields.
However the broker is no more compatible with old clients.

#14384 is landed to branch-2.11 and 2.10.2

Example scenario:

  • broker on 2.10.1
  • function worker on 2.10.1
  1. upgrade fn worker to 2.11.0 or 2.10.2
  2. the fn worker starts and download the internal config from the broker
  3. broker serves a json with old fields (zookeeperServers and configurationStoreServers)
  4. fn worker reads the json and convert it to a InternalConfigurationData instance. It expects to see the fields filled metadataStoreUrl and configurationMetadataStoreUrl but they aren't
  5. NPE on fn worker
2022-09-15T17:42:16,072+0000 [main] INFO  org.apache.pulsar.functions.worker.PulsarWorkerService - Initializing Pulsar Functions namespace...
2022-09-15T17:42:16,192+0000 [main] ERROR org.apache.pulsar.functions.worker.FunctionWorkerStarter - Encountered error in function worker.
java.lang.NullPointerException: null
    at org.apache.pulsar.metadata.impl.MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL(MetadataStoreFactoryImpl.java:73) 
    at org.apache.pulsar.functions.worker.WorkerUtils.initializeDlogNamespace(WorkerUtils.java:188) 
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initializeStandaloneWorkerService(PulsarWorkerService.java:281) 
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initAsStandalone(PulsarWorkerService.java:208)
    at org.apache.pulsar.functions.worker.Worker.start(Worker.java:54)
    at org.apache.pulsar.functions.worker.FunctionWorkerStarter.main(FunctionWorkerStarter.java:76)

Additionaly there's the same issue if we upgrade the broker before the fn worker:

  1. the broker gets the upgrade. won't serve zookeeperServers field
  2. fn worker restarts for some reasons.
  3. fn worker gets the internal config and look for zookeeperServers field which is empty in the json
  4. NPE

Modifications

  • Restore old fields in InternalConfigurationData and add fallback the old values in the new fields getters
  • Added unit test
  • doc-not-needed

Copy link
Contributor

@eolivelli eolivelli left a comment

Choose a reason for hiding this comment

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

Lgtm

@github-actions github-actions bot added the doc-not-needed Your PR changes do not impact docs label Sep 16, 2022
@codelipenghui codelipenghui added this to the 2.11.0 milestone Sep 16, 2022
Copy link
Member

@michaeljmarshall michaeljmarshall left a comment

Choose a reason for hiding this comment

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

LGTM. The PR description was very helpful, thanks!

@michaeljmarshall michaeljmarshall merged commit 1a34b87 into apache:master Sep 16, 2022
michaeljmarshall pushed a commit that referenced this pull request Sep 16, 2022
…tible across different versions (#17690)

* [fix][functions] Ensure InternalConfigurationData data model is compatible across different versions

* style

* fix the other way

After #14384, the broker and the client expects that the `InternalConfigurationData` contains `metadataStoreUrl` and `configurationMetadataStoreUrl` fields.
However the broker is no more compatible with old clients.

#14384 is landed to branch-2.11 and [2.10.2](#17291)

Example scenario:
- broker on 2.10.1
- function worker on 2.10.1

1. upgrade fn worker to 2.11.0 or 2.10.2
2. the fn worker starts and download the internal config from the broker
3. broker serves a json with old fields (`zookeeperServers` and `configurationStoreServers`)
4. fn worker reads the json and convert it to a `InternalConfigurationData` instance. It expects to see the fields filled `metadataStoreUrl` and `configurationMetadataStoreUrl` but they aren't
5. NPE on fn worker
```
2022-09-15T17:42:16,072+0000 [main] INFO  org.apache.pulsar.functions.worker.PulsarWorkerService - Initializing Pulsar Functions namespace...
2022-09-15T17:42:16,192+0000 [main] ERROR org.apache.pulsar.functions.worker.FunctionWorkerStarter - Encountered error in function worker.
java.lang.NullPointerException: null
    at org.apache.pulsar.metadata.impl.MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL(MetadataStoreFactoryImpl.java:73)
    at org.apache.pulsar.functions.worker.WorkerUtils.initializeDlogNamespace(WorkerUtils.java:188)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initializeStandaloneWorkerService(PulsarWorkerService.java:281)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initAsStandalone(PulsarWorkerService.java:208)
    at org.apache.pulsar.functions.worker.Worker.start(Worker.java:54)
    at org.apache.pulsar.functions.worker.FunctionWorkerStarter.main(FunctionWorkerStarter.java:76)
```

Additionaly there's the same issue if we upgrade the broker before the fn worker:
1. the broker gets the upgrade. won't serve `zookeeperServers` field
2. fn worker restarts for some reasons.
3. fn worker gets the internal config and look for  `zookeeperServers` field which is empty in the json
4. NPE

* Restore old fields in `InternalConfigurationData` and add fallback the old values in the new fields getters
* Added unit test

- [x] `doc-not-needed`

(cherry picked from commit 1a34b87)
michaeljmarshall pushed a commit that referenced this pull request Sep 16, 2022
…tible across different versions (#17690)

* [fix][functions] Ensure InternalConfigurationData data model is compatible across different versions

* style

* fix the other way

### Motivation

After #14384, the broker and the client expects that the `InternalConfigurationData` contains `metadataStoreUrl` and `configurationMetadataStoreUrl` fields.
However the broker is no more compatible with old clients.

#14384 is landed to branch-2.11 and [2.10.2](#17291)

Example scenario:
- broker on 2.10.1
- function worker on 2.10.1

1. upgrade fn worker to 2.11.0 or 2.10.2
2. the fn worker starts and download the internal config from the broker
3. broker serves a json with old fields (`zookeeperServers` and `configurationStoreServers`)
4. fn worker reads the json and convert it to a `InternalConfigurationData` instance. It expects to see the fields filled `metadataStoreUrl` and `configurationMetadataStoreUrl` but they aren't
5. NPE on fn worker
```
2022-09-15T17:42:16,072+0000 [main] INFO  org.apache.pulsar.functions.worker.PulsarWorkerService - Initializing Pulsar Functions namespace...
2022-09-15T17:42:16,192+0000 [main] ERROR org.apache.pulsar.functions.worker.FunctionWorkerStarter - Encountered error in function worker.
java.lang.NullPointerException: null
    at org.apache.pulsar.metadata.impl.MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL(MetadataStoreFactoryImpl.java:73)
    at org.apache.pulsar.functions.worker.WorkerUtils.initializeDlogNamespace(WorkerUtils.java:188)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initializeStandaloneWorkerService(PulsarWorkerService.java:281)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initAsStandalone(PulsarWorkerService.java:208)
    at org.apache.pulsar.functions.worker.Worker.start(Worker.java:54)
    at org.apache.pulsar.functions.worker.FunctionWorkerStarter.main(FunctionWorkerStarter.java:76)
```

Additionaly there's the same issue if we upgrade the broker before the fn worker:
1. the broker gets the upgrade. won't serve `zookeeperServers` field
2. fn worker restarts for some reasons.
3. fn worker gets the internal config and look for  `zookeeperServers` field which is empty in the json
4. NPE

### Modifications

* Restore old fields in `InternalConfigurationData` and add fallback the old values in the new fields getters
* Added unit test

- [x] `doc-not-needed`

(cherry picked from commit 1a34b87)
nicoloboschi added a commit to datastax/pulsar that referenced this pull request Sep 20, 2022
…tible across different versions (apache#17690)

* [fix][functions] Ensure InternalConfigurationData data model is compatible across different versions

* style

* fix the other way

After apache#14384, the broker and the client expects that the `InternalConfigurationData` contains `metadataStoreUrl` and `configurationMetadataStoreUrl` fields.
However the broker is no more compatible with old clients.

apache#14384 is landed to branch-2.11 and [2.10.2](apache#17291)

Example scenario:
- broker on 2.10.1
- function worker on 2.10.1

1. upgrade fn worker to 2.11.0 or 2.10.2
2. the fn worker starts and download the internal config from the broker
3. broker serves a json with old fields (`zookeeperServers` and `configurationStoreServers`)
4. fn worker reads the json and convert it to a `InternalConfigurationData` instance. It expects to see the fields filled `metadataStoreUrl` and `configurationMetadataStoreUrl` but they aren't
5. NPE on fn worker
```
2022-09-15T17:42:16,072+0000 [main] INFO  org.apache.pulsar.functions.worker.PulsarWorkerService - Initializing Pulsar Functions namespace...
2022-09-15T17:42:16,192+0000 [main] ERROR org.apache.pulsar.functions.worker.FunctionWorkerStarter - Encountered error in function worker.
java.lang.NullPointerException: null
    at org.apache.pulsar.metadata.impl.MetadataStoreFactoryImpl.removeIdentifierFromMetadataURL(MetadataStoreFactoryImpl.java:73)
    at org.apache.pulsar.functions.worker.WorkerUtils.initializeDlogNamespace(WorkerUtils.java:188)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initializeStandaloneWorkerService(PulsarWorkerService.java:281)
    at org.apache.pulsar.functions.worker.PulsarWorkerService.initAsStandalone(PulsarWorkerService.java:208)
    at org.apache.pulsar.functions.worker.Worker.start(Worker.java:54)
    at org.apache.pulsar.functions.worker.FunctionWorkerStarter.main(FunctionWorkerStarter.java:76)
```

Additionaly there's the same issue if we upgrade the broker before the fn worker:
1. the broker gets the upgrade. won't serve `zookeeperServers` field
2. fn worker restarts for some reasons.
3. fn worker gets the internal config and look for  `zookeeperServers` field which is empty in the json
4. NPE

* Restore old fields in `InternalConfigurationData` and add fallback the old values in the new fields getters
* Added unit test

- [x] `doc-not-needed`

(cherry picked from commit 1a34b87)
(cherry picked from commit 0993a34)
@Jason918
Copy link
Contributor

@nicoloboschi internalConfigurationRetroCompatibility fails on branch-2.10, Can you help fix this?
See : https://github.com/Jason918/pulsar/actions/runs/3088190598/jobs/4994380263#step:11:173

@nicoloboschi
Copy link
Contributor Author

nicoloboschi commented Sep 20, 2022

@Jason918 I pushed a fix for the test. The motivation is that this commit is not present in 2.10. But it's not a problem, I just updated the test.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/admin area/function cherry-picked/branch-2.10 cherry-picked/branch-2.11 doc-not-needed Your PR changes do not impact docs release/blocker Indicate the PR or issue that should block the release until it gets resolved release/2.10.2 release/2.11.0
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants