Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix gRPC BoardList* methods concurrency issues #1804

Merged
merged 15 commits into from
Aug 10, 2022

Conversation

cmaglie
Copy link
Member

@cmaglie cmaglie commented Jul 13, 2022

Please check if the PR fulfills these requirements

  • The PR has no duplicates (please search among the Pull Requests
    before creating one)
  • The PR follows
    our contributing guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)
  • UPGRADING.md has been updated with a migration guide (for breaking changes)

What kind of change does this PR introduce?
Fix the functionality of the discovery manager, making it more robust when arduino-cli is running as a daemon with many concurrent calls.

What is the current behavior?
The behavior is undefined, the most frequent issues are:

  • when a BoardListWatch is disconnected and reconnected it will not see new events
  • running BoardList multiple times on the same instance may cause issues/crashes

What is the new behavior?
It should be more resistant to the above cases.

Does this PR introduce a breaking change, and is titled accordingly?
No breaking changes.

Other information:
This PR adds an experimental testsuite to test gRPC function calls. It's a collection of utilities/scripts, I finally found the time to put together.

@cmaglie cmaglie self-assigned this Jul 13, 2022
@cmaglie cmaglie force-pushed the daemon_fix_and_testsuite branch 3 times, most recently from 5f9c668 to e2ebc8c Compare July 13, 2022 22:11
@kittaakos
Copy link
Contributor

I tried this in IDE2, and it does not work as expected. When the indexes update runs, I plug in and detach a board, I see the following panic:

daemon INFO panic: 
daemon INFO runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x461f5e4]

goroutine 15 [running]:

daemon INFO github.com/arduino/arduino-cli/arduino/discovery/discoverymanager.(*DiscoveryManager).cacheEvent(0xc00007e480, 0xc003fe6870)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022614-91754-10ffy5q.s6vj/arduino/discovery/discoverymanager/discoverymanager.go:211 +0xa4
github.com/arduino/arduino-cli/arduino/discovery/discoverymanager.(*DiscoveryManager).feeder(
daemon INFO 0xc00007e480)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022614-91754-10ffy5q.s6vj/arduino/discovery/discoverymanager/discoverymanager.go:199 +0xf9
created by github.com/arduino/arduino-cli/arduino/discovery/discoverymanager.(*DiscoveryManager).Start
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022614-91754-10ffy5q.s6vj/arduino/discovery/discoverymanager/discoverymanager.go:86 +0xdd

daemon INFO Daemon exited with exit code: 2.

After this IDE2 is non-functional:
Screen Shot 2022-07-14 at 12 04 38

@cmaglie
Copy link
Member Author

cmaglie commented Jul 15, 2022

@kittaakos thanks for the bug report! It should be fixed now, may you try this one?

@kittaakos
Copy link
Contributor

This version is way more robust than the previous one. Thank you! I still found one issue, however. I do not know the exact steps/timing, but I unplugged two connected boards when the indexes update/core client re-initialization was in progress. Please reference the attached stacktrace:

click to see the stacktrace

goroutine 332 [running]:
daemon INFO runtime.throw(
daemon INFO {0x4a36d13?, 0x60?})
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/panic.go:992 +0x71 fp=0xc00044b778 sp=0xc00044b748 pc=0x4034f51
runtime.mapaccess1_faststr(0xc00044b938?, 0x4a160e3?, {0x4a161e3, 0x4})
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/map_faststr.go:22 +0x3a5 fp=0xc00044b7e0 sp=0xc00044b778 pc=0x40144e5
github.com/arduino/go-properties-orderedmap.(*Map).Get(...)
	/Users/a.kitta/go/pkg/mod/github.com/arduino/go-properties-orderedmap@v1.6.0/properties.go:221
