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

Using dataplane API by uncommenting 'program api' and 'userlist haproxy-dataplaneapi' section of config causes crash #8

Open
JamesTGrant opened this issue Sep 19, 2024 · 1 comment

Comments

@JamesTGrant
Copy link

JamesTGrant commented Sep 19, 2024

Using dataplane API in versions from 3.0.4 onward causes crash.

Simple to replicate by uncommenting 'program api' and 'userlist haproxy-dataplaneapi' section of the example config (note the VERSION variable in the following link!)
(https://raw.githubusercontent.com/haproxytech/haproxy-docker-ubuntu/refs/tags/$VERSION/3.0/haproxy.cfg)
Not yet found a way to use the dataplane API in versions later than 3.0.3

working in 3.0.3-95a607c
broken in 3.0.4-7a59afa onward

Uncomment these two lines from the haproxy.cfg:

program api
    command /usr/bin/dataplaneapi --host 0.0.0.0 --port 5555 --haproxy-bin /usr/sbin/haproxy --config-file /usr/local/etc/haproxy/haproxy.cfg --reload-cmd "kill -SIGUSR2 1" --restart-cmd "kill -SIGUSR2 1" --reload-delay 5 --userlist haproxy-dataplaneapi
    no option start-on-reload

userlist haproxy-dataplaneapi
  user admin insecure-password mypassword

log output:

[NOTICE]   (1) : New program 'api' (8) forked
[NOTICE]   (1) : New worker (9) forked
[NOTICE]   (1) : Loading success.
[WARNING]  (9) : Server static/static1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
2024/09/19 13:47:00 maxprocs: Leaving GOMAXPROCS=4: CPU quota undefined
2024/09/19 13:47:00 INFO memory is not limited, skipping package=github.com/KimMachineGun/automemlimit/memlimit
[WARNING]  (9) : Server static/static2 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT]    (9) : backend 'static' has no server available!
configuration file /etc/haproxy/dataplaneapi.yaml does not exists, creating one
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb0 pc=0x101ce74]

goroutine 1 [running]:
github.com/haproxytech/dataplaneapi/configuration.(*Configuration).migrateUsers(0xc0003c3608)
        github.com/haproxytech/dataplaneapi/configuration/configuration_deprecated.go:76 +0xf4
github.com/haproxytech/dataplaneapi/configuration.(*Configuration).migrateDeprecatedFields(0xc0003c3608)
        github.com/haproxytech/dataplaneapi/configuration/configuration_deprecated.go:34 +0x12c
github.com/haproxytech/dataplaneapi/configuration.(*Configuration).LoadDataplaneStorageConfig(0xc0003c3608)
        github.com/haproxytech/dataplaneapi/configuration/configuration.go:312 +0x6c
main.startServer(0xc0003c3608, 0xc0003d8140)
        github.com/haproxytech/dataplaneapi/cmd/dataplaneapi/main.go:154 +0x985
main.main()
        github.com/haproxytech/dataplaneapi/cmd/dataplaneapi/main.go:67 +0x59
[NOTICE]   (1) : haproxy version is 3.0.4-7a59afa
[NOTICE]   (1) : path to executable is /usr/local/sbin/haproxy
[ALERT]    (1) : Current program 'api' (8) exited with code 2 (Exit)
[ALERT]    (1) : exit-on-failure: killing every processes with SIGTERM
[ALERT]    (1) : Current worker (9) exited with code 143 (Terminated)
[WARNING]  (1) : All workers exited. Exiting... (2)

Here is a BASH script to reproduce the issue:

#! /bin/bash

# fails with VERSION=3.0.4
# works with VERSION=3.0.3
VERSION=3.0.4

# remove any previous instances
if [ "$(docker ps -a -q -f name=my-running-haproxy)" ]; then
    docker stop my-running-haproxy
    docker rm my-running-haproxy
fi

mkdir -p /tmp/haproxy
rm -fR /tmp/haproxy/*
curl -k -L https://raw.githubusercontent.com/haproxytech/haproxy-docker-ubuntu/refs/tags/$VERSION/3.0/haproxy.cfg -o /tmp/haproxy/haproxy.cfg

dataplaneLines=$(cat <<EOF
 userlist haproxy-dataplaneapi
     user admin insecure-password mypassword

 program api
    command /usr/bin/dataplaneapi --host 0.0.0.0 --port 5555 --haproxy-bin /usr/sbin/haproxy --config-file /usr/local/etc/haproxy/haproxy.cfg --reload-cmd "kill -SIGUSR2 1" --restart-cmd "kill -SIGUSR2 1" --reload-delay 5 --userlist haproxy-dataplaneapi
    no option start-on-reload
EOF
)
printf "%s\n" "$dataplaneLines" >> /tmp/haproxy/haproxy.cfg

docker pull ghcr.io/haproxytech/haproxy-docker-ubuntu:$VERSION
docker run -d --name my-running-haproxy --expose 5555 -v /tmp/haproxy:/usr/local/etc/haproxy:rw haproxytech/haproxy-ubuntu:$VERSION
sleep 5
CONTAINER_ID=$(docker ps -a | grep haproxy | awk '{print $1}')
docker logs $CONTAINER_ID
@dkorunic
Copy link
Member

Please if possible open an issue in dataplaneapi issue tracker, but in the meantime I'll ping DPAPI devs right away. Thanks!

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

No branches or pull requests

2 participants