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

Known regression: Activity input fails to deserialize when the input is an array #581

Open
bachuv opened this issue Feb 9, 2024 · 1 comment

Comments

@bachuv
Copy link

bachuv commented Feb 9, 2024

Known regression notice: Activity input fails to deserialize when the input is an array

Error description:
We have just noticed that users are experiencing errors in Durable Functions JS apps with an exception that includes Exception binding parameter '<your activity parameter name>' and Unexpected character encountered while parsing value.

This issue started with Durable Functions version v2.13.0. The following extension bundles are affected:

  • v4 bundles: 4.13.1
  • v3 bundles: 3.30.1+

Repro:
Use an array type as an input to your activity function.

const { app } = require('@azure/functions');
const df = require('durable-functions');
 
const activityName = 'durableHello1';
 
df.app.orchestration('durableHello1Orchestrator', function* (context) {
    const outputs = [];
    outputs.push(yield context.df.callActivity(activityName, ["Tokyo", "Seattle", "Cairo"]));
 
    return outputs;
});
 
df.app.activity(activityName, {
    handler: (input) => {
        return `Hello, ${input}`;
    },
});
 
app.http('durableHello1HttpStart', {
    route: 'orchestrators/{orchestratorName}',
    extraInputs: [df.input.durableClient()],
    handler: async (request, context) => {
        const client = df.getClient(context);
        const body = await request.text();
        const instanceId = await client.startNew(request.params.orchestratorName, { input: body });
 
        context.log(`Started orchestration with ID = '${instanceId}'.`);
 
        return client.createCheckStatusResponse(request, instanceId);
    },
});

Incoming solution:
We're issuing a hotfix extension bundles release that will automatically fix any apps that are hitting the issue described here. It will take a few days to roll out.

Immediate Mitigation Options:
There are two ways to fix this issue: Pinning the extension bundles version or manually installing the working Durable Functions extension version.

  1. Pinning the extension bundles version - Update the extension bundles version in host.json to use v3.29.0 or v4.12.0.

Example:

  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 4.13.0)"
  },
  1. Manually install Durable Functions extension version v2.12.0 or lower by following these instructions.
@davidmrdavid davidmrdavid changed the title Known regression: Activity input fails to deserialize when the input is an array of strings Known regression: Activity input fails to deserialize when the input is an array Feb 9, 2024
@jerodvenemafm
Copy link

jerodvenemafm commented Feb 12, 2024

"version": "[4.*, 4.13.0)"

This doesn't look right for two reasons:

  1. Syntax error with a ) vs ]
  2. Doesn't match the versions listed in the ticket v3.29.0 or v4.12.0.

Is that actually right?

Edit: Found the definition here:

https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json#extensionbundle

Apparently that trailing ) is correct, and means "up to but not including".

Workaround. Updated my code to pre-serialize the data to a string.

await client.startNew(orchestratorName, { input: options });

became

await client.startNew(orchestratorName, { input: JSON.stringify(options) });

and

const runBot: ActivityHandler = async (input: MyType): Promise<MyType> => {

became

const runBot: ActivityHandler = async (inputJson: string): Promise<string> => {

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants