upbound / up

The @upbound CLI
Apache License 2.0
49 stars 42 forks source link

Up ctx - concurrent map write during navigation #565

Open turkenh opened 3 weeks ago

turkenh commented 3 weeks ago

What happened?

Below happened 3 out of 5 tries. It feels like something temporary.

❯ up ctx
⠋ Upbound

 [organization] Crossplane
 [organization] Crossplane Contrib
 [organization] Upbound Dev
 [organization] Upbound Inc
 [organization] Upbound Release Candidates
 [organization] xp

                Disconnected Spaces

fatal error: concurrent map writesc/ctrl+c exit

goroutine 195 [running]:
github.com/upbound/up/internal/spaces.(*ingressCache).Get(_, {_, _}, {{{0x0, 0x0}, {0x0, 0x0}}, {{0x140013141e0, 0x15}, {0x0, ...}, ...}, ...})
    github.com/upbound/up/internal/spaces/ingress.go:104 +0x414
github.com/upbound/up/cmd/up/ctx.(*Organization).Items.func1()
    github.com/upbound/up/cmd/up/ctx/navigation.go:318 +0x42c
created by github.com/upbound/up/cmd/up/ctx.(*Organization).Items in goroutine 163
    github.com/upbound/up/cmd/up/ctx/navigation.go:297 +0x270

goroutine 1 [select]:
github.com/charmbracelet/bubbletea.(*Program).eventLoop(0x14001187d40, {0x103cd2418?, 0x14001243908?}, 0x14000119800)
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:314 +0xa4
github.com/charmbracelet/bubbletea.(*Program).Run(0x14001187d40)
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:543 +0x6c8
github.com/upbound/up/cmd/up/ctx.(*Cmd).RunInteractive(0x103ce4430?, {0x103ce4430?, 0x1059a21c0?}, 0x140008a1b80, 0x103ca89d0?, 0x105c84108?, {0x103cc6188?, 0x14000e03c80?})
    github.com/upbound/up/cmd/up/ctx/cmd.go:362 +0x26c
github.com/upbound/up/cmd/up/ctx.(*Cmd).Run(0x1400069e1d0, {0x103ce4430, 0x1059a21c0}, 0x140008a1b80, 0x14000e49d40)
    github.com/upbound/up/cmd/up/ctx/cmd.go:135 +0x348
reflect.Value.call({0x1039570a0?, 0x1400069e1d0?, 0x1400118f908?}, {0x1028da1d2, 0x4}, {0x14000e03020, 0x3, 0x100598ba8?})
    reflect/value.go:596 +0x970
reflect.Value.Call({0x1039570a0?, 0x1400069e1d0?, 0x1400118fa08?}, {0x14000e03020?, 0x103ca14e0?, 0x1003dbde0?})
    reflect/value.go:380 +0x94
github.com/alecthomas/kong.callFunction({0x1039570a0?, 0x1400069e1d0?, 0x18?}, 0x14000e99590)
    github.com/alecthomas/kong@v0.8.0/callbacks.go:98 +0x390
github.com/alecthomas/kong.callMethod({0x1028d847c, 0x3}, {0x103a5c220?, 0x1400069e1d0?, 0x3?}, {0x1039570a0?, 0x1400069e1d0?, 0x14000bb93b0?}, 0x1038b76c0?)
    github.com/alecthomas/kong@v0.8.0/callbacks.go:132 +0x54
github.com/alecthomas/kong.(*Context).RunNode(0x140008a1b80, 0x140010ea4b0, {0x0, 0x0, 0x103d11e40?})
    github.com/alecthomas/kong@v0.8.0/context.go:762 +0x64c
github.com/alecthomas/kong.(*Context).Run(0x14000e01650?, {0x0?, 0x1059a21c0?, 0x103542620?})
    github.com/alecthomas/kong@v0.8.0/context.go:787 +0x138
main.main()
    github.com/upbound/up/cmd/up/main.go:176 +0x3f0

goroutine 24 [select]:
go.opencensus.io/stats/view.(*worker).start(0x1400043d100)
    go.opencensus.io@v0.24.0/stats/view/worker.go:292 +0x88
created by go.opencensus.io/stats/view.init.0 in goroutine 1
    go.opencensus.io@v0.24.0/stats/view/worker.go:34 +0x98

