opam
opam copied to clipboard
Stack overflow when packages depends on itself
I encountered a stack overflow when running opam install
.
How to reproduce
With opam 2.1.1. On a switch with compiler revision https://github.com/ocaml/ocaml/tree/e59e682c57f66d65b72fc180097438855a24e31e, clone https://github.com/OlivierNicole/multicoretests.git#opambug, navigate into the project root, and run:
opam install . --debug --deps-only --with-test
Result:
00:00.027 CLI Parsing CLI version 2.1
00:00.027 GSTATE LOAD-GLOBAL-STATE @ /home/olivier/.opam
00:00.028 RSTATE LOAD-REPOSITORY-STATE @ /home/olivier/.opam
00:00.204 CACHE(repository) Loaded /home/olivier/.opam/repo/state-3F983742.cache in 0.175s
00:00.204 RSTATE Cache found
00:00.204 STATE LOAD-SWITCH-STATE @ /home/olivier/compiler/trunk
00:00.208 CACHE(installed) Loaded /home/olivier/compiler/trunk/_opam/.opam-switch/packages/cache in 0.000s
00:00.982 STATE Switch state loaded in 0.779s
00:00.983 FILE(switch-state) Wrote /home/olivier/compiler/trunk/_opam/.opam-switch/backup/state-20220315112247.export in 0.000s
00:00.995 AUXCMD autopin: { multicoretests => git+file:///home/olivier/opam-pins/multicoretests#main, multicorecheck => git+file:///home/olivier/opam-pins/multicoretests#main }
00:01.004 FILTER Warn: ignoring version constraint version: Undefined string filter value: version
00:01.006 FILTER Warn: ignoring version constraint version: Undefined string filter value: version
00:01.204 UPDATE update-dev-packages
00:01.204 PARALLEL Iterate over 0 task(s) with 3 process(es)
00:01.204 SWACT add-to-reinstall unpinned_only:false packages:{}
00:01.465 CLIENT INSTALL multicoretests & multicorecheck
00:02.197 STATE Detected changed packages (marked for reinstall): {}
00:02.200 CLIENT Base orphans: { domainslib.0.4.2, ocamlfind.dev, sexplib0.v0.14.1~alpha-repo }
00:02.890 SOLVER Load cudf universe (depopts:true, build:true, post:false)
00:02.895 SOLVER filter_dependencies result={ multicorecheck.~dev, multicoretests.~dev }
00:02.933 CLIENT Orphans: (changes: { multicorecheck.~dev, multicoretests.~dev }, transitive: false) -> full {}, versions {}
00:03.840 SOLVER resolve request=install:(multicoretests & multicorecheck) remove:() upgrade:()
00:06.852 SOLVER Load cudf universe (depopts:false, build:true, post:true)
00:07.275 CUDF resolve request=install:(multicorecheck & multicoretests) remove:() upgrade:()
00:14.785 CUDF Conflicts: 315 (74) pkgs to remove
00:14.786 CUDF Preprocess cudf request (trimming: full): from 22087 to 862 packages in 2.78s
00:14.786 SOLVER Calling solver builtin-mccs+glpk with criteria -removed,-count[avoid-version,changed],-count[version-lag,request],-count[version-lag,changed],-count[missing-depexts,changed],-changed
00:15.044 CUDF Solver call done in 3.039s
00:15.084 SOLVER Load cudf universe (depopts:true, build:false, post:false)
00:15.445 SOLVER Load cudf universe (depopts:true, build:true, post:false)
00:16.059 SYSTEM rm /home/olivier/compiler/trunk/_opam/.opam-switch/backup/state-20220315112247.export
Fatal error:
Stack overflow
Backtrace:
Raised by primitive operation at Cudf.(<%) in file "src_ext/cudf/cudf.ml", line 76, characters 2-78
Called from OpamActionGraph.MakeAction.equal in file "src/solver/opamActionGraph.ml", line 101, characters 20-33
Called from Stdlib__hashtbl.MakeSeeded.find in file "hashtbl.ml", line 391, characters 13-27
Called from Graph__Blocks.Make_Hashtbl.find_and_raise in file "src_ext/ocamlgraph/src/blocks.ml", line 85, characters 33-41
Called from Graph__Blocks.BidirectionalUnlabeled.iter_succ in file "src_ext/ocamlgraph/src/blocks.ml", line 553, characters 18-66
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
Called from OpamSolver.filter_solution.rm in file "src/solver/opamSolver.ml", line 773, characters 6-34
...
<goes on for thousands of lines...>
...
Called from Stdlib__set.Make.iter in file "set.ml", line 378, characters 35-38
I just realized that my package depends on itself: https://github.com/OlivierNicole/multicoretests/blob/335247f548a931df492f13a8e310b8744ba5eaad/multicoretests.opam#L22
Fixing that removes the issue. It would be simpler to get an error message in this case, though.
Good catch! We should add at least a lint error.
haha our cycle detection function didn't detect cycles that small it seems ^^