opam icon indicating copy to clipboard operation
opam copied to clipboard

Stack overflow when packages depends on itself

Open OlivierNicole opened this issue 2 years ago • 3 comments

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

OlivierNicole avatar Mar 15 '22 11:03 OlivierNicole

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.

OlivierNicole avatar Mar 15 '22 11:03 OlivierNicole

Good catch! We should add at least a lint error.

rjbou avatar Mar 15 '22 11:03 rjbou

haha our cycle detection function didn't detect cycles that small it seems ^^

AltGr avatar Apr 14 '22 09:04 AltGr