daemon INFO github.com/arduino/arduino-cli/arduino/cores.(*Board).Name(...)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/board.go:49
github.com/arduino/arduino-cli/commands/board.Search({0x400cd25?, 0x49eff00?}, 0xc000da0690)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/board/search.go:76 +0x558 fp=0xc00044ba68 sp=0xc00044b7e0 pc=0x4786778
daemon INFO github.com/arduino/arduino-cli/commands/daemon.(*ArduinoCoreServerImpl).BoardSearch(0x499fb80?, {0x4c96620?, 0xc004a9ce40?}, 0xc0001b91c8?)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/daemon/daemon.go:85 +0x2c fp=0xc00044ba98 sp=0xc00044ba68 pc=0x48049ec
daemon INFO github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1._ArduinoCoreService_BoardSearch_Handler({0x4a06040?, 0xc00029cce0}, {0x4c96620, 0xc004a9ce40}, 0xc001c8fda0, 0x0)
daemon INFO 	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/rpc/cc/arduino/cli/commands/v1/commands_grpc.pb.go:1545 +0x170 fp=0xc00044baf0 sp=0xc00044ba98 pc=0x450ded0
google.golang.org/grpc.(*Server).processUnaryRPC(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc000ffc000, 0xc000398c90, 0x5262f50, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1286 +0xc8f fp=0xc00044be48 sp=0xc00044baf0 pc=0x44ef8cf
google.golang.org/grpc.(*Server).handleStream(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc000ffc000, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1609 +0xa1b fp=0xc00044bf68 sp=0xc00044be48 pc=0x44f3dfb
google.golang.org/grpc.(*Server).serveStreams.func1.2()
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:934 +0x98 fp=0xc00044bfe0 sp=0xc00044bf68 pc=0x44ed3d8
daemon INFO runtime.goexit()
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/asm_amd64.s:1571 +0x1 fp=0xc00044bfe8 sp=0xc00044bfe0 pc=0x4065301
created by google.golang.org/grpc.(*Server).serveStreams.func1
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:932 +0x28a

goroutine 1 [IO wait]:
internal/poll.runtime_pollWait(0x57bfb18, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc0000d7780?, 0x4?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
daemon INFO internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Accept(0xc0000d7780)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:614 +0x22c
net.(*netFD).accept(0xc0000d7780)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_unix.go:172 +0x35
daemon INFO net.(*TCPListener).accept(0xc00000f380)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/tcpsock_posix.go:139 +0x28
net.(*TCPListener).Accept(0xc00000f380)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/tcpsock.go:288 +0x3d
google.golang.org/grpc.(*Server).Serve(0xc00021e8c0, {0x4c959c8, 0xc00000f380})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:786 +0x362
github.com/arduino/arduino-cli/cli/daemon.runDaemonCommand(0xc000389400?, {0xc0000e3950?, 0x9?, 0x9?})
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/cli/daemon/daemon.go:166 +0xbf3
github.com/spf13/cobra.(*Command).execute(0xc000389400, {0xc0000e38c0, 0x9, 0x9})
	/Users/a.kitta/go/pkg/mod/github.com/spf13/cobra@v1.2.1/command.go:860 +0x663
github.com/spf13/cobra.(*Command).ExecuteC(0xc00029af00)
	/Users/a.kitta/go/pkg/mod/github.com/spf13/cobra@v1.2.1/command.go:974 +0x3b4
github.com/spf13/cobra.(*Command).Execute(...)
	/Users/a.kitta/go/pkg/mod/github.com/spf13/cobra@v1.2.1/command.go:902
main.main()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/main.go:31 +0x77

goroutine 6 [chan send]:
daemon INFO github.com/arduino/arduino-cli/cli.preRun.func1()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/cli/cli.go:185 +0xb4
created by github.com/arduino/arduino-cli/cli.preRun
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/cli/cli.go:175 +0x1ca

goroutine 7 [syscall]:
syscall.syscall(0xc000080e00?, 0x400eec5?, 0x800000?, 0x7ffff800000?)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/sys_darwin.go:22 +0x4e
syscall.read(0xc00004a0c0?, {0xc000138000?, 0x2000?,
daemon INFO 0xc000070d80?})
	/usr/local/Cellar/go/1.18.3/libexec/src/syscall/zsyscall_darwin_amd64.go:1189 +0x49
syscall.Read(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/syscall/syscall_unix.go:188
internal/poll.ignoringEINTRIO(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:794
internal/poll.(*FD).Read(0xc00004a0c0?, {0xc000138000?, 0x2000?, 0x2000?})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:163 +0x285
daemon INFO os.(*File).read(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/os/file_posix.go:31
os.(*File).Read(0xc000010010, {0xc000138000?, 0x0?, 0x0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/os/file.go:119 +0x5e
io.discard.ReadFrom({}, {0x4c90640, 0xc000010010})
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:610 +0x72
io.copyBuffer({0x4c91720, 0x52a3940}, {0x4c90640, 0xc000010010}, {0x0, 0x0, 0x0})
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:412 +0x14b
io.Copy(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:385
github.com/arduino/arduino-cli/cli/daemon.runDaemonCommand.func1()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/cli/daemon/daemon.go:118 +0x3d
created by github.com/arduino/arduino-cli/cli/daemon.runDaemonCommand
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/cli/daemon/daemon.go:116 +0x565

goroutine 19 [select]:
google.golang.org/grpc/internal/transport.(*controlBuffer).get(0xc000152050, 0x1)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/controlbuf.go:407 +0x115
google.golang.org/grpc/internal/transport.(*loopyWriter).run(0xc00004b4a0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/controlbuf.go:527 +0x85
google.golang.org/grpc/internal/transport.newHTTP2Server.func2()
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/http2_server.go:292 +0xc6
created by google.golang.org/grpc/internal/transport.newHTTP2Server
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/http2_server.go:289 +0x1493

goroutine 20 [select]:
google.golang.org/grpc/internal/transport.(*http2Server).keepalive(0xc00015a000)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/http2_server.go:993 +0x233
created by google.golang.org/grpc/internal/transport.newHTTP2Server
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/http2_server.go:300 +0x14d8

goroutine 21 [IO wait]:
internal/poll.runtime_pollWait(0x57bfa28, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000120180?, 0xc00013a000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000120180, {0xc00013a000, 0x8000, 0x8000})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000120180, {0xc00013a000?, 0x4066ba0?, 0xc000082cc0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000116018, {0xc00013a000?, 0x100000001?, 0xc000082ce8?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
daemon INFO bufio.(*Reader).Read(0xc000134060, {0xc000154038, 0x9, 0x0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc000134060}, {0xc000154038, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
daemon INFO io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
golang.org/x/net/http2.readFrameHeader({0xc000154038?, 0x9?, 0xc000082dd0?}, {0x4c8ca20?, 0xc000134060?})
	/Users/a.kitta/go/pkg/mod/golang.org/x/net@v0.0.0-20210505024714-0287a6fb4125/http2/frame.go:237 +0x6e
golang.org/x/net/http2.(*Framer).ReadFrame(0xc000154000)
	/Users/a.kitta/go/pkg/mod/golang.org/x/net@v0.0.0-20210505024714-0287a6fb4125/http2/frame.go:492 +0x95
google.golang.org/grpc/internal/transport.(*http2Server).HandleStreams(0xc00015a000, 0x0?, 0x0?)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/http2_server.go:473 +0xb2
google.golang.org/grpc.(*Server).serveStreams(0xc00021e8c0, {0x4c9ba80?, 0xc00015a000})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:918 +0x142
google.golang.org/grpc.(*Server).handleRawConn.func1()
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:868 +0x46
created by google.golang.org/grpc.(*Server).handleRawConn
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:867 +0x46a

goroutine 25 [chan receive]:
github.com/arduino/arduino-cli/commands/daemon.(*ArduinoCoreServerImpl).BoardListWatch(0xc000416bb8?, {0x4c99be8, 0xc005e29b60})
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/daemon/daemon.go:135 +0x25a
github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1._ArduinoCoreService_BoardListWatch_Handler({0x4a06040?, 0xc00029cce0}, {0x4c97d50?, 0xc0006aa180})
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/rpc/cc/arduino/cli/commands/v1/commands_grpc.pb.go:1558 +0x9f
google.golang.org/grpc.(*Server).processStreamingRPC(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc000c970e0, 0xc000398c90, 0x5263d40, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1533 +0xd06
google.golang.org/grpc.(*Server).handleStream(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc000c970e0, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1613 +0x9d6
google.golang.org/grpc.(*Server).serveStreams.func1.2()
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:934 +0x98
created by google.golang.org/grpc.(*Server).serveStreams.func1
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:932 +0x28a

goroutine 26 [chan receive]:
github.com/arduino/arduino-cli/arduino/discovery/discoverymanager.(*DiscoveryManager).Start.func1()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/discovery/discoverymanager/discoverymanager.go:89 +0x58
created by github.com/arduino/arduino-cli/arduino/discovery/discoverymanager.(*DiscoveryManager).Start
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/discovery/discoverymanager/discoverymanager.go:87 +0xdd

goroutine 33 [chan receive]:
github.com/arduino/arduino-cli/commands/board.Watch.func1()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/board/list.go:221 +0x32
created by github.com/arduino/arduino-cli/commands/board.Watch
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/board/list.go:220 +0xd8

goroutine 82 [chan receive]:
github.com/arduino/arduino-cli/commands/board.Watch.func2()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/board/list.go:228 +0xc8
created by github.com/arduino/arduino-cli/commands/board.Watch
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/board/list.go:226 +0x158

goroutine 83 [select]:
daemon INFO google.golang.org/grpc/internal/transport.(*recvBufferReader).read(0xc005919540, {0xc005e22700, 0x5, 0x5})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/transport.go:177 +0x90
google.golang.org/grpc/internal/transport.(*recvBufferReader).Read(0xc005919540, {0xc005e22700?, 0xc005e058d8?, 0xc0052e4b80?})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/transport.go:171 +0x16f
google.golang.org/grpc/internal/transport.(*transportReader).Read(0xc005f06ed0, {0xc005e22700?, 0xc0052e4bf8?, 0x44a1f47?})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/transport.go:483 +0x32
io.ReadAtLeast({0x4c8f860, 0xc005f06ed0}, {0xc005e22700, 0x5, 0x5}, 0x5)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
google.golang.org/grpc/internal/transport.(*Stream).Read(0xc000c970e0, {0xc005e22700, 0x5, 0x5})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/internal/transport/transport.go:467 +0xa5
google.golang.org/grpc.(*parser).recvMsg(0xc005e226f0, 0x400000)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/rpc_util.go:558 +0x47
google.golang.org/grpc.recvAndDecompress(0x0?, 0xc000c970e0, {0x0, 0x0}, 0x400000, 0x0, {0x0, 0x0})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/rpc_util.go:689 +0x66
google.golang.org/grpc.recv(0x0?, {0xab11008, 0x52a3d70}, 0x203001?, {0x0?, 0x0?}, {0x498b540, 0xc005d6dd00}, 0x0?, 0x0, ...)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/rpc_util.go:757 +0x6e
google.golang.org/grpc.(*serverStream).RecvMsg(0xc0006aa180, {0x498b540?, 0xc005d6dd00})
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/stream.go:1545 +0x178
github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1.(*arduinoCoreServiceBoardListWatchServer).Recv(0xc005e29b60)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/rpc/cc/arduino/cli/commands/v1/commands_grpc.pb.go:1577 +0x4c
github.com/arduino/arduino-cli/commands/daemon.(*ArduinoCoreServerImpl).BoardListWatch.func1()
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/daemon/daemon.go:116 +0x6f
created by github.com/arduino/arduino-cli/commands/daemon.(*ArduinoCoreServerImpl).BoardListWatch
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/daemon/daemon.go:113 +0x12a

goroutine 343 [IO wait]:
internal/poll.runtime_pollWait(0x57e74a8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000d63780?, 0xc001f92000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000d63780, {0xc001f92000, 0x2b45, 0x2b45})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000d63780, {0xc001f92000?, 0xc00527f660?, 0xc001f9200d?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d56058, {0xc001f92000?, 0xc00041ba58?, 0x47827d2?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
daemon INFO crypto/tls.(*atLeastReader).Read(0xc0006febb8, {0xc001f92000?, 0x0?, 0x0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0046eecf8, {0x4c8cc40, 0xc0006febb8})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0046eea80, {0x5744008?, 0xc000d56058}, 0xeac?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0046eea80, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
daemon INFO crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0046eea80, {0xc0026ff000, 0x1000, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
net/http.(*persistConn).Read(0xc000aa5c20, {0xc0026ff000?, 0xc005958660?, 0xc00041bd30?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1929 +0x4e
bufio.(*Reader).fill(0xc000511920)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:106 +0x103
bufio.(*Reader).Peek(0xc000511920, 0x1)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:144 +0x5d
net/http.(*persistConn).readLoop(0xc000aa5c20)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2093 +0x1ac
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1750 +0x173e

goroutine 223 [select]:
net/http.(*persistConn).writeLoop(0xc0009f2360)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2392 +0xf5
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1751 +0x1791

goroutine 304 [IO wait]:
internal/poll.runtime_pollWait(0x57e7598, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000dae900?, 0xc001bd2500?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000dae900, {0xc001bd2500, 0x214f, 0x214f})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000dae900, {0xc001bd2500?, 0xc00067cf80?, 0xc001c9800d?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc00069c948, {0xc001bd2500?, 0x58?, 0x54b8a68?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc00076f818, {0xc001bd2500?, 0x0?, 0x49d8a00?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc004657778, {0x4c8cc40, 0xc00076f818})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc004657500, {0x5744008?, 0xc00069c948}, 0xa9fffff?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc004657500, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc004657500, {0xc001c99000, 0x1000, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
net/http.(*persistConn).Read(0xc0004c5b00, {0xc001c99000?, 0xc0025236e0?, 0xc001a10d30?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1929 +0x4e
bufio.(*Reader).fill(0xc001c8f140)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:106 +0x103
bufio.(*Reader).Peek(0xc001c8f140, 0x1)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:144 +0x5d
net/http.(*persistConn).readLoop(0xc0004c5b00)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2093 +0x1ac
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1750 +0x173e

goroutine 281 [IO wait]:
internal/poll.runtime_pollWait(0x57bed08, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003b05b00?, 0xc001abe000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003b05b00, {0xc001abe000, 0x119f7, 0x119f7})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003b05b00, {0xc001abe000?, 0xc00527eca0?, 0xc001ac503b?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc006006540, {0xc001abe000?, 0xd9e1?, 0xc00527eca0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc00076f050, {0xc001abe000?, 0x0?, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc00448a5f8, {0x4c8cc40, 0xc00076f050})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc00448a380, {0x5744008?, 0xc006006540}, 0xa9c1?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc00448a380, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc00448a380, {0xc001c16000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001c12900, {0xc001b3b0e0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001c12900}, {0xc001b3b0e0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc001b3b0e0?, 0x9?, 0xc006038ed0?}, {0x4c8ca20?, 0xc001c12900?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go
daemon INFO :1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc001b3b0a0)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc001a17f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc00264d980)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 259 [IO wait]:
internal/poll.runtime_pollWait(0x57beee8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003b05780?, 0xc0001a5000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003b05780, {0xc0001a5000, 0x168d, 0x168d})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003b05780, {0xc0001a5000?, 0xc00062e420?, 0xc0001a5937?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d980b0, {0xc0001a5000?, 0x1115?, 0xc00062e420?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc00076eed0, {0xc0001a5000?, 0x0?, 0xa8dc400?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0043a2cf8, {0x4c8cc40, 0xc00076eed0})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0043a2a80, {0x5744008?, 0xc000d980b0}, 0xd5b?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0043a2a80, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0043a2a80, {0xc001b85000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001a69da0, {0xc0025fcac0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001a69da0}, {0xc0025fcac0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0025fcac0?, 0x9?
daemon INFO , 0xc006035560?}, {0x4c8ca20?, 0xc001a69da0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0025fca80)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc001a11f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc003b0a300)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 226 [IO wait]:
internal/poll.runtime_pollWait(0x57bf848, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003b05000?, 0xc0019fc000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003b05000, {0xc0019fc000, 0xf60, 0xf60})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003b05000, {0xc0019fc000?, 0xc00067c2a0?, 0xc0019fc040?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d98048, {0xc0019fc000?, 0xf60?, 0xc00067c2a0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc00076e828, {0xc0019fc000?, 0x0?, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0037fecf8, {0x4c8cc40, 0xc00076e828})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0037fea80, {0x5744008?, 0xc000d98048}, 0xf25?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0037fea80, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0037fea80, {0xc001a92000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001a88000, {0xc0018c3380, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001a88000}, {0xc0018c3380, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0018c3380?, 0x9?, 0xc005cd19e0?}, {0x4c8ca20?, 0xc001a88000?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0018c3340)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc0052def98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc002540180)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 247 [IO wait]:
internal/poll.runtime_pollWait(0x57befd8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003b05300?, 0xc001b22000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003b05300, {0xc001b22000, 0x1435, 0x1435})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003b05300, {0xc001b22000?, 0xc0006c3e00?, 0xc001b2200d?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc006006420, {0xc001b22000?, 0xd?, 0x9?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc003b18960, {0xc001b22000?,
daemon INFO 0x0?, 0x113?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc006094cf8, {0x4c8cc40, 0xc003b18960})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc006094a80, {0x5744008?, 0xc006006420}, 0x37?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc006094a80, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc006094a80, {0xc001b46000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001b17080, {0xc001b3a3c0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001b17080}, {0xc001b3a3c0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc001b3a3c0?, 0x9?, 0xc005e64270?}, {0x4c8ca20?, 0xc001b17080?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc001b3a380)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc00041df98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc00264cd80)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 257 [IO wait]:
internal/poll.runtime_pollWait(0x57bedf8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000d63080?, 0xc001b2b300?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000d63080, {0xc001b2b300, 0x1099, 0x1099})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000d63080, {0xc001b2b300?, 0xc00527e400?, 0xc001b2c137?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc0060064b0, {0xc001b2b300?, 0x5?, 0xa?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc003b18dc8, {0xc001b2b300?, 0x0?, 0x11b?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc006095778, {0x4c8cc40, 0xc003b18dc8})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc006095500, {0x5744008?, 0xc0060064b0}, 0x267?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc006095500, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc006095500, {0xc001b79000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001b55c80, {0xc001b3a900, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001b55c80}, {0xc001b3a900, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc001b3a900?, 0x9?, 0xc00525f1a0?}, {0x4c8ca20?, 0xc001b55c80?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc001b3a8c0)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc001a16f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc00264d380)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
daemon INFO 
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 222 [IO wait]:
internal/poll.runtime_pollWait(0x57bf0c8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003269e00?, 0xc00185a000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003269e00, {0xc00185a000, 0x2b45, 0x2b45})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003269e00, {0xc00185a000?, 0xc000614fe0?, 0xc00185a00d?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d562e0, {0xc00185a000?, 0x58?, 0x54b85b8?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc000413410, {0xc00185a000?, 0x0?, 0x49d8a00?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0046ef078, {0x4c8cc40, 0xc000413410})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0046eee00, {0x5744008?, 0xc000d562e0}, 0xeac?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0046eee00, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0046eee00, {0xc001b47000, 0x1000, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
net/http.(*persistConn).Read(0xc0009f2360, {0xc001b47000?, 0xc000ceaba0?, 0xc000419d30?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1929 +0x4e
bufio.(*Reader).fill(0xc001a04300)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:106 +0x103
bufio.(*Reader).Peek(0xc001a04300, 0x1)
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:144 +0x5d
net/http.(*persistConn).readLoop(0xc0009f2360)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2093 +0x1ac
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1750 +0x173e

goroutine 109 [IO wait]:
internal/poll.runtime_pollWait(0x57bf488, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003269580?, 0xc0025f0000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003269580, {0xc0025f0000, 0x1293, 0x1293})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003269580, {0xc0025f0000?, 0x4953201?, 0xc005670b80?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d98020, {0xc0025f0000?, 0x7a3?, 0xc005670b80?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc0006fed38, {0xc0025f0000?, 0x0?, 0x1a32?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0037e2278, {0x4c8cc40, 0xc0006fed38})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0037e2000, {0x5744008?, 0xc000d98020}, 0xc0025f0af5?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0037e2000, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0037e2000, {0xc001a07000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001a04540, {0xc0025fc4a0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001a04540}, {0xc0025fc4a0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0025fc4a0?, 0x9?, 0xc005bbf9b0?}, {0x4c8ca20?, 0xc001a04540?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0025fc460)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc000083f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc0013f7800)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 145 [IO wait]:
internal/poll.runtime_pollWait(0x57bf398, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc005e0a600?, 0xc0026f8000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc005e0a600, {0xc0026f8000, 0xf5e, 0xf5e})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc005e0a600, {0xc0026f8000?, 0xc005da6d60?, 0xc0026f852b?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc00609a150, {0xc0026f8000?, 0xf5e?, 0xc005da6d60?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc0024648b8, {0xc0026f8000?, 0x0?, 0x40186c5?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0000e8278, {0x4c8cc40, 0xc0024648b8})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0000e8000, {0x5744008?, 0xc00609a150}, 0xa38?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0000e8000, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0000e8000, {0xc0026fe000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc000676ba0, {0xc0026fa4a0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc000676ba0}, {0xc0026fa4a0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0026fa4a0?, 0x9?, 0xc00591cab0?}, {0x4c8ca20?, 0xc000676ba0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0026fa460)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc003cb5f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc001e13980)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 200 [IO wait]:
internal/poll.runtime_pollWait(0x57bf758, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003b04a80?, 0xc001926000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003b04a80, {0xc001926000, 0xa1df, 0xa1df})
daemon INFO /usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003b04a80, {0xc001926000?, 0xc005676ca0?, 0xc00192f104?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc00609a148, {0xc001926000?, 0x61c9?, 0xc005676ca0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc0006fec48, {0xc001926000?, 0x0?, 0xa9fffff?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0000b05f8, {0x4c8cc40, 0xc0006fec48})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0000b0380, {0x5744008?, 0xc00609a148}, 0x10e0?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0000b0380, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0000b0380, {0xc003ccc000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc0012e4de0, {0xc003cc64a0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc0012e4de0}, {0xc003cc64a0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc003cc64a0?, 0x9?, 0xc005bbf500?}, {0x4c8ca20?, 0xc0012e4de0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc003cc6460)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc0052e0f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc001e80600)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 322 [IO wait]:
internal/poll.runtime_pollWait(0x57e7688, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc006096980?, 0xc0025f4c00?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc006096980, {0xc0025f4c00, 0x1293, 0x1293})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc006096980, {0xc0025f4c00?, 0x4953201?, 0xc00062ed40?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d98150, {0xc0025f4c00?, 0x7a3?, 0xc00062ed40?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc0006ff980, {0xc0025f4c00?, 0x0?, 0x34?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc0044bf778, {0x4c8cc40, 0xc0006ff980})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc0044bf500, {0x5744008?, 0xc000d98150}, 0xc0025f56f5?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc0044bf500, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc0044bf500, {0xc001bbc000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001bb8ea0, {0xc0025fd540, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001bb8ea0}, {0xc0025fd540, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0025fd540?, 0x9?, 0xc00066a120?}, {0x4c8ca20?, 0xc001bb8ea0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0025fd500)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc0052e5f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc003b0ad80)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 310 [runnable]:
strings.Index({0xc0010e318b, 0x24}, {0x4c894fe, 0x1})
	/usr/local/Cellar/go/1.18.3/libexec/src/strings/strings.go:1097 +0x694
strings.genSplit({0xc0010e318b, 0x24}, {0x4c894fe, 0x1}, 0x0, 0x54b8108?)
	/usr/local/Cellar/go/1.18.3/libexec/src/strings/strings.go:251 +0x10d
daemon INFO strings.Split(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/strings/strings.go:303
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).loadBoards(0xc00137ad70?, 0xc0053f5110)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:490 +0x9c5
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).loadPlatformRelease(0xc0005103c0, 0xc0053f5110, 0xc00066f7c0)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:345 +0x9e5
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).loadPlatform(0xc0005103c0, 0xc0062b6480, {0xc0048dca39, 0x5}, 0xc00066f790)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:272 +0x985
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).loadPlatforms(0xc0005103c0, 0xc0062b6480, 0xc00066f6c0)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:166 +0x3aa
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).LoadHardwareFromDirectory(0xc0005103c0, 0xc005d12f20)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:124 +0xbd2
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).LoadHardwareFromDirectories(...)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:50
github.com/arduino/arduino-cli/arduino/cores/packagemanager.(*PackageManager).LoadHardware(0xc0005103c0?)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/packagemanager/loader.go:38 +0xdf
daemon INFO github.com/arduino/arduino-cli/commands.Init(0xc001c740a0, 0x400f227?)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/instances.go:270 +0x685
github.com/arduino/arduino-cli/commands/daemon.(*ArduinoCoreServerImpl).Init(0xc001c76000?, 0x49a00c0?, {0x4c98e50?, 0xc005b340e0?})
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/commands/daemon/daemon.go:235 +0x50
github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1._ArduinoCoreService_Init_Handler({0x4a06040?, 0xc00029cce0}, {0x4c97d50, 0xc001c76000})
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/rpc/cc/arduino/cli/commands/v1/commands_grpc.pb.go:1256 +0xd3
google.golang.org/grpc.(*Server).processStreamingRPC(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc0001df7a0, 0xc000398c90, 0x5263c80, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1533 +0xd06
google.golang.org/grpc.(*Server).handleStream(0xc00021e8c0, {0x4c9ba80, 0xc00015a000}, 0xc0001df7a0, 0x0)
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:1613 +0x9d6
google.golang.org/grpc.(*Server).serveStreams.func1.2()
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:934 +0x98
created by google.golang.org/grpc.(*Server).serveStreams.func1
	/Users/a.kitta/go/pkg/mod/google.golang.org/grpc@v1.38.0/server.go:932 +0x28a

goroutine 269 [IO wait]:
internal/poll.runtime_pollWait(0x57bf1b8, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc003269d00?, 0xc0025f3900?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc003269d00, {0xc0025f3900, 0x1294, 0x1294})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc003269d00, {0xc0025f3900?, 0x4953201?, 0xc00062e940?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc000d98128, {0xc0025f3900?, 0x1294?, 0xc00062e940?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc0006ff470, {0xc0025f3900?, 0x0?, 0x34?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc004410cf8, {0x4c8cc40, 0xc0006ff470})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc004410a80, {0x5744008?, 0xc000d98128}, 0xc0025f3905?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc004410a80, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc004410a80, {0xc001ba5000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001ba2780, {0xc0025fd000, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001ba2780}, {0xc0025fd000, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0025fd000?, 0x9?, 0xc00657e030?}, {0x4c8ca20?, 0xc001ba2780?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0025fcfc0)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc001a14f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc003b0a900)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 292 [IO wait]:
internal/poll.runtime_pollWait(0x57bec18, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000dae100?, 0xc001c80000?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000dae100, {0xc001c80000, 0xfe3, 0xfe3})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000dae100, {0xc001c80000?, 0xc00067c980?, 0xc001c80005?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc00069c848, {0xc001c80000?, 0x5?, 0xa?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc00076f3e0, {0xc001c80000?, 0x0?, 0x13b?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc004375778, {0x4c8cc40, 0xc00076f3e0})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc004375500, {0x5744008?, 0xc00069c848}, 0x37?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc004375500, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc004375500, {0xc001c82000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001ad75c0, {0xc0018c38c0, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001ad75c0}, {0xc0018c38c0, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc0018c38c0?, 0x9?, 0xc00603c810?}, {0x4c8ca20?, 0xc001ad75c0?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc0018c3880)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc0052e3f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc002540c00)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 286 [IO wait]:
internal/poll.runtime_pollWait(0x57e7778, 0x72)
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/netpoll.go:302 +0x89
internal/poll.(*pollDesc).wait(0xc000dae600?, 0xc001b2c600?, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:83 +0x32
internal/poll.(*pollDesc).waitRead(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_poll_runtime.go:88
internal/poll.(*FD).Read(0xc000dae600, {0xc001b2c600, 0x1293, 0x1293})
	/usr/local/Cellar/go/1.18.3/libexec/src/internal/poll/fd_unix.go:167 +0x25a
net.(*netFD).Read(0xc000dae600, {0xc001b2c600?, 0xa8e2d00?, 0xa9fffff?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/fd_posix.go:55 +0x29
net.(*conn).Read(0xc006006568, {0xc001b2c600?, 0xa8e2e00?, 0xa8e2d00?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/net.go:183 +0x45
crypto/tls.(*atLeastReader).Read(0xc003b19890, {0xc001b2c600?, 0x0?, 0x1?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:785 +0x3d
bytes.(*Buffer).ReadFrom(0xc004533e78, {0x4c8cc40, 0xc003b19890})
	/usr/local/Cellar/go/1.18.3/libexec/src/bytes/buffer.go:204 +0x98
crypto/tls.(*Conn).readFromUntil(0xc004533c00, {0x5744008?, 0xc006006568}, 0x37?)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:807 +0xe5
crypto/tls.(*Conn).readRecordOrCCS(0xc004533c00, 0x0)
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:614 +0x116
crypto/tls.(*Conn).readRecord(...)
root DEBUG Skipping menu item with missing command: "workbench.action.files.newUntitledFile".
daemon INFO /usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:582
crypto/tls.(*Conn).Read(0xc004533c00, {0xc001c51000, 0x1000, 0x441c460?})
	/usr/local/Cellar/go/1.18.3/libexec/src/crypto/tls/conn.go:1285 +0x16f
bufio.(*Reader).Read(0xc001c28f60, {0xc001b3b620, 0x9, 0x442a862?})
	/usr/local/Cellar/go/1.18.3/libexec/src/bufio/bufio.go:236 +0x1b4
io.ReadAtLeast({0x4c8ca20, 0xc001c28f60}, {0xc001b3b620, 0x9, 0x9}, 0x9)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:331 +0x9a
io.ReadFull(...)
	/usr/local/Cellar/go/1.18.3/libexec/src/io/io.go:350
net/http.http2readFrameHeader({0xc001b3b620?, 0x9?, 0xc00631d590?}, {0x4c8ca20?, 0xc001c28f60?})
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1566 +0x6e
net/http.(*http2Framer).ReadFrame(0xc001b3b5e0)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:1830 +0x95
net/http.(*http2clientConnReadLoop).run(0xc000417f98)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8815 +0x130
net/http.(*http2ClientConn).readLoop(0xc00264de00)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:8711 +0x6f
created by net/http.(*http2Transport).newClientConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/h2_bundle.go:7439 +0xa65

goroutine 305 [select]:
net/http.(*persistConn).writeLoop(0xc0004c5b00)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2392 +0xf5
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1751 +0x1791

goroutine 344 [select]:
net/http.(*persistConn).writeLoop(0xc000aa5c20)
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:2392 +0xf5
created by net/http.(*Transport).dialConn
	/usr/local/Cellar/go/1.18.3/libexec/src/net/http/transport.go:1751 +0x1791
daemon INFO Daemon exited with exit code: 2.

@cmaglie
Copy link
Member Author

cmaglie commented Jul 15, 2022

	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/panic.go:992 +0x71 fp=0xc00044b778 sp=0xc00044b748 pc=0x4034f51
runtime.mapaccess1_faststr(0xc00044b938?, 0x4a160e3?, {0x4a161e3, 0x4})
	/usr/local/Cellar/go/1.18.3/libexec/src/runtime/map_faststr.go:22 +0x3a5 fp=0xc00044b7e0 sp=0xc00044b778 pc=0x40144e5
github.com/arduino/go-properties-orderedmap.(*Map).Get(...)
	/Users/a.kitta/go/pkg/mod/github.com/arduino/go-properties-orderedmap@v1.6.0/properties.go:221
daemon INFO github.com/arduino/arduino-cli/arduino/cores.(*Board).Name(...)
	/private/var/folders/z1/xkw1yh5n7rz4n8djprp1mdn80000gn/T/d-2022615-23113-1nbbnny.6p0y/arduino/cores/board.go:49
github.com/arduino/arduino-cli/commands/board.Search({0x400cd25?, 0x49eff00?}, 0xc000da0690)

IMHO this is unrelated to the discovery: I see a running BoardSearch so I guess you triggered #1801.
Are you able to reproduce it consistently? Since this PR also adds a testsuite for gRPC I may be able to create a test for it.

And since I'm here I'm going to move the gRPC testsuite on his own PR, so we can review it, it has no sense to keep it here.

@kittaakos
Copy link
Contributor

kittaakos commented Jul 15, 2022

IMHO this is unrelated to the discovery:

I am positive you know this better, but the panic does not happen from IDE2 main branch, and it's failing when I have no other changes but a CLI from this PR. See the diff here. I did not do anything unique to reproduce the bug but unplugged two boards when the indexes update was running.

@cmaglie
Copy link
Member Author

cmaglie commented Jul 15, 2022

Actually, it happened before the patch: arduino/arduino-ide#681 (comment)
That's the report I linked in #1801, and if you look it's exactly the same as your last stack trace, that's why I'm convinced it's unrelated.

@cmaglie cmaglie marked this pull request as ready for review July 18, 2022 13:59
@cmaglie cmaglie requested review from per1234 and umbynos July 18, 2022 14:00
@cmaglie
Copy link
Member Author

cmaglie commented Jul 18, 2022

I've removed the "testuite" part, this PR should be ready to review now.

@cmaglie cmaglie changed the title Fix gRPC BoardList* methods concurrency issues / Add testsuite for gRPC Fix gRPC BoardList* methods concurrency issues Jul 18, 2022
@cmaglie cmaglie added priority: medium Resolution is a medium priority type: imperfection Perceived defect in any part of project topic: gRPC Related to the gRPC interface criticality: high Of high impact labels Jul 21, 2022
@per1234 per1234 added the topic: code Related to content of the project itself label Jul 22, 2022
Copy link
Contributor

@per1234 per1234 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did some general testing both using the Arduino CLI gRPC interface directly, as well as with the latest build of Arduino IDE 2.x (2.0.0-rc9.1-snapshot-0b33b51). I did not manage to cause any misbehavior, but unfortunately I also was not able to reproduce the issue when using the latest build of Arduino CLI from the master branch.

@codecov
Copy link

codecov bot commented Aug 8, 2022

Codecov Report

Merging #1804 (4c197b8) into daemon-fixes (312cfdb) will increase coverage by 0.04%.
The diff coverage is 6.03%.

@@               Coverage Diff                @@
##           daemon-fixes    #1804      +/-   ##
================================================
+ Coverage         36.34%   36.39%   +0.04%     
================================================
  Files               232      232              
  Lines             19496    19401      -95     
================================================
- Hits               7086     7061      -25     
+ Misses            11583    11511      -72     
- Partials            827      829       +2     
Flag Coverage Δ
unit 36.39% <6.03%> (+0.04%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
arduino/discovery/discovery.go 19.63% <0.00%> (+0.67%) ⬆️
cli/arguments/completion.go 0.00% <0.00%> (ø)
cli/arguments/port.go 0.00% <0.00%> (ø)
cli/board/list.go 0.00% <0.00%> (ø)
commands/board/list.go 45.69% <0.00%> (+11.53%) ⬆️
commands/daemon/daemon.go 0.00% <0.00%> (ø)
...ino/discovery/discoverymanager/discoverymanager.go 16.47% <8.88%> (-3.32%) ⬇️
arduino/monitor/monitor.go 41.05% <0.00%> (-6.32%) ⬇️
arduino/cores/packagemanager/package_manager.go 62.18% <0.00%> (-0.85%) ⬇️
... and 3 more

Help us with your feedback. Take ten seconds to tell us how you rate us.

@cmaglie cmaglie force-pushed the daemon_fix_and_testsuite branch 3 times, most recently from 7b8d40b to d5c39ce Compare August 9, 2022 07:52
cmaglie and others added 15 commits August 10, 2022 14:15
Now the DiscoveryManager is able to start the discoveries and add/remove
them in a thread-safe way. Also the watchers may connect and disconnect
seamlessly at any time, the incoming events from the discovery are
broadcasted correctly to each active watcher.

This refactoring dramatically simplifies the DiscoveryManager design.
it will be useful in the next commits.
there is already a cache in the DiscoveryManager there is no need to
duplicate it.
otherwise the discovery may send some events before the eventChan is
setup (and those events will be lost)
Co-authored-by: Umberto Baldi <34278123+umbynos@users.noreply.github.com>
@cmaglie cmaglie changed the base branch from master to daemon-fixes August 10, 2022 12:18
@cmaglie cmaglie merged commit 9c334ed into arduino:daemon-fixes Aug 10, 2022
@cmaglie cmaglie deleted the daemon_fix_and_testsuite branch August 10, 2022 12:48
cmaglie added a commit to cmaglie/arduino-cli that referenced this pull request Mar 24, 2023
cmaglie added a commit that referenced this pull request Mar 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
criticality: high Of high impact priority: medium Resolution is a medium priority topic: code Related to content of the project itself topic: gRPC Related to the gRPC interface type: imperfection Perceived defect in any part of project
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants