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

Sysreqs calls are too many if lots of deps #193

Open
muschellij2 opened this issue Nov 19, 2021 · 2 comments
Open

Sysreqs calls are too many if lots of deps #193

muschellij2 opened this issue Nov 19, 2021 · 2 comments

Comments

@muschellij2
Copy link

It seems as though you're using sysreqs to get the system requirements for a container and it seems you always get the list of packages, either from the session info, description, etc.

Once you have the list of packages, you seem to loop through each package. This is not required as sysreqs can handle a character vector of packages, such as https://sysreqs.r-hub.io/pkg/containerit,igraph,xml2,magick. The issue here is that the looping, for a large number of dependencies essentially DDoS's the API and then you get some 400's. I propose to stop the looping in .find_system_dependencies.

library(httr)
library(sysreqs)
platform = "linux-x86_64-debian-gcc"

all_deps <- sysreqs:::get_cran_deps(c("containerit", "remotes", 
                                      "dplyr", "httr", "xml2", 
                                      # bad package
                                      "casdfsdf2343535"))
dep_sysreqs <- sysreqs:::get_cran_sysreqs(
  all_deps, 
  platform = platform)
dep_sysreqs
#> [1] "libssl-dev"           "libxml2-dev"          "libcurl4-openssl-dev"
#> [4] "git-core"

package = all_deps
package <- paste(package, collapse = ",")
url <- sysreqs:::make_url(sysreqs:::sysreqs_cran_url, package = package, platform = platform)
print(url)
#> [1] "https://sysreqs.r-hub.io/pkg/containerit,remotes,dplyr,httr,xml2,casdfsdf2343535,ellipsis,generics,glue,lifecycle,magrittr,R6,rlang,tibble,tidyselect,vctrs,pillar,cli,crayon,fansi,utf8,pkgconfig,purrr,curl,jsonlite,mime,openssl,askpass,sys/linux-x86_64-debian-gcc"
unlist(sysreqs:::download_json(url))
#> [1] "libssl-dev"           "libxml2-dev"          "libcurl4-openssl-dev"
#> [4] "git-core"

Created on 2021-11-19 by the reprex package (v2.0.0)

Session info
sessioninfo::session_info()
#> ─ Session info  ──────────────────────────────────────────────────────────────
#>  hash: woman health worker: medium skin tone, white small square, clapping hands: medium skin tone
#> 
#>  setting  value
#>  version  R version 4.1.0 (2021-05-18)
#>  os       Debian GNU/Linux 10 (buster)
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language (EN)
#>  collate  C.UTF-8
#>  ctype    C.UTF-8
#>  tz       Etc/UTC
#>  date     2021-11-19
#>  pandoc   2.14.0.2 @ /opt/conda/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version    date (UTC) lib source
#>  cli           3.1.0.9000 2021-10-29 [1] Github (r-lib/cli@1af3d91)
#>  crayon        1.4.2      2021-10-29 [1] CRAN (R 4.1.0)
#>  debugme       1.1.0      2017-10-22 [1] CRAN (R 4.1.0)
#>  desc          1.4.0      2021-09-28 [1] CRAN (R 4.1.0)
#>  digest        0.6.28     2021-09-23 [1] CRAN (R 4.1.0)
#>  evaluate      0.14       2019-05-28 [2] CRAN (R 4.1.0)
#>  fastmap       1.1.0      2021-01-25 [2] CRAN (R 4.1.0)
#>  fs            1.5.0      2020-07-31 [2] CRAN (R 4.1.0)
#>  glue          1.5.0      2021-11-07 [1] CRAN (R 4.1.0)
#>  highr         0.9        2021-04-16 [2] CRAN (R 4.1.0)
#>  htmltools     0.5.2      2021-08-25 [1] CRAN (R 4.1.0)
#>  httr        * 1.4.2.9000 2021-11-01 [1] Github (r-lib/httr@21ff69f)
#>  knitr         1.36       2021-09-29 [1] CRAN (R 4.1.0)
#>  magrittr      2.0.1      2020-11-17 [2] CRAN (R 4.1.0)
#>  R6            2.5.1      2021-08-19 [1] CRAN (R 4.1.0)
#>  reprex        2.0.0      2021-04-02 [2] CRAN (R 4.1.0)
#>  rlang         0.4.12     2021-10-18 [1] CRAN (R 4.1.0)
#>  rmarkdown     2.9        2021-06-15 [2] CRAN (R 4.1.0)
#>  rprojroot     2.0.2      2020-11-15 [2] CRAN (R 4.1.0)
#>  rstudioapi    0.13       2020-11-12 [2] CRAN (R 4.1.0)
#>  sessioninfo   1.1.1.9000 2021-10-22 [1] Github (muschellij2/sessioninfo@a4a39f1)
#>  stringi       1.7.5      2021-10-04 [1] CRAN (R 4.1.0)
#>  stringr       1.4.0      2019-02-10 [2] CRAN (R 4.1.0)
#>  sysreqs     * 1.0.0.9000 2021-10-08 [1] Github (r-hub/sysreqs@f068afa)
#>  withr         2.4.2      2021-04-18 [2] CRAN (R 4.1.0)
#>  xfun          0.27       2021-10-18 [1] CRAN (R 4.1.0)
#>  yaml          2.2.1      2020-02-01 [2] CRAN (R 4.1.0)
#> 
#>  [1] /home/jupyter/.R/library
#>  [2] /usr/local/lib/R/site-library
#>  [3] /usr/lib/R/site-library
#>  [4] /usr/lib/R/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────
@muschellij2
Copy link
Author

Also, now that I look into it more, it seems as though .find_by_sysreqs_pkg calls sysreqs
directly:
https://github.com/o2r-project/containerit/blob/master/R/package-installation-methods.R#L273
and
.find_by_sysreqs_api is calling the API:
https://github.com/o2r-project/containerit/blob/master/R/package-installation-methods.R#L302.

The issue is that sysreqs uses get_cran_deps https://github.com/r-hub/sysreqs/blob/master/R/sysreqs.R#L54, which calls make_url
https://github.com/r-hub/sysreqs/blob/master/R/sysreqs.R#L16, which calls the API command.

So, both functions are actually calling the API and so I think overall containerit should simply call sysreqs::sysreqs rather than the 2 functions. If I'm missing something, then I'd be interested to see why the 2 methods were created.

muschellij2 added a commit to muschellij2/containerit that referenced this issue Nov 19, 2021
@muschellij2
Copy link
Author

Looks like RSPM now has sysreqs in there: https://github.com/tidymodels/vetiver-r/blob/main/R/write-docker.R#L91

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant