MutableSideEffect () вызывает панику при установке второго значения

Мы находимся в процессе написания клиента .NET Cadence и немного не понимаем, как должен работать MutableSideEffect (). Мы думали о том, что ID передается, по сути, как имя переменной, и что разработчики должны иметь возможность обновлять изменяемые значения в рабочем процессе. Однако когда мы пытаемся это сделать, второй вызов MutableSideEffect () завершается сбоем с такой паникой:

panic: adding duplicate decision DecisionType: Marker, ID: MutableSideEffect_value-1, state=Created, isDone()=false, history=[Created]

Мы изменили пример рабочего процесса приветствия, чтобы выполнять следующие вызовы:

package main

import (
    "fmt"
    "math/rand"
    "time"

    "go.uber.org/cadence/activity"
    "go.uber.org/cadence/workflow"
    "go.uber.org/zap"
)

/**
 * This greetings sample workflow executes 3 activities in sequential. It gets greeting and name from 2 different activities,
 * and then pass greeting and name as input to a 3rd activity to generate final greetings.
 */

// ApplicationName is the task list for this sample
const ApplicationName = "greetingsGroup"

// This is registration process where you register all your workflows
// and activity function handlers.
func init() {
    workflow.Register(SampleGreetingsWorkflow)
    activity.Register(getGreetingActivity)
    activity.Register(getNameActivity)
    activity.Register(sayGreetingActivity)
}

// SampleGreetingsWorkflow Workflow Decider.
func SampleGreetingsWorkflow(ctx workflow.Context) error {
    // Get Greeting.
    ao := workflow.ActivityOptions{
        ScheduleToStartTimeout: time.Minute,
        StartToCloseTimeout:    time.Minute,
        HeartbeatTimeout:       time.Second * 20,
    }
    ctx = workflow.WithActivityOptions(ctx, ao)

    logger := workflow.GetLogger(ctx)
    var greetResult string
    err := workflow.ExecuteActivity(ctx, getGreetingActivity).Get(ctx, &greetResult)
    if err != nil {
        logger.Error("Get greeting failed.", zap.Error(err))
        return err
    }

    f := func(ctx workflow.Context) interface{} {
        return rand.Intn(100)
    }

    e := func(a, b interface{}) bool {
        if a == b {
            return true
        }

        return false
    }

    var result int
    sideEffectValue := workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-1", zap.Int("Value", result))

    //************** THIS CALL FAILS ************** 

    sideEffectValue = workflow.MutableSideEffect(ctx, "value-1", f, e)
    err = sideEffectValue.Get(&result)
    if err != nil {
        panic(err)
    }

    logger.Debug("MutableSideEffect-2", zap.Int("Value", result))

    // Get Name.
    var nameResult string
    err = workflow.ExecuteActivity(ctx, getNameActivity).Get(ctx, &nameResult)
    if err != nil {
        logger.Error("Get name failed.", zap.Error(err))
        return err
    }

    // Say Greeting.
    var sayResult string
    err = workflow.ExecuteActivity(ctx, sayGreetingActivity, greetResult, nameResult).Get(ctx, &sayResult)
    if err != nil {
        logger.Error("Marshalling failed with error.", zap.Error(err))
        return err
    }

    logger.Info("Workflow completed.", zap.String("Result", sayResult))
    return nil
}

// Get Name Activity.
func getNameActivity() (string, error) {
    return "Cadence", nil
}

// Get Greeting Activity.
func getGreetingActivity() (string, error) {
    return "Hello", nil
}

// Say Greeting Activity.
func sayGreetingActivity(greeting string, name string) (string, error) {
    result := fmt.Sprintf("Greeting: %s %s!\n", greeting, name)
    return result, nil
}

Правильно ли мы думаем об этом?


person Jeff Lill    schedule 19.06.2019    source источник


Ответы (1)


Это ошибка клиентской библиотеки Go. Это происходит, когда MutableSideEffect с одним и тем же идентификатором используется несколько раз во время одного решения.

Если принудительно принять отдельное решение, поместив workflow.Sleep(ctx, time.Second) непосредственно перед вторым MutableSideEffect вызовом, проблема исчезнет.

Я подал проблему, чтобы исправить это.

Большое спасибо за сообщение!

person Maxim Fateev    schedule 19.06.2019
comment
Прохладный! Мы добавим это решение в клиент .NET и заметку для отслеживания вашей проблемы. Я думал, что это могло быть то, что происходило сегодня на дороге, и собирался попробовать добавить обходной путь в соответствии с вашим предложением. Мы поймали это в модульном тесте. Я полагаю, что такое редко встречается в реальном мире. - person Jeff Lill; 19.06.2019