[BUG] Websocket Egress fails with broken pipe shortly after it started

Describe the bug
After a short while, Websocket Egress stream fails with broken pipe
Egress Version
v1.7.4
Egress Request
{"room_name": "{room_name}", "track_id": "{track_id}", "websocket_url": "ws://{endpoint}/ws" }
Additional context
Livekit version: v1.4.3
Repository that contains an easily runnable sample: https://github.com/janoskranczler/livekit-egress-test/
It is also reproduced with this synthetic test and in a cloud environment with a production setup
Logs
Livekit log:
livekit-egress-test-livekit-1  | 2023-07-05T13:25:15.221Z       INFO    livekit redis/redis.go:92       connecting to redis     {"simple": true, "addr": "redis:6379"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:15.282Z       WARN    livekit rtcconfig/rtc_unix.go:17        UDP receive buffer is too small for a production set-up {"current": 425984, "suggested": 5000000}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:15.290Z       INFO    livekit service/server.go:220   starting LiveKit server {"portHttp": 7880, "nodeID": "ND_xsFlveN9", "nodeIP": "<IP_ADDRESS>", "version": "1.4.3", "rtc.portTCP": 7881, "rtc.portUDP": 7882}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.391Z       INFO    livekit service/roomallocator.go:111    selected node for room  {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "selectedNodeID": "ND_xsFlveN9"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.403Z       INFO    livekit rtc/room.go:331 new participant joined  {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "pID": "PA_BxGpNQ3F3fyF", "participant": "test_participant", "protocol": 8, "options": {"AutoSubscribe":true}}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.404Z       INFO    livekit rtc/room.go:265 participant state changed       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "state": "JOINED", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "oldState": "JOINING"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.405Z       INFO    livekit service/rtcservice.go:263       new client WS connected {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "remote": false, "connID": "CO_F78Ztjc55324", "reconnect": false, "reconnectReason": "RR_UNKOWN", "adaptiveStream": false}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.469Z       INFO    livekit rtc/transport.go:602    selected ICE candidate pair     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "remote": false, "transport": "SUBSCRIBER", "pair": "(local) udp4 host <IP_ADDRESS>:7882 <-> (remote) udp4 host <IP_ADDRESS>:55158"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.508Z       INFO    livekit rtc/room.go:265 participant state changed       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "state": "ACTIVE", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "oldState": "JOINED"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.568Z       INFO    livekit rtc/participant.go:1572 pending track added     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "remote": false, "trackID": "TR_AMRwGozcHz8qZM", "track": "sid:"TR_AMRwGozcHz8qZM"  source:MICROPHONE", "request": "cid:"179e56b9-b24e-4e95-a61b-72e7c28319b5"  source:MICROPHONE"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.698Z       INFO    livekit rtc/transport.go:602    selected ICE candidate pair     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "remote": false, "transport": "PUBLISHER", "pair": "(local) udp4 host <IP_ADDRESS>:7882 <-> (remote) udp4 host <IP_ADDRESS>:54649"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:16.758Z       INFO    livekit rtc/participant.go:1241 mediaTrack published    {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "test_participant", "pID": "PA_BxGpNQ3F3fyF", "remote": false, "kind": "audio", "trackID": "TR_AMRwGozcHz8qZM", "webrtcTrackID": "179e56b9-b24e-4e95-a61b-72e7c28319b5", "rid": "", "SSRC":<PHONE_NUMBER>, "mime": "audio/red"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:18.797Z       INFO    livekit service/twirp.go:128    API RoomService.GetParticipant  {"service": "RoomService", "method": "GetParticipant", "room": "test_room", "participant": "test_participant", "duration": "791.667µs", "status": "200"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.044Z       INFO    livekit service/twirp.go:128    API Egress.StartTrackEgress     {"service": "Egress", "method": "StartTrackEgress", "room": "test_room", "trackID": "TR_AMRwGozcHz8qZM", "outputType": "*livekit.TrackEgressRequest_WebsocketUrl", "egressID": "EG_Za5gXZT7iZN2", "duration": "230.1865ms", "status": "200"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.116Z       INFO    livekit rtc/room.go:331 new participant joined  {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "pID": "PA_YWh7b2gHwhTj", "participant": "EG_Za5gXZT7iZN2", "protocol": 8, "options": {"AutoSubscribe":false}}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.117Z       INFO    livekit rtc/room.go:265 participant state changed       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "state": "JOINED", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "oldState": "JOINING"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.117Z       INFO    livekit service/rtcservice.go:263       new client WS connected {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "connID": "CO_frut3RLZdYK9", "reconnect": false, "reconnectReason": "RR_UNKOWN", "adaptiveStream": false}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.125Z       INFO    livekit rtc/transport.go:602    selected ICE candidate pair     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "transport": "SUBSCRIBER", "pair": "(local) udp4 host <IP_ADDRESS>:7882 <-> (remote) udp4 host <IP_ADDRESS>:56672"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.131Z       INFO    livekit rtc/room.go:265 participant state changed       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "state": "ACTIVE", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "oldState": "JOINED"}
livekit-egress-test-livekit-1  | 2023-07-05T13:25:19.131Z       INFO    livekit rtc/subscriptionmanager.go:148  subscribing to track    {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "trackID": "TR_AMRwGozcHz8qZM"}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.659Z       INFO    livekit rtc/signalhandler.go:44 client leaving room     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.659Z       INFO    livekit rtc/participant.go:664  participant closing     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "sendLeave": true, "reason": "CLIENT_REQUEST_LEAVE"}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.662Z       INFO    livekit rtc/participant_signal.go:286   closing signal connection       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.662Z       INFO    livekit service/rtcservice.go:236       finishing WS connection {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "connID": "CO_frut3RLZdYK9"}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.668Z       ERROR   livekit service/ioinfo.go:76    egress failed   {"egressID": "EG_Za5gXZT7iZN2", "error": "write tcp <IP_ADDRESS>:38496-><IP_ADDRESS>:8000: write: broken pipe"}
livekit-egress-test-livekit-1  | github.com/livekit/livekit-server/pkg/service.(*IOInfoService).UpdateEgressInfo
livekit-egress-test-livekit-1  |        /workspace/pkg/service/ioinfo.go:76
livekit-egress-test-livekit-1  | github.com/livekit/psrpc/pkg/server.(*rpcHandlerImpl[...]).handleRequest
livekit-egress-test-livekit-1  |        /go/pkg/mod/github.com/livekit/psrpc@v0.3.1-0.20230528083849-53d664c6d912/pkg/server/rpc.go:161
livekit-egress-test-livekit-1  | github.com/livekit/psrpc/pkg/server.(*rpcHandlerImpl[...]).run.func1.1
livekit-egress-test-livekit-1  |        /go/pkg/mod/github.com/livekit/psrpc@v0.3.1-0.20230528083849-53d664c6d912/pkg/server/rpc.go:109
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.683Z       WARN    livekit sfu/downtrack.go:1205   could not write blank frame     {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "trackID": "TR_AMRwGozcHz8qZM", "relayed": false, "error": "io: read/write on closed pipe"}
livekit-egress-test-livekit-1  | 2023-07-05T13:26:11.683Z       INFO    livekit sfu/downtrack.go:883    rtp stats       {"room": "test_room", "roomID": "RM_W6wdMVtzCnar", "participant": "EG_Za5gXZT7iZN2", "pID": "PA_YWh7b2gHwhTj", "remote": false, "trackID": "TR_AMRwGozcHz8qZM", "relayed": false, "direction": "downstream", "mime": "audio/opus", "ssrc":<PHONE_NUMBER>, "stats": "t: Wed Jul  5 13:25:19 UTC 2023|Wed Jul  5 13:26:11 UTC 2023|52.36s, sn: 29818|32413, ep: 2596|49.58/s, p: 2596|49.58/s, l: 0|0.0/s|0.00%, b: 141766|21660.8bps|31152, f: 8|0.2/s / 0|Mon Jan  1 00:00:00 UTC 0001, d: 0|0.00/s, bd: 0|0.0bps|0, pp: 0|0.00/s, bp: 0|0.0bps|0, o: 0, c: 48000, j: 225(4687.5us)|328(6833.3us), n:0|0|0|0, pli:0|Mon Jan  1 00:00:00 UTC 0001 / 0|Mon Jan  1 00:00:00 UTC 0001, fir:0|Mon Jan  1 00:00:00 UTC 0001, rtt(ms):3|4, drift(ms):19.50, sr(Hz):48017.86"}
Egress log:
livekit-egress-test-egress-1  | + export TMPDIR=/tmp/lkegress
livekit-egress-test-egress-1  | + TMPDIR=/tmp/lkegress
livekit-egress-test-egress-1  | + rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse
livekit-egress-test-egress-1  | + pulseaudio -D --verbose --exit-idle-time=-1 --system --disallow-exit
livekit-egress-test-egress-1  | W: [pulseaudio] main.c: Running in system mode, but --disallow-module-loading not set.
livekit-egress-test-egress-1  | N: [pulseaudio] main.c: Running in system mode, forcibly disabling SHM mode.
livekit-egress-test-egress-1  | I: [pulseaudio] main.c: Daemon startup successful.
livekit-egress-test-egress-1  | + '[' -z /tmp/lkegress ']'
livekit-egress-test-egress-1  | + mkdir -p /tmp/lkegress
livekit-egress-test-egress-1  | + exec egress
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.407Z        INFO    egress  redis/redis.go:92       connecting to redis     {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": "", "simple": true, "addr": "redis:6379"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.412Z        INFO    egress  stats/monitor.go:135    available CPU cores: 5 max cost: 4.000000       {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": ""}
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.412Z        DEBUG   egress  service/debug.go:24     debug handler disabled  {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": ""}
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.412Z        DEBUG   egress  service/service.go:77   starting service        {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": "", "version": "1.7.4"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.412Z        DEBUG   egress  service/templates_server.go:24  starting template server on address localhost:7980      {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": ""}
livekit-egress-test-egress-1  | 2023-07-05T13:25:15.412Z        DEBUG   egress  service/service_deprecated.go:27        service ready   {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": ""}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.028Z        INFO    egress  service/service.go:111  request received        {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.030Z        INFO    egress  service/service.go:119  request validated       {"nodeID": "NE_Z72HPUpBf5JR", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "request_type": "track", "output_type": "websocket", "room": "test_room", "request": {"Track":{"room_name":"test_room","track_id":"TR_AMRwGozcHz8qZM","Output":{"WebsocketUrl":"ws://ingest:8000/ws"}}}}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.094Z        DEBUG   egress  server/main.go:169      handler launched        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.095Z        INFO    egress  redis/redis.go:92       connecting to redis     {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "simple": true, "addr": "redis:6379"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.110Z        DEBUG   egress  source/sdk.go:282       connecting to room      {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.121Z        INFO    logger/logger.go:144    received offer for subscriber   {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.126Z        INFO    logger/logger.go:144    ICE connected   {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.283Z        INFO    logger/logger.go:144    received offer for subscriber   {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.324Z        INFO    logger/logger.go:144    track subscribed        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "participant": "test_participant", "track": "TR_AMRwGozcHz8qZM", "kind": "audio"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.324Z        DEBUG   egress  source/sdk.go:161       track subscribed        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "trackID": "TR_AMRwGozcHz8qZM", "mime": "audio/opus"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.448Z        DEBUG   egress  pipeline/pipeline.go:166        waiting for start signal        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.449Z        INFO    egress  pipeline/watch.go:148   audioAppSrc playing     {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.585Z        INFO    egress  pipeline/watch.go:152   pipeline playing        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:19.585Z        INFO    egress  service/handler.go:210  egress updated  {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "egressID": "EG_Za5gXZT7iZN2", "request_type": "track", "output_type": "websocket", "status": "EGRESS_ACTIVE"}
livekit-egress-test-egress-1  | 2023-07-05T13:25:25.134Z        WARN    egress  sdk/appwriter.go:344    dropping packet {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "trackID": "TR_AMRwGozcHz8qZM", "kind": "audio", "error": "backwards pts"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.650Z        INFO    egress  pipeline/pipeline.go:514        pipeline stopped        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.656Z        INFO    egress  sdk/appwriter.go:179    writer finished {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "trackID": "TR_AMRwGozcHz8qZM", "kind": "audio", "sample duration rtp": 960, "sample duration ns": "20ms", "avg drift": "3.379083ms", "max drift": "29.600791ms"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.663Z        INFO    logger/logger.go:144    Leave room      {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "reason": "CLIENT_INITIATED"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.663Z        INFO    egress  service/handler.go:210  egress updated  {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "egressID": "EG_Za5gXZT7iZN2", "request_type": "track", "output_type": "websocket", "status": "EGRESS_ENDING"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.665Z        WARN    egress  service/handler.go:198  egress failed   {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "egressID": "EG_Za5gXZT7iZN2", "request_type": "track", "output_type": "websocket", "error": "write tcp <IP_ADDRESS>:38496-><IP_ADDRESS>:8000: write: broken pipe"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.666Z        INFO    egress  pipeline/pipeline.go:397        sending EOS to pipeline {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2"}
livekit-egress-test-egress-1  | 2023-07-05T13:26:11.666Z        DEBUG   egress  sdk/appwriter.go:142    draining        {"nodeID": "NE_Z72HPUpBf5JR", "handlerID": "EGH_UMpi8qtUPPgF", "clusterID": "", "egressID": "EG_Za5gXZT7iZN2", "trackID": "TR_AMRwGozcHz8qZM", "kind": "audio"}

@imredobos make sure your websocket server is responding to pings, and isn't closing the connection due to timeout. I suspect the websocket server because I can reproduce using https://github.com/janoskranczler/livekit-egress-test/ but I cannot reproduce using the websocket server found here, even when running for a while

@frostbyte73 I have just made some deeper investigation with ping pong messages, and it seems that the problem is that we are sending ping as well but egress does not send pong for that messages. We are not able to skip sending ping messages, the only solution is to set a very high number for ping interval and timeout as well, which means if the interval is set to 10 minutes and the timeout also set to 10 minutes, the error will happen after 20 minutes. Also we are able to set an unrealistically high number for them, but it would be better if egress would be able to send pong as well.
https://github.com/gorilla/websocket/blob/master/examples/chat/client.go - here is an example how to setup pong handler

The default websocket connection does have a default pings handler - the bug here was that we aren't reading from the websocket, so it never receives/handles the pings. Will have a PR soon

Fixed in #416 and released in v1.7.6

Something wrong with this fix, I am continuously getting the following error with v1.7.6:

panic: repeated read on failed websocket connection
--

goroutine 236 [running]:
github.com/gorilla/websocket.(*Conn).NextReader(0xc00069b600)
/root/go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1030 +0x27f
github.com/gorilla/websocket.(*Conn).ReadMessage(0xc1230ed3040ec997?)
/root/go/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1093 +0x19
github.com/livekit/egress/pkg/pipeline/sink.(*WebsocketSink).Start.func2()
/workspace/pkg/pipeline/sink/websocket.go:57 +0x75
created by github.com/livekit/egress/pkg/pipeline/sink.(*WebsocketSink).Start
/workspace/pkg/pipeline/sink/websocket.go:54 +0xa5

@frostbyte73
I still get the error after the keepalive (default 20 sec) times out.
LiveKit
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.026Z       INFO    livekit rtc/signalhandler.go:44 client leaving room     {"room": "test_room", "roomID": "RM_iDHquZCuDo9u", "participant": "EG_aPbA8VY4CVCe", "pID": "PA_6BJrHSWDsiE5", "remote": false}
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.061Z       INFO    livekit rtc/participant.go:664  participant closing     {"room": "test_room", "roomID": "RM_iDHquZCuDo9u", "participant": "EG_aPbA8VY4CVCe", "pID": "PA_6BJrHSWDsiE5", "remote": false, "sendLeave": true, "reason": "CLIENT_REQUEST_LEAVE"}
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.070Z       INFO    livekit rtc/participant_signal.go:286   closing signal connection       {"room": "test_room", "roomID": "RM_iDHquZCuDo9u", "participant": "EG_aPbA8VY4CVCe", "pID": "PA_6BJrHSWDsiE5", "remote": false}
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.051Z       INFO    livekit service/rtcservice.go:236       finishing WS connection {"room": "test_room", "roomID": "RM_iDHquZCuDo9u", "participant": "EG_aPbA8VY4CVCe", "pID": "PA_6BJrHSWDsiE5", "remote": false, "connID": "CO_PBG3BtpE6Lgw"}
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.125Z       WARN    livekit sfu/downtrack.go:1205   could not write blank frame     {"room": "test_room", "roomID": "RM_iDHquZCuDo9u", "participant": "EG_aPbA8VY4CVCe", "pID": "PA_6BJrHSWDsiE5", "remote": false, "trackID": "TR_AMRUK7ZUYipXbo", "relayed": false, "error": "io: read/write on closed pipe"}
livekit-egress-test-livekit-1  | 2023-07-12T07:43:25.128Z       ERROR   livekit service/ioinfo.go:76    egress failed   {"egressID": "EG_aPbA8VY4CVCe", "error": "websocket: close 1011 (internal server error): keepalive ping timeout"}
livekit-egress-test-livekit-1  | github.com/livekit/livekit-server/pkg/service.(*IOInfoService).UpdateEgressInfo
livekit-egress-test-livekit-1  |        /workspace/pkg/service/ioinfo.go:76
livekit-egress-test-livekit-1  | github.com/livekit/psrpc/pkg/server.(*rpcHandlerImpl[...]).handleRequest
livekit-egress-test-livekit-1  |        /go/pkg/mod/github.com/livekit/psrpc@v0.3.1-0.20230528083849-53d664c6d912/pkg/server/rpc.go:161
livekit-egress-test-livekit-1  | github.com/livekit/psrpc/pkg/server.(*rpcHandlerImpl[...]).run.func1.1
livekit-egress-test-livekit-1  |        /go/pkg/mod/github.com/livekit/psrpc@v0.3.1-0.20230528083849-53d664c6d912/pkg/server/rpc.go:109

Egress (I'm not sure if those warns has anything to do with the error)
livekit-egress-test-egress-1  | 2023-07-12T08:09:50.588Z        DEBUG   egress  source/sdk.go:161       track subscribed        {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs", "trackID": "TR_AMAhuvhrJsjFVA", "mime": "audio/opus"}
livekit-egress-test-egress-1  | 0:00:00.660974084    32 0xaaaaf789a990 WARN              cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
livekit-egress-test-egress-1  | 0:00:00.661419750    32 0xaaaaf789a990 WARN                 nvcodec plugin.c:94:plugin_init: Failed to load cuda library
livekit-egress-test-egress-1  | 0:00:00.821672500    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x120000: 'AVR (Audio Visual Research)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821693250    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x180000: 'CAF (Apple Core Audio File)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821832209    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x100000: 'HTK (HMM Tool Kit)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821846209    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0xc0000: 'MAT4 (GNU Octave 2.0 / Matlab 4.2)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821848917    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0xd0000: 'MAT5 (GNU Octave 2.1 / Matlab 5.0)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821850917    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x210000: 'MPC (Akai MPC 2k)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821853125    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0xe0000: 'PVF (Portable Voice Format)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.821855959    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x160000: 'SD2 (Sound Designer II)' is not mapped
livekit-egress-test-egress-1  | 0:00:00.822012542    32 0xaaaaf789a990 WARN                 default gstsfelement.c:97:gst_sf_create_audio_template_caps: format 0x190000: 'WVE (Psion Series 3)' is not mapped
livekit-egress-test-egress-1  | 2023-07-12T08:09:52.114Z        DEBUG   egress  pipeline/pipeline.go:179        waiting for start signal        {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs"}
livekit-egress-test-egress-1  | 2023-07-12T08:09:52.116Z        INFO    egress  pipeline/watch.go:223   audioAppSrc playing     {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs"}
livekit-egress-test-egress-1  | 2023-07-12T08:09:52.126Z        INFO    egress  pipeline/watch.go:227   pipeline playing        {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs"}
livekit-egress-test-egress-1  | 2023-07-12T08:09:52.126Z        INFO    egress  service/handler.go:210  egress updated  {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs", "egressID": "EG_Ai2QVSaFZdJs", "requestType": "track", "outputType": "websocket", "status": "EGRESS_ACTIVE"}
livekit-egress-test-egress-1  | 2023-07-12T08:10:32.130Z        INFO    egress  pipeline/pipeline.go:544        pipeline stopped        {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs"}
livekit-egress-test-egress-1  | 2023-07-12T08:10:32.134Z        INFO    egress  sdk/appwriter.go:180    writer finished {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs", "trackID": "TR_AMAhuvhrJsjFVA", "kind": "audio", "sampleDuration": "20ms", "avgDrift": "908.167µs", "maxDrift": "5.884374ms", "packetLoss": "0.00%"}
livekit-egress-test-egress-1  | 2023-07-12T08:10:32.135Z        WARN    egress  service/handler.go:198  egress failed   {"nodeID": "NE_EkhdiKwCUBYu", "handlerID": "EGH_J3TaLBQ8q7eE", "clusterID": "", "egressID": "EG_Ai2QVSaFZdJs", "egressID": "EG_Ai2QVSaFZdJs", "requestType": "track", "outputType": "websocket", "error": "websocket: close 1011 (internal server error): keepalive ping timeout"}

Our Python websocker server
livekit-egress-test-ingest-1  | DEBUG:    ! timed out waiting for keepalive pong
livekit-egress-test-ingest-1  | DEBUG:    ! failing connection with code 1011
livekit-egress-test-ingest-1  | DEBUG:    = connection is CLOSING
livekit-egress-test-ingest-1  | DEBUG:    > CLOSE 1011 (unexpected error) keepalive ping timeout [24 bytes]
livekit-egress-test-ingest-1  | DEBUG:    x half-closing TCP connection
livekit-egress-test-ingest-1  | TRACE:    <IP_ADDRESS>:52882 - WebSocket connection lost
livekit-egress-test-ingest-1  | DEBUG:    = connection is CLOSED
livekit-egress-test-ingest-1  | TRACE:    <IP_ADDRESS>:52882 - ASGI [2] Receive {'type': 'websocket.disconnect', 'code': 1006}
livekit-egress-test-ingest-1  | 2023-07-12 07:43:25,198 WebSocket connection finished
livekit-egress-test-ingest-1  | TRACE:    <IP_ADDRESS>:52882 - ASGI [2] Raised exception
livekit-egress-test-ingest-1  | ERROR:    Exception in ASGI application
livekit-egress-test-ingest-1  | Traceback (most recent call last):
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 254, in run_asgi
livekit-egress-test-ingest-1  |     result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
livekit-egress-test-ingest-1  |     return await self.app(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 86, in __call__
livekit-egress-test-ingest-1  |     raise exc from None
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 82, in __call__
livekit-egress-test-ingest-1  |     await self.app(scope, inner_receive, inner_send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/fastapi/applications.py", line 276, in __call__
livekit-egress-test-ingest-1  |     await super().__call__(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/applications.py", line 122, in __call__
livekit-egress-test-ingest-1  |     await self.middleware_stack(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/middleware/errors.py", line 149, in __call__
livekit-egress-test-ingest-1  |     await self.app(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
livekit-egress-test-ingest-1  |     raise exc
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
livekit-egress-test-ingest-1  |     await self.app(scope, receive, sender)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
livekit-egress-test-ingest-1  |     raise e
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
livekit-egress-test-ingest-1  |     await self.app(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/routing.py", line 718, in __call__
livekit-egress-test-ingest-1  |     await route.handle(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/routing.py", line 341, in handle
livekit-egress-test-ingest-1  |     await self.app(scope, receive, send)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/routing.py", line 82, in app
livekit-egress-test-ingest-1  |     await func(session)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/fastapi/routing.py", line 289, in app
livekit-egress-test-ingest-1  |     await dependant.call(**values)
livekit-egress-test-ingest-1  |   File "/code/main.py", line 17, in websocket_endpoint
livekit-egress-test-ingest-1  |     await websocket.receive_bytes()
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/websockets.py", line 122, in receive_bytes
livekit-egress-test-ingest-1  |     self._raise_on_disconnect(message)
livekit-egress-test-ingest-1  |   File "/root/.cache/pypoetry/virtualenvs/livekit-egress-test-MATOk_fk-py3.10/lib/python3.10/site-packages/starlette/websockets.py", line 105, in _raise_on_disconnect
livekit-egress-test-ingest-1  |     raise WebSocketDisconnect(message["code"])
livekit-egress-test-ingest-1  | starlette.websockets.WebSocketDisconnect: 1006


Streamline linting

Closes #216
I was debating caching the things that are pip installed also but let me know what y'all think

@Emiller88 You will need to escape the cookiecutter statements with jinja2 raw statements.
That's why the workflows are failing.
And +1 for caching pip dependencies.

@Emiller88 You will need to escape the cookiecutter statements with jinja2 raw statements.
That's why the workflows are failing.
And +1 for caching pip dependencies.

Ah I thought I was being clever. I'll revert it.

Ah I thought I was being clever. I'll revert it.

I'll test it real quick. Thanks @Emiller88!

I'll test it real quick. Thanks @Emiller88!


go generate at $GOPATH/src/github.com/dave/jsgo/initialise failed

hajimehoshi@Hajimes-MacBook-Pro ~/go/src/github.com/dave/jsgo/initialise
$ GOPATH=~/go go generate
Loading...
Compiling: archive/tar (minified)
2018/12/26 01:41:20 goroot/src/reflect/value.go:673:60: cannot use t (variable of type *rtype) as *funcType value in argument to funcLayout
exit status 1
generate.go:3: running "go": exit status 1

What Go version are you using?

go version go1.11.2 darwin/amd64

OK I was on go1.11... I just upgraded to go1.11.4 and I'm getting the same error... I'll have a look into it...

Give it a try now... The fix was in github.com/dave/services. I've upgraded services and jsgo to modules so you should be able to do a go get and it might work now.

OK now this succeeded. Thanks!


add sufix props

Hi, i add sufix props in your flutter package.

Hey Ayce45,
Thanks for the PR, it is a really good feature. But as far as I know, you didn't spell "sufix" correctly. It should be "suffix". Can you fix it and then create a PR again?

Ok for you?

Yes. Thank you again


Phi-3-mini-4k-instruct (INT4) model compile error

Meteor Lake 155H laptop
Windows 11
I ran the following command to update the Python package:
pip install intel-npu-acceleration-library --upgrade

Then, when running the following cell in Jupyter notebook
model = intel_npu_acceleration_library.compile(model, dtype=torch.int4)

I have experienced the following error:
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[4], [line 2](vscode-notebook-cell:?execution_count=4&line=2)
      [1](vscode-notebook-cell:?execution_count=4&line=1) print("Compile model for the NPU")
----> [2](vscode-notebook-cell:?execution_count=4&line=2) model = intel_npu_acceleration_library.compile(model, dtype=torch.int4)

File c:\Users\xiaoy\anaconda3\envs\nlp\Lib\site-packages\torch\__init__.py:2003, in __getattr__(name)
   [2000](file:///C:/Users/xiaoy/anaconda3/envs/nlp/Lib/site-packages/torch/__init__.py:2000)     import importlib
   [2001](file:///C:/Users/xiaoy/anaconda3/envs/nlp/Lib/site-packages/torch/__init__.py:2001)     return importlib.import_module(f".{name}", __name__)
-> [2003](file:///C:/Users/xiaoy/anaconda3/envs/nlp/Lib/site-packages/torch/__init__.py:2003) raise AttributeError(f"module '{__name__}' has no attribute '{name}'")

AttributeError: module 'torch' has no attribute 'int4'

Torch does not have int4 method. Instead, you should use intel_npu_acceleration_library.int4. A good example is here: https://github.com/intel/intel-npu-acceleration-library/blob/main/examples/phi-3.py#L13
Also, since quantization take a bit, I implemented NPUModelForCausalLM that will cache the quantized model for convenience I suggest you to use that as well. Be sure to use the latest version of this library and the latest driver (https://www.intel.com/content/www/us/en/download/794734/intel-npu-driver-windows.html) to make full use of the new features like int4 quantization:


Server Lag

Hello!
So my server is lagging, a lot.
it isnt because i dont have enough ram or anything like that.
The Lag:
https://gyazo.com/404446f5117077730cde43e2884d2a96
Status of the server (at the time when it was lagging):
Connected players: 60/128
Players: 60 - Bots: 0
Server has been running for 462 minutes
Current memory usage: 124.2/148 mb
Current game mode: Free For All
Current update time: 32.229 [ms]  (good)

i can help u , give me your server

http://agarup.us/

@CalvinDKL A few questions:

How big were the players on your server?
What are you using to host?
How much food/viruses/ejected mass was on the map at the time?

Current update time: 32.229 [ms] (good)
That is a lot. Answer @Megabyte918 questions 👍

Find:

    // Move moving cells
    for (var i = 0; i < this.movingNodes.length;) {
        cell1 = this.movingNodes[i];
        if (cell1.isRemoved)
            continue;
        this.moveCell(cell1);
        this.updateNodeQuad(cell1);
        if (!cell1.isMoving)
            this.movingNodes.splice(i, 1);
        else i++;
    }

and replace with:

     // Move moving cells
     for (var i = 0, len = this.movingNodes.length; i < len; ) {
         if(this.movingNodes[i]) {
             var cell1 = this.movingNodes[i];
             if (!cell1.isRemoved) {
                 this.moveCell(cell1);
                 this.updateNodeQuad(cell1);
                 if (!cell1.isMoving)
                     this.movingNodes.splice(i, 1);
             }
         }
         i++;
     }

As that seems be where most lag right now comes from 😠

Most lag seems to be coming from this.quadTree.find, when I disable it for minions I can run up to 30k without lag (but minions can't eat anything), and when it's enabled for minions, I can only run 5k without lag.

Weird enough found a other one that for some .. well unknown for me reason causes tick lag as well.
Live 733:
var speed = ~~Math.sqrt(cell1.boostDistance * cell1.boostDistance / 100);
Apparently using ~~  there lags the tick a lot,.
so change it to
var speed = Math.sqrt(cell1.boostDistance * cell1.boostDistance / 100);
and poof,.
ps... seriously.. start using real memory use display and not some weird "reserved used" lol
var rss = parseInt((process.memoryUsage().rss / 1024 ).toFixed(0));
Hugs,
Jara

The lag could have been because of my domain, atm i am using 4 cores with
10gigs of ram without any lag.
So im almost sure that the domain was the issue.

OR it might have been because i only had 2 cores when i opened this issue.


WIP: Add gitignore and setup command

First of all, I tagged this PR WIP, because #33 should be resolved before merging the current PR. If I understand correctly, @beef331 probably plans on running CMake on every build. This renders the setup command not relevant anymore. However, the code in this PR for setup that runs CMake could be reused as-is for the build command.
That said, this PR introduces the following changes:
Add .gitignore file to the template.
It contains a single entry, csource/build. Moving all intermediate build outputs this subdirectory makes the separation of "source" with "build and intermediate outputs" clearer (see next point).
Nim generated C files are put in csource/build/nimcache
Currently they were in csource.  This avoids mixing source that should not be ignored with intermediate files that should.
Template contains a single CMakeLists.txt file
It currently contained two files, one of which was copied as the in-use file depending on the dev's preference of downloading or reusing the pico SDK. Here I propose a single file, the SDK preference is passed in as a command-line option to CMake.
This simplifies the setup command and makes it possible for a project dev to customize their CMakeLists file while also sharing it with other devs that have different SDK preferences.
This change is somewhat backwards incompatible, but from my understanding, picostdlib is currently in a refactoring phase that includes other breaking changes, so hopefully this is acceptable.
Add the setup command.
The setup command currently does one thing: run CMake in order to generate the csource/build dir, which is ignored. Thus, after a fresh clone, or running git clean on a pico project, a dev needs to run piconim setup in the project root, optionally passing in their SDK preference, and they are ready to build. The readme file was also updated with information on this command.
Finally: sorry for the messy git history, please squash-merge this PR. Or let me know if I should squash on my end.

Just pushed a new commit that adds the csource dir to the include search path in CMakeLists.txt. It removes the need for piconim build to copy the nimbase.h to nimcache, which I had been doing.

Hey, this is good stuff. I merged #36 and #37 and did a bunch of refactoring afterwards. See comments on #37 .

Heya,
I'm not sure what the current plan is with #37, but it appears that we don't need to rerun CMake after all. Thus, I do believe that the setup command is relevant. Therefore, I think this PR can be merged as-is. Or, feel free to suggest changes such as changing the name of the setup command.
If everyone is OK with this LMK and I'll bump the version.


Labels on 'Edit image' form need more horizontal space

See https://github.com/torchbox/wagtail/pull/2243#discussion_r53226298 - affects collections, but would similarly occur for any sufficiently long field name on a custom image model (such as 'Copyright').

Bear in mind: https://github.com/torchbox/wagtail/issues/1442 which is semi-duplicative.
To widen the label a little more would just put off the problem for another day. Alternative we could forcibly hyphenate it with word-break: break-all but that feels rather churlish. I think I've known from the start that the aesthetic might have to give way to the practical on this front.
Moving labels above fields seems like the most i18n-friendly solution. It would seem most sensible to do it globally, in fact: we don't know the width of any non-english translated strings, not just form labels. We wouldn't want to have to calculate it dynamically either. So anywhere where horizontally aligned fields exist, this is a problem either happening for many already, or about to happen, or happening for some but only at small breakpoints.
Does @heymonkeyriot has anything to add here?

I agree with @davecranwell that moving the labels above the field would make the most sense. I've run in to trouble with label lengths without even particularly long words so I can imagine in German (or other languages where words can concat) it would be even worse.
As you say this feels similar to #1442 (and my duplicate of that at #2263) and I think would give a sense of consistency for the help texts then appearing underneath fields rather than to their right.

I'm really glad to hear there may finally be some movement on this soon. Since our first wagtail project, we've been using an override stylesheet to force labels to appear above fields and help text below. It makes everything feel so much more consistent. FieldRowPanels really come into their own with the extra horizontal space made available. it's actually viable to have 3 or 4 (small) fields in a row together. Take this layout for example:

Or this one for an event, which also shows an alternative checkbox input style (it sure would be lovely to get rid of that colon from the end of the checkbox label)

For contrast, here's that same layout without the overrides in place:

@gasman can this be closed or does it still need work?

I think this issue has been fixed in the latest version. Can this issue be closed or is there anything we need to work on?

@halinh0507 Yep, looks like this was fixed in #4868. Thanks for prompting!


getting a corrected VCF from truvari

Hi,
I wanted to know whether Truvari has the functionality to output a single 'corrected VCF' that shows for each position in the COMP, what is the true label for each position.
I've looked at all the output files it already produces, but I don't think it currently does this (nor with any of the flags). I think this feature would be somewhat similar to what hap.py does, which has the QUERY and TRUTH columns that show what the caller proposed versus what the truth shows.
It seems like Truvari would basically compute this internally at some point, but it just doesn't actually output it in any file (as far as I can tell).

Hi,
There are already annotations in the output tp-base/tp-comp vcfs that allow one to identify which calls matched up.  All that's required is a post-process that leverages the MatchId INFO field which holds ##INFO=<ID=MatchId,Number=1,Type=Integer,Description="Truvari uid to help tie tp-base.vcf and tp-call.vcf entries together">. e.g. tp-base.vcf has a call MatchId=1092 that was matched with  tp-call.vcf call with MatchId=1092.
Additionally, you may find the other INFO tags such as StartDistance and EndDistance useful.


Settings Sync with Github OAuth is failing

VSCode Version: 1.51.1
OS Version: Windows_NT x64 10.0.19042

Straight from VSCode Help
Commit: e5a624b788d92b8d34d1392e4c4d9789406efe8f
Date: 2020-11-10T23:34:32.027Z
Electron: 9.3.3
Chrome: 83.0.4103.122
Node.js: 12.14.1
V8: <IP_ADDRESS>-electron.0
OS: Windows_NT x64 10.0.19042

Steps to Reproduce:

Start vscode and see the console log from Output tab

[2020-11-29 23:49:19.185] [userDataSync] [info] Using settings sync service https://vscode-sync.trafficmanager.net/
[2020-11-29 23:49:19.185] [userDataSync] [info] Auto Sync is enabled.
[2020-11-29 23:49:19.185] [userDataSync] [info] Auto Sync: Suspended until auth token is available.

Sign in to Sync Settings
Sign in with Github

https://vscode-auth.github.com/authorize/?callbackUri=vscode://vscode.github-authentication/did-authenticate%253FwindowId%253D1&scope=user:email&state=24e1d69a-8e3f-4fe4-9ed0-adddc7a83b58&responseType=code&authServer=https://github.com

Login to github and authorize vscode
5.https://vscode-auth.github.com/?browser_session_id=94cd7bad381ce161b12701f21d7a083672e9da19bb6ba95d1239e427f00fa5f1&code=09898cd41a1cf59e3a5e&state=iIL8P-bW03Mo_Y41OhwrSiiEXYw%2FeyJhdXRoU2VydmVyIjoiaHR0cHM6Ly9naXRodWIuY29tIiwiY2FsbGJhY2tVcmkiOiJ2c2NvZGU6Ly92c2NvZGUuZ2l0aHViLWF1dGhlbnRpY2F0aW9uL2RpZC1hdXRoZW50aWNhdGU_d2luZG93aWQ9MSIsInJlc3BvbnNlVHlwZSI6ImNvZGUiLCJzdGF0ZSI6IjM2N2MwMmRhLWQ3OTYtNDEyMi05MTc0LWQ2YWU0OWVkOTRiYiIsImlkIjoiOjpmZmZmOjEwLjk5LjIwOS4xMTYifQ
It's gonna redirect back to vscode and see the log from Output

[2020-11-29 23:52:23.017] [userDataSync] [info] Auto Sync: Started
[2020-11-29 23:52:23.019] [userDataSync] [info] Auto Sync: Triggered by Interval
[2020-11-29 23:52:23.040] [userDataSync] [info] Auto Sync: Suspended until auth token is available.
[2020-11-29 23:52:23.041] [userDataSync] [info] Auto sync: Cancelled sync that is in progress
[2020-11-29 23:52:23.041] [userDataSync] [info] Auto Sync: Stopped

Otherwise, copy the authcode and paste in the status bar of SignIn flow

vscode://vscode.github-authentication/did-authenticate?windowid=1&code=<your-auth-code>

Does this issue occur when all extensions are disabled?: Yes

@sairaghavak Can you copy the log from the "GitHub Authentication" output channel?

Sure, here it is

Any update on this

Hi @sairaghavak 👋
I recently gained ownership of the auth feature and so I'm getting ramped up!
It's been few versions now... Can you confirm if you're still seeing this issue?
Thanks!

@TylerLeonhardt
Looks like it is working this time
Here is my VSCode version details where I have verified
Version: 1.56.2
Commit: 054a9295330880ed74ceaedda236253b4f39a335
Date: 2021-05-12T17:13:13.157Z
Electron: 12.0.4
Chrome: 89.0.4389.114
Node.js: 14.16.0
V8: <IP_ADDRESS>-electron.0
OS: Windows_NT x64 10.0.19042

GitHub Authentication log

Settings Sync log

Please share the link to the release notes/version in which this fix is pushed for reference.

I've just gained ownership of this space so I'm not entirely sure when this was fixed for you but in the future I'll be able to assist better being more involved with the actual code.
Anyway, glad it's fixed for you. I'll close this now. Thanks!


Request never ends when MatchList endpoint returns a 404

Hi!
When I try to add the beginIndex field and there is no more match returned by the Riot's API, my code never ends.
No error is throw despite the fact that Riot is returning a 404.
Here are the logs of my application:
riotratelimiter:main Request: https://na1.api.riotgames.com/lol/match/v4/matchlists/by-account/AGzqwU_OQkvutSMe2LmMy_g6And1by0RA7JWOBvWbLXsuA?beginIndex=200 region: na1 method: MATCH.GET_MATCHLIST_BY_ACCOUNT +42ms
  riotratelimiter:queue na1 MATCH.GET_MATCHLIST_BY_ACCOUNT Event triggered: received { RECEIVED: 1, QUEUED: 0, RUNNING: 0, EXECUTING: 0 } +3ms
  riotratelimiter:queue na1 MATCH.GET_MATCHLIST_BY_ACCOUNT Event triggered: queued { RECEIVED: 0, QUEUED: 1, RUNNING: 0, EXECUTING: 0 } +12ms
  riotratelimiter:queue na1 MATCH.GET_MATCHLIST_BY_ACCOUNT Draining<PHONE_NUMBER>878 { RECEIVED: 0, QUEUED: 1, RUNNING: 0, EXECUTING: 0 } +0ms
  riotratelimiter:queue na1 MATCH.GET_MATCHLIST_BY_ACCOUNT Drained<PHONE_NUMBER>878 { RECEIVED: 0, QUEUED: 1, RUNNING: 0, EXECUTING: 0 } +16ms

Thanks!

@vkaelin Thanks for this,  just got back and will look into fixing this today.

@vkaelin I have added some tests for this. It seems like there is no issue, can you please look at the tests in the linked PR and make sure your code is running it correctly.
If you are still seeing issues, would you mind pasting some of your code?

@OllieJennings Thanks for this! Will try to make a repo this weekend when I have some time!

Hey @vkaelin am just going to close this issue, but if you do find any issue please feel free to re-open


About Regression-based Transformer Decoder

Hi,
Thank you for your work. This paper is very interested
I would like to know more about Regression-based Transformer Decoder. In Fingure 2 (Regression-based Transformer Decoder block), the input include ......

In case inference new dataset, how do we know about the new coordination x,y for polygons

Hi, during inference we first input the  token and predict the rest of the tokens including the polygon coordinates in an autoregressive way. Check out the animation on the project website for illustration https://polyformer.github.io/.

Hi,
you means the output of multi-modal transformer encoder is token ...... and the output of Regression-based Transformer Decoder is the rest of the tokens including the polygon coordinates

No the outputs of the Transformer encoder are feature embeddings of the input image and text. The inputs to the  Transformer decoder are the feature embeddings and all previously predicted tokens (mostly polygon coordinates).

Yeah, I got your point
Could I confirm for the Regression-based Transformer Decoder block,

first you init  then inference (x1,y1),
then (x1,y1) as an input for Regression-based Transformer Decoder block again -> the output is (x2,y2)
...
output at t, input at t-1

At step T, the input will be all previous predictions (t=0, ..., T-1)

Thank you so much for your explanation; it is a great idea!
By the way, is the process for the Regression-based Transformer Decoder the same in training and inference? And is the number of input tokens static, or is it flexible depending on each sample? Because the number object per image is not static.

No. In training, we input the whole sequence t = 0, .., T-1 and use t = 1, ..., T as the ground truth for computing the loss. The number of input tokens is flexible, but we have set a maximum length in our code.

Thank you so much! Great work

Hi @joellliu
At step T, the input will be all previous predictions (t=0, ..., T-1) is the process is the same in training and inference?
and also, if you object have more than one polygon, example you have 3 polygon. so the sequence token contain 3 polygon. so when we predict corner for the polygon 3rd, Does we use the first polygon token?


Checking, is binary tree symmetric or not

🚀 Feature
Problem with symmetric nature of binary tree.
Have you read the Contributing Guidelines on Pull Requests?
Yes
Motivation
As I'm a participant of GSSoC'21 and interested in Data Structures and algorithm
, I want to add this feature to the project.
Pitch
Sometimes, algorithm doesn't work because of symmetric nature of binary tree so I would like to add this feature in java with proper comments and documentation.
Please assign this to me.

@ishvik Hi, I assigned you. Happy Coding!😊

@ishvik Hi, I assigned you. Happy Coding!😊

Thank You😊

Hey, I am Kanchan Jeswani, a GSSOC'21 participant.
I am a Competitive Programmer and C++ enthusiastic.
I would love to solve this problem using CPP with well-explained code and along with its time and space complexity.
Please assign me this issue.
Hope to hear from you.
Discord username  kanchan19#3152
@ankitaggarwal23, please assign this to me, thank you!!

@kanchan1910 As someone is already working on C++ and Java. You can open a new issue with the same concept but with implementation in a different programming language. We will assign it to you then. Happy Coding!😊


Improve AsSelf code generation

When using AsSelf = true, it generates something like service.AddTransient<MyNamespace.MyClass,MyNamespace.MyClass>().
It would be nice if it could produce instead service.AddTransient<MyNamespace.MyClass>()

Does it make any difference?

For readability, I would say yes, otherwise, no.

I think it would better match with what a dev would have written by hand. But maybe I'm wrong.
I know it can be a subjective question.
I can do a PR if you want

While it is nice to have a readable generated source, it's probably not the main goal. There are lots of things which developer would've done differently - having namespaces usings instead of full type names, for instance.
At this point, I would prefer to keep the code simplier ver having this minor readability improvement.
Especially considering this item - #4 .
Still, thanks a lot for the suggestion and feedback!


IoT Core wrong topic on publish

https://github.com/GoogleCloudPlatform/cpp-docs-samples/tree/master/iot/mqtt-ciotc
The example that connects and publish data to the core, its publishing data to:
/devices/mqtt-c-rsq2/events instead, it should be: /devices/{device-id}/events. It looks like its using the hardcoded value under opts.topic.

Thanks for the heads up, I'll take a look while adding exponential backoff, maybe you're passing the --deviceid as the first parameter?

This is still broken as far as I can see. The example client now publishes to the hardcoded topic ""/devices/{your-device-id}/events"" as opts.topic is never changes from its initial string. Trying out the example results in an error notification on my registered device in the GCP stating:

mqtt: PUBLISH:Unauthorized MQTT publish topic: /devices/{your-device-id}/events, expects /devices/{device-id}/events

Looks like the only way to get it to publish to the correct topic is to manually modify the .topic = "/devices/{your-device-id}/events" string in the example code and rebuild.
The example code is referenced from documentation on page https://cloud.google.com/iot/docs/samples/mqtt-samples as the C example.

Thank your the update.  It looks like you did the right thing.
I did not write the sample, but I think the author actually intended for readers to modify the source code like you did.  Do you see a way to better communicate that to the reader?  Or perhaps, to not require the reader to modify the source code?

I looked at the instructions provided in https://github.com/GoogleCloudPlatform/cpp-docs-samples/blob/master/iot/mqtt-ciotc/README.md and from reading that I don't think the (current) intention is to modify the source code as you can/must provide the different options on the command line, --deviceid for example (bottom of README). The MQTT topic must be automatically assembled from the deviceid you supply as command option.
I made a fix in line with the existing code that could be used for inspiration (not sure if I can accept the corporate CLA without approvement, so cant create a pull request yet) here:
https://github.com/HMS-LIG/cpp-docs-samples/commit/1eb86de3003f129acf76ea0b06773efb3f042edf

It's been a while since I last looked at the code here but the intention originally had been to support command-line parameters for the sample once it had been built. I'm not sure I actually tested it very thoroughly and I recall fixing an off-by-one bug on the ordered parameters.

This should be fixed in:
https://github.com/GoogleCloudPlatform/cpp-docs-samples/pull/46


Unable to see all deck on small laptop screen

@simonbotte Can you send an screenshot?
Currently you can scroll to left and right

My bad, I thought that it would be an overflow and not a slider. Sorry

@simonbotte No problem. Feel free to report any inconvenience.


client: Remove all remaining wallet dependencies

Incomplete WIP, do not review yet.

Cancelling the autoclient effort. #403 removes this code.


Add GitHub issue templates

This adds a menu and forms for creating new issues. Just grabbed the Java templates and updated the link to the forum to show the kotlin issues instead.

This doesn't look like the latest one from Java? Did you use an older version? All dropdown options has to be exactly the same - character-by-charater.

Argh, yes. I copied it from the transformer-api branch but that is spun from the releases branch and not main as I recalled. I have updated it from the latest main version. Thanks.


Writer/Artist Credits Do Not Show in CBL Listview

From<EMAIL_ADDRESS>on December 03, 2012 00:11:42
What steps will reproduce the problem? 1. Tag a Comic
2. Import Into CBL
3. View Credits (Writer/Artist/etc must be selected as viewable in GUI) What is the expected output? What do you see instead? You see nothing... until you go in and edit one at a time. The tags are there, they just do not show until you do this. What version of the product are you using? On what operating system? CBL: Version 1.5 (1292)
MAC OSX 10.6.8 Please provide any additional information below.
Original issue: http://code.google.com/p/comictagger/issues/detail?id=1

From<EMAIL_ADDRESS>on December 03, 2012 13:24:22
I can't re-create this.

I save CBL tags to a previously un-tagged comic.
I drag it into CBL 1.5
Select "View Info", and click on "Credits" tab.
Everything is there

I am confused by what mean when you say "Writer/Artist/etc must be selected as viewable in GUI"  I don't see anything like this in CBL 1.5...  am I missing something?
In ComicTagger, you can chose to view the raw tags.  Do that before you import it to CBL, and after.. Maybe if you pasted that output here, I might see something suspicious...

From<EMAIL_ADDRESS>on December 03, 2012 19:13:16
Ok. Apologies for the defencies in my lexicon... You know when you are looking at all of your comics line by line (not the cover view)? Well in that view, you can select which columns you want displayed (series, title, volume, issue, etc). When Writer and Artist and the others are displayed, they do not show up, even though if you select any one issue after having tagged it in comictagger it clearly shows that those fields are filled up. Still confusing? Let me know what I can do to help clarify.

From<EMAIL_ADDRESS>on December 03, 2012 20:10:34
iirc from the time I played with CBL, it has "primary" : YES/NO option for each credit item. It will list "Artist" and "Writer" credits (case matters for these 2 credits) that have  "primary" option set to YES in the comic list (it appropriate columns are selected).
When there is no Artist provided in comicwine data, it does not hurt if you tag "Penciler" as "Artist" and mark it as primary.

From<EMAIL_ADDRESS>on December 03, 2012 22:08:51
Ah, I see now, Chris.  I never had CBL opened up wide enough to see Writer and Artist in the list view.
Sasha is correct.  CT, for the moment doesn't manipulate the "Primary" flags for the credits, though it does preserve them if they are set already in the CBI block.
I was (and am) hesitant to automatically set the primary flags, and I had been thinking about seeing what happens in CBL if I set more than one item as "primary".  Just been a low priority.
I understand the issue now, and will keep it open for now until we come up with the best solution.
Summary: Writer/Artist Credits Do Not Show in CBL Listview  <span class="oldvalue"> (was: Credits Do Not Show in CBL) </span>

From<EMAIL_ADDRESS>on December 04, 2012 06:40:38
Also, I tried to mark as Primary, and while it works with an individual file, it does not work when doing a batch of them in CBL. For instance, I have a series by Garth Ennis called 7 Brothers. If I select 7 Brothers #1 and set him as primary writer, it pops right up... but if I do it with the entire series, nothing.

From<EMAIL_ADDRESS>on December 04, 2012 06:41:38
I would like to see how CT works when it does manipulate the Primary  flags for the credits.

From<EMAIL_ADDRESS>on December 04, 2012 17:16:03
I've added editing of the primary flag to the UI and also added an option (off by default) that, when grabbing data from comicvine, to assume that a single credit Writer/Artist (or Penciler) credit is the primary.  If there are more than one of those credits, the flag won't get set.
Available in the next release
Status: Fixed


Improve readability of how to create component docs

Browsing the docs I found minor passages which could be improved.

Typos
Directory fix in example repository
Using code section in text for command_component()

#sign-off


Class-based transactions

This implements this #52
This still experimental, but before adding more code and more logic to the library I wanted to share @timriley the simplest example so we can discuss how to continue working on this.
All feedback is gratefully received 😄
Thanks

@timriley so far with this implementation we can replacement dependencies to make testing easier:
# Provide an explicit operation for step one
MyTransaction.new(one: different_operation)

But I think this approach is not going to help because one key feature would be been able to wrap existing steps. I was thinking maybe we could instead of creating the step within the macro to store them in some class level variables like step_info that store step type map, raw, tee and the name of the step, with that in place at initialization time we could dynamically generate the instance method with the step names, that way the user can wrap them.
Also since we want that the user can provide extra locals step, I was thinking of modifying the Transaction class to instead of getting steps and matcher it can get the instance of the class so we can create the steps checking for them in the container or in the class.
What do you think?

Hey @GustavoCaso, thanks for pushing this forward! I've spent some time this morning sketching out in code the kind of direction we probably wanna take this, but I feel I haven't got to a good spot either. You can see I've pushed up a branch here (https://github.com/dry-rb/dry-transaction/compare/class_base_transaction...class_based_transactions_timriley) - feel free to take a look and let me know if you have any thoughts so far. I feel I need to experiment just a tad more before I can summarise things nearly in words for you. Roughly, though:

I've made this work in a way where we don't require container objects as operations, since users can just provide local methods for some/all of their steps, if they want
I'm not happy with where the container object resolution is, though. I feel like including (or prepending?) an #initialize might be good, which is the only place we try and resolve stuff, and then we can pass them through to the standard initialise for storing those objects in local vars

Sorry I can't get back to you with anything better so far, let's just keep the conversation going.

@timriley I added the method for passing extra step arguments, and update all integration test to use new class base transaction.
Also, remove all not used code to make things easier while reviewing this PR.
When we are to place we are happy to push this change, I can start with the documentation both in the project and in the dry-rb.org website.

This is looking pretty good, now! Here's what I think we have left:

Merge all the stuff from spec/integration/class_based_spec.rb into spec/integration/transaction_spec.rb (since every transaction is class-based now, I don't see the need to have a special spec file for this)
Consider if we can bring back #prepend/#append/#insert/#remove. I have a feeling that some people will be using these, and if there's a way we can still support them, it'd be nice.

Once we've done all this, I might ping a few more people for review since this is a big change to how dry-transaction works.
I'll take a look at the TravisCI build stuff in a day or too, btw.

@GustavoCaso Made some more changes here. I decided that the append/prepend/insert stuff was too fraught with potential issues for us to keep it (especially when we're potentially mixing different transaction classes with their own different configurations/internal state/other private helper methods, etc.).

@GustavoCaso We did it! 🎉
Merging this now and will hopefully release tomorrow along with some updated docs over in https://github.com/dry-rb/dry-rb.org/pull/180.


Cannot import name 'Vocabulary'

I cannot make gnn-dep-parsing run. There is an issue with importing 'Vocabulary'...
antu and dynet are up to date, using python 3.6.6.
Please, help me solving this problem, so that I can use the parser...
jelinek@sag:~$ sudo -H pip3 install --upgrade antu
Requirement already up-to-date: antu in /usr/local/lib/python3.6/dist-packages
jelinek@sag:/usr/local/gnn-dep-parsing/gnn-dep-parser/src$ python3 train.py --config_file ../configs/pdt_mdita.cfg --name PDTMDITA --gpu 0
Traceback (most recent call last):
File "train.py", line 5, in
from antu.io import Vocabulary
ImportError: cannot import name 'Vocabulary'

You can change the code from antu.io import Vocabulary to from antu.io.vocabulary import Vocabulary.
But I still meet the trouble in 'from antu.nn.dynet.init import OrthogonalInitializer'. I read the source code of antu package but can't find a class or function named "OrthogonalInitializer"

Sorry for the late reply,
I was unable to access the code of antu v0.0.5 for 4 months due to the COVID-19.
I've rewritten some code that the gnn parser relies on, and updated antu v0.0.5a.
I also tested well in a new environment, everything is working now~


[IHyprWindowDecoration] Positioning info updates

Description
Hi, i think that window decorations should have a way to tell to the compositor that there is a change in positioning info to allow dynamic resizing of reserved area, sticky edges, etc.
I've looked up in the issues, opened and closed ones, and not found something similar.
I was playing with window methods, many functions, hacking the rendering pipeline, for the sake of triggering a call to IHyprWindowDecoration::getPositioningInfo() but it's only called on instance creation. The idea is to make responsive decorations.
I don't think in reloading plugins or reattaching decoration instances as a good solution. Maybe a call to HyprWindowDecoration::updateWindow() or other periodic method could return the new positioning info.

CDecorationPositioner::repositionDeco(IHyprWindowDecoration*)?

It works, thank you. Sorry for the issue. I was lost in the source code. That was a quick answer, wow.


add bulk email sender

an API for sending bulk emails using nodejs and express

@agungd3v  can you please add some descrtiption!

@all-contributors please add @agungd3v  for code

@agungd3v please star the repo!

@AhmedRaja1 I'm done adding description


#1688 vetext2 inbound forwarding

Description
Added handling of a new vetext route.  Environment variables and forwarding logic have been added in this ticket.
issue #1688
Type of change
Please check the relevant option(s).

[ ] Bug fix (non-breaking change which fixes an issue)
[x] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[ ] This change requires a documentation update
[ ] Documentation changes only

How Has This Been Tested?
How has this been tested? (e.g. Unit tests, Tested locally, Tested as a GitHub action, Depoyed to dev, etc)
Please provide relevant information and / or links to demonstrate the functionality or fix. (e.g. screenshots, link to deployment, regression test results, etc)

Unit tests
Regression in tests (I'm not sure this lambda is tested much in these)
Tested in stage

Checklist

[x] I have assigned myself to this PR
[x] PR has an appropriate title: #9999 - What the thing does
[x] PR has a detailed description, including links to specific documentation
[x] I have added the appropriate labels to the PR.
[x] I did not remove any parts of the template, such as checkboxes even if they are not used
[x] My code follows the style guidelines of this project
[x] I have performed a self-review of my own code
[x] I have commented my code, particularly in hard-to-understand areas
[ ] I have made corresponding changes to any documentation
[x] My changes generate no new warnings
[x] I have added tests that prove my fix is effective or that my feature works
[x] I have ensured the latest master is merged into my branch and all checks are green prior to review
[x] New and existing unit tests pass locally with my changes
[ ] Any dependent changes have been merged and published in downstream modules
[ ] The ticket is now moved into the DEV test column

This needs to be tested on staging prior to approval/merge (and for all possible paths since the code was updated). Please set this back to Draft and work your contact to get a staging test performed.

This needs to be tested on staging prior to approval/merge (and for all possible paths since the code was updated). Please set this back to Draft and work your contact to get a staging test performed.

This was tested successfully in staging.


Implemented PSR-6 cache. Fixes #52

#58 will fix the phpunit.xml.dist so you can remove it from this PR. The PSR-6 cache looks great! :rocket:

I guess I will have some merge conflicts once your #58 is merged.


1.18.2

This adds 1.18.2 support (sodium 0.4.1 support)

So far, it's throwing bugs, I'm temporarily closing

How tf do I download it?

Does this work or do I leave it?

Does this work or do I leave it?

Leave it, it still doesn't work even though I've updated the class names.

I dont know.

I think I found the issue

Do you have discord server?

IT ACTUALLY WORKS!, (BUT WITHOUT REESES SODIUM OPTIONS)

All you have to do is fix the support for the new version of Reeses sodium settings

This also fixes https://github.com/LimeShulkerBox/better-sodium-video-settings/issues/11

Im looking too https://github.com/FlashyReese/reeses-sodium-options/compare/mc1.18-1.2.3...mc1.18.2-1.4.2

Do you have discord server?

Yea I do, sorry for some reason I am not getting email notifications. Check the CurseForge page.
If you join the Discord we can talk about it together in there, my personal name and discriminator is: LimeShulkerBox#5322


Azure Pipelines を構成する

このパイプライン構成では、アプリケーションをビルドし、リリース構成のためのビルドを生成します。

From: microsoft-github-policy-service[bot] @.>
Sent: Thursday, December 29, 2022 9:55 AM
To: MicrosoftDocs/mslearn-tailspin-spacegame-web @.>
Cc: Taichi Uchiyama @.>; Mention @.>
Subject: [External] Re: [MicrosoftDocs/mslearn-tailspin-spacegame-web] Azure Pipelines を構成する (PR #6939)
You don't often get email from<EMAIL_ADDRESS>Learn why this is importanthttps://aka.ms/LearnAboutSenderIdentification
@avagit2022https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Favagit2022&data=05|01|taichi.uchiyama%40avanade.com|200dc9f6b0b442e2dec108dae9375db8|cf36141cddd745a7b073111f66d0b30c|0|0|638078721289679032|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=uAuXR4RLcP7zQKGTPIIGZxRzTCSG8mfLChyjLGrrCoI%3D&reserved=0 please read the following Contributor License Agreement(CLA). If you agree with the CLA, please reply with the following information.
@microsoft-github-policy-service agree [company="{your company}"]
Options:

(default - no company specified) I have sole ownership of intellectual property rights to my Submissions and I am not making Submissions in the course of work for my employer.
(when company given) I am making Submissions in the course of work for my employer (or my employer has intellectual property rights in my Submissions by contract or applicable law). I have permission from my employer to make Submissions and enter into this Agreement on behalf of my employer. By signing below, the defined term “You” includes me and my employer.
Contributor License Agreement
Contribution License Agreement

This Contribution License Agreement (“Agreement”) is agreed to by the party signing below (“You”),
and conveys certain license rights to Microsoft Corporation and its affiliates (“Microsoft”) for Your
contributions to Microsoft open source projects. This Agreement is effective as of the latest signature
date below.

Definitions.
“Code” means the computer software code, whether in human-readable or machine-executable form,
that is delivered by You to Microsoft under this Agreement.
“Project” means any of the projects owned or managed by Microsoft and offered under a license
approved by the Open Source Initiative (www.opensource.orghttps://nam11.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.opensource.org%2F&data=05|01|taichi.uchiyama%40avanade.com|200dc9f6b0b442e2dec108dae9375db8|cf36141cddd745a7b073111f66d0b30c|0|0|638078721289679032|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=ICcrcvapJUHzb5lkiQpEmvu3z%2B6cMM%2BISykk4OsC1xQ%3D&reserved=0).
“Submit” is the act of uploading, submitting, transmitting, or distributing code or other content to any
Project, including but not limited to communication on electronic mailing lists, source code control
systems, and issue tracking systems that are managed by, or on behalf of, the Project for the purpose of
discussing and improving that Project, but excluding communication that is conspicuously marked or
otherwise designated in writing by You as “Not a Submission.”
“Submission” means the Code and any other copyrightable material Submitted by You, including any
associated comments and documentation.
Your Submission. You must agree to the terms of this Agreement before making a Submission to any
Project. This Agreement covers any and all Submissions that You, now or in the future (except as
described in Section 4 below), Submit to any Project.
Originality of Work. You represent that each of Your Submissions is entirely Your original work.
Should You wish to Submit materials that are not Your original work, You may Submit them separately
to the Project if You (a) retain all copyright and license information that was in the materials as You
received them, (b) in the description accompanying Your Submission, include the phrase “Submission
containing materials of a third party:” followed by the names of the third party and any licenses or other
restrictions of which You are aware, and (c) follow any other instructions in the Project’s written
guidelines concerning Submissions.
Your Employer. References to “employer” in this Agreement include Your employer or anyone else
for whom You are acting in making Your Submission, e.g. as a contractor, vendor, or agent. If Your
Submission is made in the course of Your work for an employer or Your employer has intellectual
property rights in Your Submission by contract or applicable law, You must secure permission from Your
employer to make the Submission before signing this Agreement. In that case, the term “You” in this
Agreement will refer to You and the employer collectively. If You change employers in the future and
desire to Submit additional Submissions for the new employer, then You agree to sign a new Agreement
and secure permission from the new employer before Submitting those Submissions.
Licenses.

Copyright License. You grant Microsoft, and those who receive the Submission directly or
indirectly from Microsoft, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license in the
Submission to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute
the Submission and such derivative works, and to sublicense any or all of the foregoing rights to third
parties.
Patent License. You grant Microsoft, and those who receive the Submission directly or
indirectly from Microsoft, a perpetual, worldwide, non-exclusive, royalty-free, irrevocable license under
Your patent claims that are necessarily infringed by the Submission or the combination of the
Submission with the Project to which it was Submitted to make, have made, use, offer to sell, sell and
import or otherwise dispose of the Submission alone or with the Project.
Other Rights Reserved. Each party reserves all rights not expressly granted in this Agreement.
No additional licenses or rights whatsoever (including, without limitation, any implied licenses) are
granted by implication, exhaustion, estoppel or otherwise.

Representations and Warranties. You represent that You are legally entitled to grant the above
licenses. You represent that each of Your Submissions is entirely Your original work (except as You may
have disclosed under Section 3). You represent that You have secured permission from Your employer to
make the Submission in cases where Your Submission is made in the course of Your work for Your
employer or Your employer has intellectual property rights in Your Submission by contract or applicable
law. If You are signing this Agreement on behalf of Your employer, You represent and warrant that You
have the necessary authority to bind the listed employer to the obligations contained in this Agreement.
You are not expected to provide support for Your Submission, unless You choose to do so. UNLESS
REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, AND EXCEPT FOR THE WARRANTIES
EXPRESSLY STATED IN SECTIONS 3, 4, AND 6, THE SUBMISSION PROVIDED UNDER THIS AGREEMENT IS
PROVIDED WITHOUT WARRANTY OF ANY KIND, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY OF
NONINFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
Notice to Microsoft. You agree to notify Microsoft in writing of any facts or circumstances of which
You later become aware that would make Your representations in this Agreement inaccurate in any
respect.
Information about Submissions. You agree that contributions to Projects and information about
contributions may be maintained indefinitely and disclosed publicly, including Your name and other
information that You submit with Your Submission.
Governing Law/Jurisdiction. This Agreement is governed by the laws of the State of Washington, and
the parties consent to exclusive jurisdiction and venue in the federal courts sitting in King County,
Washington, unless no federal subject matter jurisdiction exists, in which case the parties consent to
exclusive jurisdiction and venue in the Superior Court of King County, Washington. The parties waive all
defenses of lack of personal jurisdiction and forum non-conveniens.
Entire Agreement/Assignment. This Agreement is the entire agreement between the parties, and
supersedes any and all prior agreements, understandings or communications, written or oral, between
the parties relating to the subject matter hereof. This Agreement may be assigned by Microsoft.

Reply to this email directly, view it on GitHubhttps://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FMicrosoftDocs%2Fmslearn-tailspin-spacegame-web%2Fpull%2F6939%23issuecomment-1367005244&data=05|01|taichi.uchiyama%40avanade.com|200dc9f6b0b442e2dec108dae9375db8|cf36141cddd745a7b073111f66d0b30c|0|0|638078721289679032|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=V347I7f3OISh62deSfoBPOzvS7HQyNqd3Uf9pWJ%2FeP8%3D&reserved=0, or unsubscribehttps://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FA47I53DBIGXF5YTYDJHTXU3WPTOPVANCNFSM6AAAAAATLVR5FI&data=05|01|taichi.uchiyama%40avanade.com|200dc9f6b0b442e2dec108dae9375db8|cf36141cddd745a7b073111f66d0b30c|0|0|638078721289679032|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=dQOURs%2BURP1Hw3HlFMJIE4vTFcTnKNQ2U4llg3tS%2Bvs%3D&reserved=0.
You are receiving this because you were mentioned.Message ID<EMAIL_ADDRESS>


Replace samples with kustomize examples

Depends-On: https://github.com/openstack-k8s-operators/install_yamls/pull/743

/test all

/test all

/test all

I like the direction. Instead of examples/base/openstackdataplanenodeset.yaml, can just make that use config/samples/dataplane_v1beta1_openstackdataplanenodeset.yaml?

there is some customize logic for building the bundle, so I can't use config/samples/dataplane_v1beta1_openstackdataplanenodeset.yaml, what I can do is copy its content to examples/base/openstackdataplanenodeset.yaml

recheck

recheck

recheck

recheck

recheck

/test all

/retest-required

recheck

recheck

/test dataplane-operator-build-deploy-kuttl

recheck

I think documentation should be part of this PR. They target the same repo and make sense only together.
Plus if anything changes here you'll have to remember to make changes there.

I don't want to make this PR bigger, I'll keep the other PR on hold until we merge this one

recheck

LGTM, +2 How do we intend to merge this? Just merge this PR and the install_yamls PR as close together as possible?

I'll drop the breaking change on this PR, so it will be easier to coordinate with install_yamls

recheck

recheck
https://github.com/openstack-k8s-operators/install_yamls/pull/752

I kept the samples that were needed on CI, the other samples is more for development and I believe it won't take long for https://github.com/openstack-k8s-operators/install_yamls/pull/743 to get merged


view folder update

Changed the view folder's path.

The path is already correct - it should reference the package's local views, and the second parameter specifies a name that Laravel will use to look up any corresponding views in resources/views/vendor/{name}.
It works in the same way as the loadTranslationsFrom() call below it.


cabana: supports switching streams on the fly

Currently, you can only switch between streams or routes by restarting cabana. This PR adds a dynamic switching feature, so you no longer need to restart and can open a new route/stream at any time.

Would be nice if you could also switch to no stream at all (go offline). E.g. in case when you're connected to the panda, but want to temporarily use the panda with a different program/script.

Yes, this feature can be implemented in future PR


[BUG] A replica may be incorrectly scheduled to a node with an existing failed replica

Describe the bug
Harvester QA hit a complete lockup of Longhorn after a hard node reboot in a single node cluster. Before the reboot:

They had four VMs, each with a single Longhorn volume.
Each Longhorn volume had numReplicas == 3, so all volumes were degraded.
Each Longhorn volume had one scheduled and two unscheduled replicas (as expected).

After the reboot:

The Longhorn volumes were in need of auto-salvage (as expected).
Longhorn unexpectedly scheduled an extra replica for each volume to the node. By itself, this wouldn't have been particularly problematic. However,
The disk was not large enough to accommodate the extra scheduled replicas.
The disk transitioned to unschedulable, halting auto-salvage indefinitely.

To Reproduce
Observe the root cause

Install Longhorn in a single node cluster or shut down all but one node.
Create a deployment that requests a block volume with size << 50% of a node's storageMaximum. (I'm not sure block volume and deployment are important here, but they mimic the original context). The volume is degraded and two replicas aren't scheduled.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-block-vol
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: block-volume-test
  labels:
    app: block-volume-test
  namespace: default
spec:
  selector:
    matchLabels:
      app: block-volume-test
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: block-volume-test
    spec:
      restartPolicy: Always
      containers:
      - image: nginx:stable-alpine
        name: block-volume-test
        volumeDevices:
        - devicePath: /dev/longhorn/testblk
          name: block-vol
      volumes:
      - name: block-vol
        persistentVolumeClaim:
          claimName: longhorn-block-vol

eweber@laptop:~/longhorn> kl get volume
NAME                                       DATA ENGINE   STATE      ROBUSTNESS   SCHEDULED   SIZE          NODE                                AGE
pvc-976c97f1-8515-44e5-820e-0ea9fb9bbcbc   v1            attached   degraded<PHONE_NUMBER>0   eweber-v126-worker-9c1451b4-kgxdq   77s
eweber@laptop:~/longhorn> kl get replica
NAME                                                  DATA ENGINE   STATE     NODE                                DISK                                   INSTANCEMANAGER                                     IMAGE                                    AGE
pvc-976c97f1-8515-44e5-820e-0ea9fb9bbcbc-r-4f8ed9ed   v1            stopped                                                                                78s
pvc-976c97f1-8515-44e5-820e-0ea9fb9bbcbc-r-62ad5f16   v1            stopped                                                                                78s
pvc-976c97f1-8515-44e5-820e-0ea9fb9bbcbc-r-ec37e84e   v1            running   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f   instance-manager-699da83c0e9d22726e667344227e096b   longhornio/longhorn-engine:master-head   78s

Forcefully reboot the node like reboot -f.
Watch the replicas while the node reboots. Eventually a second replica is scheduled to the node. This is the cause of the lockup in the original context, but since there is still enough  space on the disk, the volume is able to attach.

eweber@laptop:~/longhorn> kl get replica
NAME                                                  DATA ENGINE   STATE     NODE                                DISK                                   INSTANCEMANAGER                                     IMAGE                                    AGE
pvc-17b2c324-cf5e-47dd-9d3c-25e305e8b987-r-7abdc0bd   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                                                                                2m57s
pvc-17b2c324-cf5e-47dd-9d3c-25e305e8b987-r-dbb7f749   v1            running   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f   instance-manager-699da83c0e9d22726e667344227e096b   longhornio/longhorn-engine:master-head   2m57s

Cause a lockup
This is more complicated than I originally supposed. We need to create a situation in which the node becomes overscheduled. This cannot be done with a single volume with size > 50% of a node's storageMaximum, or even a volume with close to, but < 50% of a node's storageMaximum because the replica scheduler can easily recognize that a second replica will not fit.  Instead, we need to ensure there are multiple volumes that, in aggregate, cause the node to be overscheduled (as was the cause of the lockup in the original context). It appears to be a bit racy as well. I reproduced 1/4 times with four volumes and never with only two volumes.

Install Longhorn in a single node cluster or shut down all but one node.
Create multiple deployments that each request a block volume such that the aggregate size > 50% of a node's storageAvailable. (I'm not sure block volume and deployment are important here, but they mimic the original context).
Watch the replicas while the node reboots. Eventually a second replica for many volumes is scheduled to the node. The associated disk becomes unschedulable. Logs indicate autosalvage is not progressing.

eweber@laptop:~/longhorn> kl get replica
NAME                                                  DATA ENGINE   STATE     NODE                                DISK                                   INSTANCEMANAGER   IMAGE   AGE
pvc-2d618ff3-5163-458b-a218-e865404dc335-r-62256e66   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m53s
pvc-2d618ff3-5163-458b-a218-e865404dc335-r-fc96c900   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m53s
pvc-a4644689-d986-4170-9560-0c748b699fc8-r-95ef0584   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m53s
pvc-a4644689-d986-4170-9560-0c748b699fc8-r-d3c22a86   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m53s
pvc-db68a1e4-f124-4418-91db-a6c783fa99e8-r-255993bc   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m53s
pvc-fa5e794f-be5a-4c2f-984f-7faf63ac81eb-r-89972ea1   v1            stopped   eweber-v126-worker-9c1451b4-kgxdq   5680b199-91bd-452e-bbb6-4eeee965bf2f                             5m54s

eweber@laptop:~/longhorn> kl get lhn -oyaml
...
    diskStatus:
      default-disk-fd7aeb2fd64320f8:
        conditions:
        - lastProbeTime: ""
          lastTransitionTime: "2024-02-23T19:33:20Z"
          message: Disk default-disk-fd7aeb2fd64320f8(/var/lib/longhorn/) on node
            eweber-v126-worker-9c1451b4-kgxdq is ready
          reason: ""
          status: "True"
          type: Ready
        - lastProbeTime: ""
          lastTransitionTime: "2024-02-27T20:50:29Z"
          message: Disk default-disk-fd7aeb2fd64320f8 (/var/lib/longhorn/) on the
            node eweber-v126-worker-9c1451b4-kgxdq has<PHONE_NUMBER>00 available, but
            requires reserved<PHONE_NUMBER>4, minimal 25% to schedule more replicas
          reason: DiskPressure
          status: "False"
          type: Schedulable
        diskType: filesystem
        diskUUID: 5680b199-91bd-452e-bbb6-4eeee965bf2f
        filesystemType: ext2/ext3
        scheduledReplica:
          pvc-2d618ff3-5163-458b-a218-e865404dc335-r-62256e66:<PHONE_NUMBER>0
          pvc-2d618ff3-5163-458b-a218-e865404dc335-r-fc96c900:<PHONE_NUMBER>0
          pvc-a4644689-d986-4170-9560-0c748b699fc8-r-95ef0584:<PHONE_NUMBER>0
          pvc-a4644689-d986-4170-9560-0c748b699fc8-r-d3c22a86:<PHONE_NUMBER>0
          pvc-db68a1e4-f124-4418-91db-a6c783fa99e8-r-255993bc:<PHONE_NUMBER>0
          pvc-fa5e794f-be5a-4c2f-984f-7faf63ac81eb-r-89972ea1:<PHONE_NUMBER>0
        storageAvailable:<PHONE_NUMBER>00
        storageMaximum:<PHONE_NUMBER>80
        storageScheduled:<PHONE_NUMBER>80

eweber@laptop:~/longhorn> kl logs --tail=-1 longhorn-manager-qxrpc
time="2024-02-27T20:59:17Z" level=info msg="All replicas are failed, auto-salvaging volume" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1366" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-2d618ff3-5163-458b-a218-e865404dc335
time="2024-02-27T20:59:17Z" level=info msg="Bringing up replicas for auto-salvage" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1416" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-2d618ff3-5163-458b-a218-e865404dc335
time="2024-02-27T20:59:17Z" level=info msg="All replicas are failed, set engine salvageRequested to true" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1361" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-db68a1e4-f124-4418-91db-a6c783fa99e8
time="2024-02-27T20:59:17Z" level=info msg="All replicas are failed, auto-salvaging volume" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1366" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-db68a1e4-f124-4418-91db-a6c783fa99e8
time="2024-02-27T20:59:17Z" level=info msg="All replicas are failed, set engine salvageRequested to true" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1361" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-fa5e794f-be5a-4c2f-984f-7faf63ac81eb
time="2024-02-27T20:59:17Z" level=info msg="All replicas are failed, auto-salvaging volume" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1366" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-fa5e794f-be5a-4c2f-984f-7faf63ac81eb
time="2024-02-27T20:59:17Z" level=info msg="Bringing up replicas for auto-salvage" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1416" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-fa5e794f-be5a-4c2f-984f-7faf63ac81eb
time="2024-02-27T20:59:17Z" level=info msg="Bringing up replicas for auto-salvage" func="controller.(*VolumeController).ReconcileVolumeState" file="volume_controller.go:1416" accessMode=rwo controller=longhorn-volume frontend=blockdev migratable=false node=eweber-v126-worker-9c1451b4-kgxdq owner=eweber-v126-worker-9c1451b4-kgxdq state=detached volume=pvc-db68a1e4-f124-4418-91db-a6c783fa99e8

Expected behavior
Because replicaSoftAntiAffinity == false in the cluster, Longhorn should not have scheduled and additional replica for each volume. If an extra replica was truly desired for some reason, the user should have had to:

Set replicaSoftAntiAffinity == true, or
Evict the failed replica.

Targeting two potential fixes:

Change https://github.com/longhorn/longhorn-manager/blob/edf23eddc3b6c307031eaa770c3d312c963f25a5/scheduler/replica_scheduler.go#L863 so a node containing a failed volume is still considered to be used by the scheduler.
Check why https://github.com/longhorn/longhorn-manager/blob/edf23eddc3b6c307031eaa770c3d312c963f25a5/scheduler/replica_scheduler.go#L54-L58 didn't prevent scheduling. Generally all replicas (even unused ones) are marked failed when an engine crashes.

Support bundle for troubleshooting
https://github.com/harvester/harvester/files/14390529/supportbundle_e5003761-8a04-41c3-8cbf-88a8c0e19116_2024-02-23T21-55-41Z.zip
Environment

Longhorn version:

Observed in v1.6.0.
Definitely affects master as well.
Probably affects older versions, but scheduling logic was refactored in https://github.com/longhorn/longhorn-manager/pull/2094, so need to verify.

Additional context
See https://github.com/harvester/harvester/issues/5109#issuecomment-1962064949 for the original context.

[ ] Check if v1.5.x is vulnerable.

In the Harvester cluster, the workaround was to delete enough of the incorrectly scheduled replicas (HealthyAt = "") to get the disk schedulable again. The cluster completely self-healed after that.

@ejweber Does this mean for 3 node-cluster, the issue won't happen? (Say if a 3-node cluster has power outage and power on again at the same time).

@ejweber Does this mean for 3 node-cluster, the issue won't happen? (Say if a 3-node cluster has power outage and power on again at the same time).

@bk201, I think you are mostly correct. In a three node cluster, all replicas should already be scheduled to some node, so the power outage should not result in any unexpected scheduling. If the outage is long enough, we may clean up some of the existing replicas and create new ones. From a brief review of the code, I don't think that is a path to hitting this issue, but I'm not sure I can rule it out. If it is a path, I think it will be much rarer.

[ ]  Check if v1.5.x is vulnerable.

@ejweber Added backport/1.5.5 first. If it's not required to backport after check, just remove the label.

Verified pass on longhorn master(longhorn-manager 9bdd9c)
Following test steps, did not encounter problem and there is no extra replica scheduled on the only one node in the cluster.


Challenge fail using jQuery selector with single quotes

Challenge http://www.freecodecamp.com/challenges/waypoint-bring-your-javascript-slot-machine-to-life has an issue.
The second condition for this challenge:

You should have used the the selector given in the description to select each slot and assign it the value of slotOne, slotTwo and slotThree respectively

The selector in the description:

$($(".slot")[0]).html(slotOne);

The condition passes when you use double quotes in the selector per the description:
$($(".slot")[0]).html(slotOne);
$($(".slot")[1]).html(slotTwo);
$($(".slot")[2]).html(slotThree);
It fails with single quotes:
$($('.slot')[0]).html(slotOne);
$($('.slot')[1]).html(slotTwo);
$($('.slot')[2]).html(slotThree);
Maybe we are trying to conform to the jQuery JavaScript Style Guide? Still, both seem to be valid JavaScript. Indeed, the challenge immediately following this one uses single quotes for the selector in the description and passes with either single or double quotes.

Waypoint: Give your JavaScript Slot Machine some stylish images
$($('.slot')[0]).html('<img src = "' + images[slotOne-1] + '">');

Hey @matthew02 thanks for posting this!
There are a few duplicate issues here but yours looks like it is the most detailed so I'll leave it as the main one.
The fix will have to be similar to the fix that closed #2364.

Closing this issue as https://github.com/FreeCodeCamp/FreeCodeCamp/pull/3125 is merged.