apache / apache/pulsar

[Go, Functions] Panic while goInstance.ackInputMessage

Open
#15,100 7 comments 0 reactions 0 assignees View on GitHub
lifecycle/stale Stale type/bug
Dominant language
Java
Stars
15.3k
Forks
3.8k
Avg merge
1d 14h
Merged PRs (30d)
160

Description

**Describe the bug**
I am testing a simple Go function with Pulsar in standalone in docker. When setting `--auto-ack true` i get a panic from `pulsar-function-go/pf/instance.go` in `ackInputMessage`.
I build it in my system, `docker cp` it in the Pulsar container and run it using:
```
bin/pulsar-admin functions localrun --auto-ack true --go /pulsar/inputFunc --inputs persistent://zerogap/test-nam/in-msgs --output non-persistent://zerogap/test-nam/filtered-msgs --tenant zerogap --namespace test-nam --name test-input-go-function --retain-ordering --retain-key-ordering --user-config '{"custom-data":"12345"}'
```
The simple function's code is:
```
package main

import (
"context"
"encoding/json"
"fmt"
"github.com/apache/pulsar/pulsar-function-go/pf"
)

func contextFunc(ctx context.Context) string {
fc, ok := pf.FromContext(ctx)
if !ok {
fmt.Printf("Function context is not defined")
}

wotd := fc.GetUserConfValue("custom-data")

if wotd == nil {
fmt.Printf("custom-data is empty. set it with --user-config")
return ""
} else {
fmt.Printf("custom-data is %s", wotd.(string))
return wotd.(string)
}
}

func FilterData(ctx context.Context, input []byte) ([]byte, error) {
wotd := contextFunc(ctx)
fmt.Printf("Input message in topic is: %s\n", input)
fmt.Printf("Filtering radar for custom-data: %s\n", wotd)
var dat map[string]interface{}
if err := json.Unmarshal(input, &dat); err != nil {
panic(err)
}
fmt.Println(dat)

return input, nil
}

func main() {
pf.Start(FilterData)
}

```

**To Reproduce**
Steps to reproduce the behavior:
1. Start Pulsar in standalone mode
2. Create the topics the function will be using as input/output
3. Add simple Go function
4. Start the function with the command arguments as above(especially having `--auto-ack` set to `true`)
5. See error below

**Expected behavior**
Expect to have message acknowledgement without panic exit.

**Screenshots**
Panic log:
```
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0xaece73]

goroutine 74 [running]:
github.com/apache/pulsar/pulsar-function-go/pf.(*goInstance).ackInputMessage(0xc000214a00, {0xe75e60, 0xc0001fe2d0})
/home/zerogap/go/pkg/mod/github.com/apache/pulsar/pulsar-function-go@v0.0.0-20220410070944-960580764bbc/pf/instance.go:396 +0xb3
github.com/apache/pulsar/pulsar-function-go/pf.(*goInstance).processResult.func1({0xd11780?, 0x3f52aa8fe9a01fce?}, 0x1?, {0x0?, 0x0?})
/home/zerogap/go/pkg/mod/github.com/apache/pulsar/pulsar-function-go@v0.0.0-20220410070944-960580764bbc/pf/instance.go:378 +0x112
github.com/apache/pulsar-client-go/pulsar.(*partitionProducer).ReceivedSendReceipt(0xc0000ac000, 0xc000230540)
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/producer_partition.go:830 +0x7f0
github.com/apache/pulsar-client-go/pulsar/internal.(*connection).handleSendReceipt(0xc00017dce0, 0xc000230540)
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/internal/connection.go:673 +0xe8
github.com/apache/pulsar-client-go/pulsar/internal.(*connection).internalReceivedCommand(0xc00017dce0, 0xc0006285a0, {0x0?, 0x0})
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/internal/connection.go:558 +0x14a
github.com/apache/pulsar-client-go/pulsar/internal.(*connection).run(0xc00017dce0)
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/internal/connection.go:415 +0x3a5
github.com/apache/pulsar-client-go/pulsar/internal.(*connection).start.func1()
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/internal/connection.go:227 +0x65
created by github.com/apache/pulsar-client-go/pulsar/internal.(*connection).start
/home/zerogap/go/pkg/mod/github.com/apache/pulsar-client-go@v0.8.1/pulsar/internal/connection.go:223 +0x70
```

**Desktop (please complete the following information):**
- OS: Host: Ubuntu 20, Guest: whatever Pulsar container has(`apachepulsar/pulsar:latest`)

Contributor guide

Open the contributing guide

Research direction

Start in pulsar-function-go/pf/instance.go at goInstance.ackInputMessage, using the stack trace and the processResult callback as the entry points. Reproduce with standalone Pulsar and the provided functions localrun command using --auto-ack true; done means the input message is acknowledged without a nil-pointer panic or process exit.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, go
Domain
distributed-systems
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.