Skip to content

Commit 914e11b

Browse files
authored
gRPC: allow cancellation of downloads (#2609)
1 parent ba19a2d commit 914e11b

File tree

16 files changed

+44
-41
lines changed

16 files changed

+44
-41
lines changed

.licenses/go/go.bug.st/downloader/v2.dep.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: go.bug.st/downloader/v2
3-
version: v2.1.1
3+
version: v2.2.0
44
type: go
55
summary:
66
homepage: https://pkg.go.dev/go.bug.st/downloader/v2

commands/instances.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ import (
4545
"google.golang.org/grpc/status"
4646
)
4747

48-
func installTool(pm *packagemanager.PackageManager, tool *cores.ToolRelease, downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB) error {
48+
func installTool(ctx context.Context, pm *packagemanager.PackageManager, tool *cores.ToolRelease, downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB) error {
4949
pme, release := pm.NewExplorer()
5050
defer release()
5151

5252
taskCB(&rpc.TaskProgress{Name: tr("Downloading missing tool %s", tool)})
53-
if err := pme.DownloadToolRelease(tool, downloadCB); err != nil {
53+
if err := pme.DownloadToolRelease(ctx, tool, downloadCB); err != nil {
5454
return fmt.Errorf(tr("downloading %[1]s tool: %[2]s"), tool, err)
5555
}
5656
taskCB(&rpc.TaskProgress{Completed: true})
@@ -283,7 +283,7 @@ func (s *arduinoCoreServerImpl) Init(req *rpc.InitRequest, stream rpc.ArduinoCor
283283
// Install builtin tools if necessary
284284
if len(builtinToolsToInstall) > 0 {
285285
for _, toolRelease := range builtinToolsToInstall {
286-
if err := installTool(pmb.Build(), toolRelease, downloadCallback, taskCallback); err != nil {
286+
if err := installTool(ctx, pmb.Build(), toolRelease, downloadCallback, taskCallback); err != nil {
287287
e := &cmderrors.InitFailedError{
288288
Code: codes.Internal,
289289
Cause: err,
@@ -385,7 +385,7 @@ func (s *arduinoCoreServerImpl) Init(req *rpc.InitRequest, stream rpc.ArduinoCor
385385
responseError(e.GRPCStatus())
386386
continue
387387
}
388-
if err := libRelease.Resource.Download(pme.DownloadDir, config, libRelease.String(), downloadCallback, ""); err != nil {
388+
if err := libRelease.Resource.Download(ctx, pme.DownloadDir, config, libRelease.String(), downloadCallback, ""); err != nil {
389389
taskCallback(&rpc.TaskProgress{Name: tr("Error downloading library %s", libraryRef)})
390390
e := &cmderrors.FailedLibraryInstallError{Cause: err}
391391
responseError(e.GRPCStatus())

commands/service_library_download.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,15 @@ func (s *arduinoCoreServerImpl) LibraryDownload(req *rpc.LibraryDownloadRequest,
8181
})
8282
}
8383

84-
func downloadLibrary(_ context.Context, downloadsDir *paths.Path, libRelease *librariesindex.Release,
84+
func downloadLibrary(ctx context.Context, downloadsDir *paths.Path, libRelease *librariesindex.Release,
8585
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB, queryParameter string, settings *configuration.Settings) error {
8686

8787
taskCB(&rpc.TaskProgress{Name: tr("Downloading %s", libRelease)})
8888
config, err := settings.DownloaderConfig()
8989
if err != nil {
9090
return &cmderrors.FailedDownloadError{Message: tr("Can't download library"), Cause: err}
9191
}
92-
// TODO: Pass context
93-
if err := libRelease.Resource.Download(downloadsDir, config, libRelease.String(), downloadCB, queryParameter); err != nil {
92+
if err := libRelease.Resource.Download(ctx, downloadsDir, config, libRelease.String(), downloadCB, queryParameter); err != nil {
9493
return &cmderrors.FailedDownloadError{Message: tr("Can't download library"), Cause: err}
9594
}
9695
taskCB(&rpc.TaskProgress{Completed: true})

commands/service_platform_download.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func PlatformDownloadStreamResponseToCallbackFunction(ctx context.Context, downl
4040

4141
// PlatformDownload downloads a platform package
4242
func (s *arduinoCoreServerImpl) PlatformDownload(req *rpc.PlatformDownloadRequest, stream rpc.ArduinoCoreService_PlatformDownloadServer) error {
43+
ctx := stream.Context()
4344
syncSend := NewSynchronizedSend(stream.Send)
4445

4546
pme, release, err := instances.GetPackageManagerExplorer(req.GetInstance())
@@ -71,15 +72,12 @@ func (s *arduinoCoreServerImpl) PlatformDownload(req *rpc.PlatformDownloadReques
7172
})
7273
}
7374

74-
// TODO: pass context
75-
// ctx := stream.Context()
76-
if err := pme.DownloadPlatformRelease(platform, downloadCB); err != nil {
75+
if err := pme.DownloadPlatformRelease(ctx, platform, downloadCB); err != nil {
7776
return err
7877
}
7978

8079
for _, tool := range tools {
81-
// TODO: pass context
82-
if err := pme.DownloadToolRelease(tool, downloadCB); err != nil {
80+
if err := pme.DownloadToolRelease(ctx, tool, downloadCB); err != nil {
8381
return err
8482
}
8583
}

commands/service_platform_install.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ func (s *arduinoCoreServerImpl) PlatformInstall(req *rpc.PlatformInstallRequest,
9494
}
9595
}
9696

97-
// TODO: Pass context
98-
if err := pme.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, req.GetSkipPostInstall(), req.GetSkipPreUninstall()); err != nil {
97+
if err := pme.DownloadAndInstallPlatformAndTools(ctx, platformRelease, tools, downloadCB, taskCB, req.GetSkipPostInstall(), req.GetSkipPreUninstall()); err != nil {
9998
return err
10099
}
101100

commands/service_platform_upgrade.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (s *arduinoCoreServerImpl) PlatformUpgrade(req *rpc.PlatformUpgradeRequest,
7575
Package: req.GetPlatformPackage(),
7676
PlatformArchitecture: req.GetArchitecture(),
7777
}
78-
platform, err := pme.DownloadAndInstallPlatformUpgrades(ref, downloadCB, taskCB, req.GetSkipPostInstall(), req.GetSkipPreUninstall())
78+
platform, err := pme.DownloadAndInstallPlatformUpgrades(ctx, ref, downloadCB, taskCB, req.GetSkipPostInstall(), req.GetSkipPreUninstall())
7979
if err != nil {
8080
return platform, err
8181
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/stretchr/testify v1.9.0
3636
github.com/xeipuuv/gojsonschema v1.2.0
3737
go.bug.st/cleanup v1.0.0
38-
go.bug.st/downloader/v2 v2.1.1
38+
go.bug.st/downloader/v2 v2.2.0
3939
go.bug.st/relaxed-semver v0.12.0
4040
go.bug.st/testifyjson v1.1.1
4141
golang.org/x/term v0.20.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
211211
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
212212
go.bug.st/cleanup v1.0.0 h1:XVj1HZxkBXeq3gMT7ijWUpHyIC1j8XAoNSyQ06CskgA=
213213
go.bug.st/cleanup v1.0.0/go.mod h1:EqVmTg2IBk4znLbPD28xne3abjsJftMdqqJEjhn70bk=
214-
go.bug.st/downloader/v2 v2.1.1 h1:nyqbUizo3E2IxCCm4YFac4FtSqqFpqWP+Aae5GCMuw4=
215-
go.bug.st/downloader/v2 v2.1.1/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII=
214+
go.bug.st/downloader/v2 v2.2.0 h1:Y0jSuDISNhrzePkrAWqz9xUC3xol9hqZo/+tz1D4EqY=
215+
go.bug.st/downloader/v2 v2.2.0/go.mod h1:VZW2V1iGKV8rJL2ZEGIDzzBeKowYv34AedJz13RzVII=
216216
go.bug.st/relaxed-semver v0.12.0 h1:se8v3lTdAAFp68+/RS/0Y/nFdnpdzkP5ICY04SPau4E=
217217
go.bug.st/relaxed-semver v0.12.0/go.mod h1:Cpcbiig6Omwlq6bS7i3MQWiqS7W7HDd8CAnZFC40Cl0=
218218
go.bug.st/serial v1.6.1 h1:VSSWmUxlj1T/YlRo2J104Zv3wJFrjHIl/T3NeruWAHY=

internal/arduino/cores/packagemanager/download.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package packagemanager
1717

1818
import (
19+
"context"
1920
"errors"
2021
"fmt"
2122

@@ -119,21 +120,21 @@ func (pme *Explorer) FindPlatformReleaseDependencies(item *PlatformReference) (*
119120

120121
// DownloadToolRelease downloads a ToolRelease. If the tool is already downloaded a nil Downloader
121122
// is returned. Uses the given downloader configuration for download, or the default config if nil.
122-
func (pme *Explorer) DownloadToolRelease(tool *cores.ToolRelease, progressCB rpc.DownloadProgressCB) error {
123+
func (pme *Explorer) DownloadToolRelease(ctx context.Context, tool *cores.ToolRelease, progressCB rpc.DownloadProgressCB) error {
123124
resource := tool.GetCompatibleFlavour()
124125
if resource == nil {
125126
return &cmderrors.FailedDownloadError{
126127
Message: tr("Error downloading tool %s", tool),
127128
Cause: errors.New(tr("no versions available for the current OS, try contacting %s", tool.Tool.Package.Email))}
128129
}
129-
return resource.Download(pme.DownloadDir, pme.downloaderConfig, tool.String(), progressCB, "")
130+
return resource.Download(ctx, pme.DownloadDir, pme.downloaderConfig, tool.String(), progressCB, "")
130131
}
131132

132133
// DownloadPlatformRelease downloads a PlatformRelease. If the platform is already downloaded a
133134
// nil Downloader is returned.
134-
func (pme *Explorer) DownloadPlatformRelease(platform *cores.PlatformRelease, progressCB rpc.DownloadProgressCB) error {
135+
func (pme *Explorer) DownloadPlatformRelease(ctx context.Context, platform *cores.PlatformRelease, progressCB rpc.DownloadProgressCB) error {
135136
if platform.Resource == nil {
136137
return &cmderrors.PlatformNotFoundError{Platform: platform.String()}
137138
}
138-
return platform.Resource.Download(pme.DownloadDir, pme.downloaderConfig, platform.String(), progressCB, "")
139+
return platform.Resource.Download(ctx, pme.DownloadDir, pme.downloaderConfig, platform.String(), progressCB, "")
139140
}

internal/arduino/cores/packagemanager/install_uninstall.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package packagemanager
1717

1818
import (
1919
"bytes"
20+
"context"
2021
"encoding/json"
2122
"errors"
2223
"fmt"
@@ -33,6 +34,7 @@ import (
3334
// This method takes care of downloading missing archives, upgrading platforms and tools, and
3435
// removing the previously installed platform/tools that are no longer needed after the upgrade.
3536
func (pme *Explorer) DownloadAndInstallPlatformUpgrades(
37+
ctx context.Context,
3638
platformRef *PlatformReference,
3739
downloadCB rpc.DownloadProgressCB,
3840
taskCB rpc.TaskProgressCB,
@@ -62,7 +64,7 @@ func (pme *Explorer) DownloadAndInstallPlatformUpgrades(
6264
if err != nil {
6365
return nil, &cmderrors.PlatformNotFoundError{Platform: platformRef.String()}
6466
}
65-
if err := pme.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, skipPostInstall, skipPreUninstall); err != nil {
67+
if err := pme.DownloadAndInstallPlatformAndTools(ctx, platformRelease, tools, downloadCB, taskCB, skipPostInstall, skipPreUninstall); err != nil {
6668
return nil, err
6769
}
6870

@@ -73,6 +75,7 @@ func (pme *Explorer) DownloadAndInstallPlatformUpgrades(
7375
// This method takes care of downloading missing archives, installing/upgrading platforms and tools, and
7476
// removing the previously installed platform/tools that are no longer needed after the upgrade.
7577
func (pme *Explorer) DownloadAndInstallPlatformAndTools(
78+
ctx context.Context,
7679
platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease,
7780
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB,
7881
skipPostInstall bool, skipPreUninstall bool) error {
@@ -92,11 +95,11 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
9295
// Package download
9396
taskCB(&rpc.TaskProgress{Name: tr("Downloading packages")})
9497
for _, tool := range toolsToInstall {
95-
if err := pme.DownloadToolRelease(tool, downloadCB); err != nil {
98+
if err := pme.DownloadToolRelease(ctx, tool, downloadCB); err != nil {
9699
return err
97100
}
98101
}
99-
if err := pme.DownloadPlatformRelease(platformRelease, downloadCB); err != nil {
102+
if err := pme.DownloadPlatformRelease(ctx, platformRelease, downloadCB); err != nil {
100103
return err
101104
}
102105
taskCB(&rpc.TaskProgress{Completed: true})

0 commit comments

Comments
 (0)