goroutine 98 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2e318, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x1400091ff00?, 0x14001148000?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x1400091ff00, {0x14001148000, 0x2000, 0x2000})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x1400091ff00, {0x14001148000?, 0x10cc8d0b8?, 0x140013860c0?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000afe018, {0x14001148000?, 0x140010d78d8?, 0x1003dc22c?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x140013860c0, {0x14001148000?, 0x0?, 0x140013860c0?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x14000d322b0, {0x103cb7680, 0x140013860c0})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x14000d32008, {0x10ccbd880, 0x14000afe018}, 0x140010d79b0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x14000d32008, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x14000d32008, {0x1400055b000, 0x1000, 0x10093632c?})
    crypto/tls/conn.go:1370 +0x168
bufio.(*Reader).Read(0x14001238180, {0x140003fa820, 0x9, 0x1058afdc0?})
    bufio/bufio.go:241 +0x1b4
io.ReadAtLeast({0x103cb6f20, 0x14001238180}, {0x140003fa820, 0x9, 0x9}, 0x9)
    io/io.go:335 +0xa0
io.ReadFull(...)
    io/io.go:354
golang.org/x/net/http2.readFrameHeader({0x140003fa820, 0x9, 0x580008?}, {0x103cb6f20?, 0x14001238180?})
    golang.org/x/net@v0.21.0/http2/frame.go:237 +0x58
golang.org/x/net/http2.(*Framer).ReadFrame(0x140003fa7e0)
    golang.org/x/net@v0.21.0/http2/frame.go:498 +0x78
golang.org/x/net/http2.(*clientConnReadLoop).run(0x140010d7f98)
    golang.org/x/net@v0.21.0/http2/transport.go:2275 +0xf8
golang.org/x/net/http2.(*ClientConn).readLoop(0x14000bf6480)
    golang.org/x/net@v0.21.0/http2/transport.go:2170 +0x5c
created by golang.org/x/net/http2.(*Transport).newClientConn in goroutine 97
    golang.org/x/net@v0.21.0/http2/transport.go:821 +0xa84

goroutine 69 [syscall]:
os/signal.signal_recv()
    runtime/sigqueue.go:149 +0x2c
os/signal.loop()
    os/signal/signal_unix.go:23 +0x1c
created by os/signal.Notify.func1.1 in goroutine 101
    os/signal/signal.go:151 +0x28

goroutine 101 [select]:
github.com/charmbracelet/bubbletea.(*Program).handleSignals.func1()
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:237 +0x100
created by github.com/charmbracelet/bubbletea.(*Program).handleSignals in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:228 +0x80

goroutine 102 [select]:
github.com/charmbracelet/bubbletea.(*standardRenderer).listen(0x1400123a0b0)
    github.com/charmbracelet/bubbletea@v0.25.0/standard_renderer.go:133 +0x64
created by github.com/charmbracelet/bubbletea.(*standardRenderer).start in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/standard_renderer.go:92 +0xb8

goroutine 103 [syscall]:
syscall.syscall6(0x14001212ca8?, 0x1003d40d8?, 0x14001212eb0?, 0x2?, 0x14001212ca8?, 0x14001212e54?, 0x14001212ca8?)
    runtime/sys_darwin.go:45 +0x68
golang.org/x/sys/unix.kevent(0x140000021c0?, 0x1003d41b0?, 0x140000021c0?, 0x3?, 0x14001212e08?, 0x101b8390c?)
    golang.org/x/sys@v0.17.0/unix/zsyscall_darwin_arm64.go:275 +0x54
golang.org/x/sys/unix.Kevent(0x14001212d68?, {0x1400123f908?, 0x2?, 0x0?}, {0x14001212d78?, 0x14000114080?, 0x14001212d68?}, 0x101b80610?)
    golang.org/x/sys@v0.17.0/unix/syscall_bsd.go:397 +0x40
github.com/muesli/cancelreader.(*kqueueCancelReader).wait(0x1400123f8c0)
    github.com/muesli/cancelreader@v0.2.2/cancelreader_bsd.go:125 +0x58
github.com/muesli/cancelreader.(*kqueueCancelReader).Read(0x1400123f8c0, {0x14001225100, 0x100, 0x100})
    github.com/muesli/cancelreader@v0.2.2/cancelreader_bsd.go:69 +0x44
github.com/charmbracelet/bubbletea.readInputs({0x103ce44a0, 0x14000319450}, 0x140001197a0, {0x10ccbdc98, 0x1400123f8c0})
    github.com/charmbracelet/bubbletea@v0.25.0/key.go:550 +0x88
github.com/charmbracelet/bubbletea.(*Program).readLoop(0x14001187d40)
    github.com/charmbracelet/bubbletea@v0.25.0/tty.go:76 +0x90
created by github.com/charmbracelet/bubbletea.(*Program).initCancelReader in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/tty.go:67 +0x110

goroutine 105 [select]:
github.com/charmbracelet/bubbletea.(*Program).listenForResize(0x14001187d40, 0x14000119da0)
    github.com/charmbracelet/bubbletea@v0.25.0/signals_unix.go:25 +0xf0
created by github.com/charmbracelet/bubbletea.(*Program).handleResize in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:262 +0x180

goroutine 106 [select]:
github.com/charmbracelet/bubbletea.(*Program).handleCommands.func1()
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:279 +0xb0
created by github.com/charmbracelet/bubbletea.(*Program).handleCommands in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:275 +0x94

goroutine 163 [semacquire]:
sync.runtime_Semacquire(0x14000db2701?)
    runtime/sema.go:62 +0x2c
sync.(*WaitGroup).Wait(0x14001161460)
    sync/waitgroup.go:116 +0x74
github.com/upbound/up/cmd/up/ctx.(*Organization).Items(0x140011f3a50, {0x103ce4430, 0x1059a21c0}, 0x14000e49d40, 0x140010ca320)
    github.com/upbound/up/cmd/up/ctx/navigation.go:356 +0x3ac
github.com/upbound/up/cmd/up/ctx.model.Update.model.updateListState.func1()
    github.com/upbound/up/cmd/up/ctx/list.go:282 +0x1d8
github.com/charmbracelet/bubbletea.(*Program).eventLoop.func1()
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:381 +0x5c
created by github.com/charmbracelet/bubbletea.(*Program).eventLoop in goroutine 1
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:374 +0x188

goroutine 77 [select]:
net/http.(*persistConn).writeLoop(0x1400154c120)
    net/http/transport.go:2444 +0xa0
created by net/http.(*Transport).dialConn in goroutine 126
    net/http/transport.go:1800 +0x1060

goroutine 76 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2de40, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x1400023a700?, 0x14000a6a000?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x1400023a700, {0x14000a6a000, 0x1500, 0x1500})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x1400023a700, {0x14000a6a000?, 0x10cc8d0b8?, 0x14001386060?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000bbc018, {0x14000a6a000?, 0x140012178f8?, 0x1003dc22c?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x14001386060, {0x14000a6a000?, 0x0?, 0x14001386060?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x1400075a630, {0x103cb7680, 0x14001386060})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x1400075a388, {0x10ccbd880, 0x14000bbc018}, 0x140012179d0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x1400075a388, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x1400075a388, {0x1400148f000, 0x1000, 0x1003d3a58?})
    crypto/tls/conn.go:1370 +0x168
net/http.(*persistConn).Read(0x1400154c120, {0x1400148f000?, 0x1003d4010?, 0x140012c4480?})
    net/http/transport.go:1977 +0x50
bufio.(*Reader).fill(0x14001380720)
    bufio/bufio.go:110 +0xf8
bufio.(*Reader).Peek(0x14001380720, 0x1)
    bufio/bufio.go:148 +0x60
net/http.(*persistConn).readLoop(0x1400154c120)
    net/http/transport.go:2141 +0x158
created by net/http.(*Transport).dialConn in goroutine 126
    net/http/transport.go:1799 +0x1018

goroutine 115 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2e030, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x14000a5ce80?, 0x14001448000?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x14000a5ce80, {0x14001448000, 0x700, 0x700})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x14000a5ce80, {0x14001448000?, 0x10cbe5338?, 0x140012273e0?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000aa8070, {0x14001448000?, 0x140007128d8?, 0x1003dc22c?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x140012273e0, {0x14001448000?, 0x0?, 0x140012273e0?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x1400075a2b0, {0x103cb7680, 0x140012273e0})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x1400075a008, {0x10ccbd880, 0x14000aa8070}, 0x140007129b0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x1400075a008, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x1400075a008, {0x14001461000, 0x1000, 0x10093632c?})
    crypto/tls/conn.go:1370 +0x168
bufio.(*Reader).Read(0x140012019e0, {0x1400144c200, 0x9, 0x1058afdc0?})
    bufio/bufio.go:241 +0x1b4
io.ReadAtLeast({0x103cb6f20, 0x140012019e0}, {0x1400144c200, 0x9, 0x9}, 0x9)
    io/io.go:335 +0xa0
io.ReadFull(...)
    io/io.go:354
golang.org/x/net/http2.readFrameHeader({0x1400144c200, 0x9, 0x580008?}, {0x103cb6f20?, 0x140012019e0?})
    golang.org/x/net@v0.21.0/http2/frame.go:237 +0x58
golang.org/x/net/http2.(*Framer).ReadFrame(0x1400144c1c0)
    golang.org/x/net@v0.21.0/http2/frame.go:498 +0x78
golang.org/x/net/http2.(*clientConnReadLoop).run(0x14000712f98)
    golang.org/x/net@v0.21.0/http2/transport.go:2275 +0xf8
golang.org/x/net/http2.(*ClientConn).readLoop(0x140012f0180)
    golang.org/x/net@v0.21.0/http2/transport.go:2170 +0x5c
created by golang.org/x/net/http2.(*Transport).newClientConn in goroutine 114
    golang.org/x/net@v0.21.0/http2/transport.go:821 +0xa84

goroutine 90 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2df38, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x14000310e00?, 0x14001480000?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x14000310e00, {0x14001480000, 0x800, 0x800})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x14000310e00, {0x14001480000?, 0x14001310ac0?, 0x2?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000140b08, {0x14001480000?, 0x14000713848?, 0x1003db8b8?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x140012deac8, {0x14001480000?, 0x0?, 0x140012deac8?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x14001466630, {0x103cb7680, 0x140012deac8})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x14001466388, {0x10cb6ba88, 0x140012de990}, 0x140007139b0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x14001466388, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x14001466388, {0x1400148e000, 0x1000, 0x10093632c?})
    crypto/tls/conn.go:1370 +0x168
bufio.(*Reader).Read(0x14001305c80, {0x140013462e0, 0x9, 0x1058afdc0?})
    bufio/bufio.go:241 +0x1b4
io.ReadAtLeast({0x103cb6f20, 0x14001305c80}, {0x140013462e0, 0x9, 0x9}, 0x9)
    io/io.go:335 +0xa0
io.ReadFull(...)
    io/io.go:354
golang.org/x/net/http2.readFrameHeader({0x140013462e0, 0x9, 0xea0008?}, {0x103cb6f20?, 0x14001305c80?})
    golang.org/x/net@v0.21.0/http2/frame.go:237 +0x58
golang.org/x/net/http2.(*Framer).ReadFrame(0x140013462a0)
    golang.org/x/net@v0.21.0/http2/frame.go:498 +0x78
golang.org/x/net/http2.(*clientConnReadLoop).run(0x14000713f98)
    golang.org/x/net@v0.21.0/http2/transport.go:2275 +0xf8
golang.org/x/net/http2.(*ClientConn).readLoop(0x14000838c00)
    golang.org/x/net@v0.21.0/http2/transport.go:2170 +0x5c
created by golang.org/x/net/http2.(*Transport).newClientConn in goroutine 89
    golang.org/x/net@v0.21.0/http2/transport.go:821 +0xa84

goroutine 151 [select]:
net/http.(*persistConn).writeLoop(0x1400134cfc0)
    net/http/transport.go:2444 +0xa0
created by net/http.(*Transport).dialConn in goroutine 147
    net/http/transport.go:1800 +0x1060

goroutine 150 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2dd48, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x14000bba680?, 0x14000a6ca00?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x14000bba680, {0x14000a6ca00, 0x1500, 0x1500})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x14000bba680, {0x14000a6ca00?, 0x10cc8d0b8?, 0x140013863a8?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000bbc260, {0x14000a6ca00?, 0x140013368f8?, 0x1003dc22c?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x140013863a8, {0x14000a6ca00?, 0x0?, 0x140013863a8?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x1400075ad30, {0x103cb7680, 0x140013863a8})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x1400075aa88, {0x10ccbd880, 0x14000bbc260}, 0x140013369d0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x1400075aa88, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x1400075aa88, {0x1400157f000, 0x1000, 0x1003d3a58?})
    crypto/tls/conn.go:1370 +0x168
net/http.(*persistConn).Read(0x1400134cfc0, {0x1400157f000?, 0x1003d4010?, 0x1400039ce40?})
    net/http/transport.go:1977 +0x50
bufio.(*Reader).fill(0x14001473560)
    bufio/bufio.go:110 +0xf8
bufio.(*Reader).Peek(0x14001473560, 0x1)
    bufio/bufio.go:148 +0x60
net/http.(*persistConn).readLoop(0x1400134cfc0)
    net/http/transport.go:2141 +0x158
created by net/http.(*Transport).dialConn in goroutine 147
    net/http/transport.go:1799 +0x1018

goroutine 284 [IO wait]:
internal/poll.runtime_pollWait(0x10cd2d968, 0x72)
    runtime/netpoll.go:345 +0xa0
internal/poll.(*pollDesc).wait(0x1400043d000?, 0x1400045e000?, 0x0)
    internal/poll/fd_poll_runtime.go:84 +0x28
internal/poll.(*pollDesc).waitRead(...)
    internal/poll/fd_poll_runtime.go:89
internal/poll.(*FD).Read(0x1400043d000, {0x1400045e000, 0x1500, 0x1500})
    internal/poll/fd_unix.go:164 +0x200
net.(*netFD).Read(0x1400043d000, {0x1400045e000?, 0x105fc73f8?, 0x14000c47bf0?})
    net/fd_posix.go:55 +0x28
net.(*conn).Read(0x14000860018, {0x1400045e000?, 0x14000dcf8d8?, 0x1003dc22c?})
    net/net.go:179 +0x34
crypto/tls.(*atLeastReader).Read(0x14000c47bf0, {0x1400045e000?, 0x0?, 0x14000c47bf0?})
    crypto/tls/conn.go:806 +0x40
bytes.(*Buffer).ReadFrom(0x1400102e2b0, {0x103cb7680, 0x14000c47bf0})
    bytes/buffer.go:211 +0x90
crypto/tls.(*Conn).readFromUntil(0x1400102e008, {0x10ccbd880, 0x14000860018}, 0x14000dcf9b0?)
    crypto/tls/conn.go:828 +0xd0
crypto/tls.(*Conn).readRecordOrCCS(0x1400102e008, 0x0)
    crypto/tls/conn.go:626 +0x35c
crypto/tls.(*Conn).readRecord(...)
    crypto/tls/conn.go:588
crypto/tls.(*Conn).Read(0x1400102e008, {0x14000e76000, 0x1000, 0x100782efc?})
    crypto/tls/conn.go:1370 +0x168
bufio.(*Reader).Read(0x14000e6a720, {0x14000e203c0, 0x9, 0x1058afdc0?})
    bufio/bufio.go:241 +0x1b4
io.ReadAtLeast({0x103cb6f20, 0x14000e6a720}, {0x14000e203c0, 0x9, 0x9}, 0x9)
    io/io.go:335 +0xa0
io.ReadFull(...)
    io/io.go:354
net/http.http2readFrameHeader({0x14000e203c0, 0x9, 0x140014d7650?}, {0x103cb6f20?, 0x14000e6a720?})
    net/http/h2_bundle.go:1638 +0x58
net/http.(*http2Framer).ReadFrame(0x14000e20380)
    net/http/h2_bundle.go:1905 +0x78
net/http.(*http2clientConnReadLoop).run(0x14000dcff98)
    net/http/h2_bundle.go:9342 +0xf8
net/http.(*http2ClientConn).readLoop(0x14000e1a180)
    net/http/h2_bundle.go:9237 +0x5c
created by net/http.(*http2Transport).newClientConn in goroutine 283
    net/http/h2_bundle.go:7887 +0xa84

goroutine 379 [chan receive]:
github.com/charmbracelet/bubbles/spinner.Model.Update.Model.tick.Tick.func2()
    github.com/charmbracelet/bubbletea@v0.25.0/commands.go:142 +0x3c
github.com/charmbracelet/bubbletea.(*Program).handleCommands.func1.1()
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:294 +0x30
created by github.com/charmbracelet/bubbletea.(*Program).handleCommands.func1 in goroutine 106
    github.com/charmbracelet/bubbletea@v0.25.0/tea.go:293 +0x110
❯ up version
Client:
  Version:     v0.31.0
  Go Version:  go1.22.3
  Git Commit:  56026df
  OS/Arch:     darwin/arm64
Server:
  Crossplane Version:        v1.15.2-up.1
  Spaces Controller Version: 1.4.0
RedbackThomson commented 1 week ago

Wow I ate my words about not needing support for concurrency really quickly after @cbuto suggested using mutex's:

https://github.com/upbound/up/pull/535#discussion_r1621096371