ASDF 3.1.x cache inhibits loading stuff on demand?

Bug #1335323 reported by Zach Beane
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
ASDF
Fix Released
Undecided
Unassigned

Bug Description

In ql:quickload, Quicklisp handles the ASDF:MISSING-COMPONENT condition to install libraries that are available via Quicklisp and retry.

With ASDF 3.1.2.6, ASDF seems to cache an initial ASDF:FIND-SYSTEM that returns NIL, so that after the error has been handled and the system made available via the Quicklisp system search function, the cached NIL result is returned instead of doing a full search again.

Here's a log of loading a system named "xach" that has no components and depends on Alexandria. Quicklisp fetches and unpacks Alexandria on demand but the new system is not found.

  $ batchsbcl --load ~/asdf-3.1.2.6.fasl --load setup.lisp --eval '(trace ql-dist:ensure-installed ql-dist:system-definition-searcher asdf:find-system asdf::find-component asdf::call-with-asdf-cache)' --eval '(ql:quickload :xach)' | tee debug.txt
  This is SBCL 1.1.15.7-cbe0542, an implementation of ANSI Common Lisp.
  More information about SBCL is available at <http://www.sbcl.org/>.

  SBCL is free software, provided as is, with absolutely no warranty.
  It is mostly in the public domain; some portions are provided under
  BSD-style licenses. See the CREDITS and COPYING files in the
  distribution for more information.
    0: (ASDF/SYSTEM:FIND-SYSTEM "xach" NIL)
      1: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
   #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM) {1005DE88BB}>
   :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "xach"))
 2: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
     #<CLOSURE (LAMBDA # :IN ASDF/FIND-SYSTEM:LOCATE-SYSTEM) {1005DEC4BB}>
     :OVERRIDE NIL :KEY (ASDF/FIND-SYSTEM:LOCATE-SYSTEM "xach"))
 2: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
      T
      NIL
      #P"/Users/xach/testing/quicklisp-test-2/local-projects/xach.asd"
      NIL
      NIL
 2: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
     #<CLOSURE (LAMBDA # :IN ASDF/FIND-SYSTEM:LOAD-ASD) {1005E02B1B}>
     :OVERRIDE NIL :KEY NIL)
   3: (ASDF/CACHE:CALL-WITH-ASDF-CACHE #<CLOSURE (LAMBDA NIL :IN ASDF/PARSE-DEFSYSTEM:REGISTER-SYSTEM-DEFINITION) {1005E0D4FB}> :OVERRIDE NIL :KEY NIL)
     4: (FIND-COMPONENT NIL "xach")
       5: (FIND-COMPONENT "xach" NIL)
  6: (FIND-SYSTEM "xach" NIL)
    7: (ASDF/CACHE:CALL-WITH-ASDF-CACHE #<CLOSURE (LAMBDA NIL :IN FIND-SYSTEM) {1005E17F0B}> :OVERRIDE NIL :KEY (FIND-SYSTEM "xach"))
    7: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned #<SYSTEM "xach">
  6: FIND-SYSTEM returned #<SYSTEM "xach">
  6: (FIND-COMPONENT #<SYSTEM "xach"> NIL)
  6: FIND-COMPONENT returned #<SYSTEM "xach">
       5: FIND-COMPONENT returned #<SYSTEM "xach">
     4: FIND-COMPONENT returned #<SYSTEM "xach">
   3: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned #<SYSTEM "xach">
 2: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned T
      1: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned #<ASDF/SYSTEM:SYSTEM "xach">
    0: ASDF/SYSTEM:FIND-SYSTEM returned #<ASDF/SYSTEM:SYSTEM "xach">
  To load "xach":
    Load 1 ASDF system:
      xach
  ; Loading "xach"
    0: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
 #<CLOSURE (LAMBDA # :IN ASDF/OPERATE:OPERATE) {10065B959B}> :OVERRIDE NIL
 :KEY NIL)
      1: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL :ASDF)
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT :ASDF NIL)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT "asdf" NIL)
     4: (ASDF/SYSTEM:FIND-SYSTEM "asdf" NIL)
       5: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
    #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM) {10065C1F7B}>
    :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "asdf"))
  6: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
      #<CLOSURE (LAMBDA # :IN ASDF/FIND-SYSTEM:LOCATE-SYSTEM)
        {10065C582B}>
      :OVERRIDE NIL :KEY (ASDF/FIND-SYSTEM:LOCATE-SYSTEM "asdf"))
    7: (QL-DIST:SYSTEM-DEFINITION-SEARCHER "asdf")
    7: QL-DIST:SYSTEM-DEFINITION-SEARCHER returned NIL
  6: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
       T
       #<ASDF/SYSTEM:SYSTEM "asdf">
       NIL
       #<ASDF/SYSTEM:SYSTEM "asdf">
       NIL
       5: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
     #<ASDF/SYSTEM:SYSTEM "asdf">
     4: ASDF/SYSTEM:FIND-SYSTEM returned #<ASDF/SYSTEM:SYSTEM "asdf">
     4: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf">
         NIL)
     4: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
   #<ASDF/SYSTEM:SYSTEM "asdf">
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
      1: ASDF/FIND-COMPONENT:FIND-COMPONENT returned #<ASDF/SYSTEM:SYSTEM "asdf">
      1: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
   #<CLOSURE (LAMBDA # :IN ASDF/OPERATE:OPERATE) {10065E2C3B}> :OVERRIDE
   NIL :KEY NIL)
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "asdf">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "asdf"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "asdf">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "asdf">
      1: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
    #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL>
    #<ASDF/PLAN:SEQUENTIAL-PLAN {10065E6B83}>
    0: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
  #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL>
  #<ASDF/PLAN:SEQUENTIAL-PLAN {10065E6B83}>
    0: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
 #<CLOSURE (LAMBDA # :IN ASDF/OPERATE:OPERATE) {10066F0CDB}> :OVERRIDE NIL
 :KEY NIL)
      1: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL "xach")
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT "xach" NIL)
   3: (ASDF/SYSTEM:FIND-SYSTEM "xach" NIL)
     4: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
  #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM) {10066F74CB}>
  :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "xach"))
       5: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
    #<CLOSURE (LAMBDA # :IN ASDF/FIND-SYSTEM:LOCATE-SYSTEM)
      {10066FAD7B}>
    :OVERRIDE NIL :KEY (ASDF/FIND-SYSTEM:LOCATE-SYSTEM "xach"))
       5: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
     T
     NIL
     #P"/Users/xach/testing/quicklisp-test-2/local-projects/xach.asd"
     #<ASDF/SYSTEM:SYSTEM "xach">
     3612866395
     4: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned
   #<ASDF/SYSTEM:SYSTEM "xach">
   3: ASDF/SYSTEM:FIND-SYSTEM returned #<ASDF/SYSTEM:SYSTEM "xach">
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
      1: ASDF/FIND-COMPONENT:FIND-COMPONENT returned #<ASDF/SYSTEM:SYSTEM "xach">
      1: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
   #<CLOSURE (LAMBDA # :IN ASDF/OPERATE:OPERATE) {1006713E1B}> :OVERRIDE
   NIL :KEY NIL)
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL #<ASDF/SYSTEM:SYSTEM "xach">)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT #<ASDF/SYSTEM:SYSTEM "xach"> NIL)
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
        #<ASDF/SYSTEM:SYSTEM "xach">
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned
      #<ASDF/SYSTEM:SYSTEM "xach">
 2: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL ASDF/USER::ALEXANDRIA)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT ASDF/USER::ALEXANDRIA NIL)
     4: (ASDF/FIND-COMPONENT:FIND-COMPONENT "alexandria" NIL)
       5: (ASDF/SYSTEM:FIND-SYSTEM "alexandria" NIL)
  6: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
      #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM)
        {100674B14B}>
      :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "alexandria"))
    7: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
        #<CLOSURE (LAMBDA # :IN ASDF/FIND-SYSTEM:LOCATE-SYSTEM)
   {100674EA9B}>
        :OVERRIDE NIL :KEY
        (ASDF/FIND-SYSTEM:LOCATE-SYSTEM "alexandria"))
      8: (QL-DIST:SYSTEM-DEFINITION-SEARCHER "alexandria")
      8: QL-DIST:SYSTEM-DEFINITION-SEARCHER returned NIL
    7: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned NIL NIL NIL NIL NIL
  6: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned NIL
       5: ASDF/SYSTEM:FIND-SYSTEM returned NIL
     4: ASDF/FIND-COMPONENT:FIND-COMPONENT returned NIL
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned NIL
 2: ASDF/FIND-COMPONENT:FIND-COMPONENT returned NIL
 2: (ASDF/SYSTEM:FIND-SYSTEM "alexandria" NIL)
   3: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
       #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM) {1003B7B59B}>
       :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "alexandria"))
   3: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned NIL
 2: ASDF/SYSTEM:FIND-SYSTEM returned NIL
  To load "alexandria":
    Install 1 Quicklisp release:
      alexandria
 2: (QL-DIST:ENSURE-INSTALLED
     #<QL-DIST:RELEASE alexandria-20140616-git / quicklisp 2014-06-16>)
  .
  ; Fetching #<URL "http://beta.quicklisp.org/archive/alexandria/2014-06-16/alexandria-20140616-git.tgz">
  ; 48.58KB
  .
  ==================================================
  .49,749 bytes in 0.05 seconds (971.66KB/sec)
 2: QL-DIST:ENSURE-INSTALLED returned
      #<QL-DIST:RELEASE alexandria-20140616-git / quicklisp 2014-06-16>
  ; Loading "alexandria"
 2: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
     #<CLOSURE (LAMBDA # :IN ASDF/OPERATE:OPERATE) {1005214D9B}> :OVERRIDE
     NIL :KEY NIL)
   3: (ASDF/FIND-COMPONENT:FIND-COMPONENT NIL "alexandria")
     4: (ASDF/FIND-COMPONENT:FIND-COMPONENT "alexandria" NIL)
       5: (ASDF/SYSTEM:FIND-SYSTEM "alexandria" NIL)
  6: (ASDF/CACHE:CALL-WITH-ASDF-CACHE
      #<CLOSURE (LAMBDA # :IN ASDF/SYSTEM:FIND-SYSTEM)
        {100521B27B}>
      :OVERRIDE NIL :KEY (ASDF/SYSTEM:FIND-SYSTEM "alexandria"))
  6: ASDF/CACHE:CALL-WITH-ASDF-CACHE returned NIL
       5: ASDF/SYSTEM:FIND-SYSTEM returned NIL
     4: ASDF/FIND-COMPONENT:FIND-COMPONENT returned NIL
   3: ASDF/FIND-COMPONENT:FIND-COMPONENT returned NIL
  Unhandled ASDF/FIND-SYSTEM:MISSING-COMPONENT: Component "alexandria" not found

  Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1002A6B8C3}>
  0: ((LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX))
  1: (SB-IMPL::CALL-WITH-SANE-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {100522493B}>)
  2: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {100522490B}>)
  3: (PRINT-BACKTRACE :STREAM #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDERR* {100013BB83}> :START 0 :FROM :INTERRUPTED-FRAME :COUNT NIL :PRINT-THREAD T :PRINT-FRAME-SOURCE NIL :METHOD-FRAME-STYLE NIL)
  4: (SB-DEBUG::DEBUGGER-DISABLED-HOOK Component "alexandria" not found #<unavailable argument>)
  5: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* Component "alexandria" not found)
  6: (INVOKE-DEBUGGER Component "alexandria" not found)
  7: (ERROR ASDF/FIND-SYSTEM:MISSING-COMPONENT :REQUIRES "alexandria")
  8: ((:METHOD ASDF/OPERATE:OPERATE (SYMBOL T)) ASDF/LISP-ACTION:LOAD-OP "alexandria" :VERBOSE NIL) [fast-method]
  9: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> ASDF/LISP-ACTION:LOAD-OP "alexandria" :VERBOSE NIL)
  10: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
  11: (SB-DEBUG::TRACE-CALL #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)
  12: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)) #<NULL-LEXENV>)
  13: (EVAL (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)))
  14: (SB-IMPL::ENCAPSULATION #<CLOSURE (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {1005214D9B}> :OVERRIDE NIL :KEY NIL)
  15: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "alexandria" :VERBOSE NIL) [fast-method]
  16: (QUICKLISP-CLIENT::CALL-WITH-MACROEXPAND-PROGRESS #<CLOSURE (LAMBDA NIL :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY) {1005214D3B}>)
  17: (QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES "alexandria" :PROMPT NIL)
  18: ((FLET #:LAMBDA445 :IN QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES) Component ASDF/USER::ALEXANDRIA not found, required by #<SYSTEM "xach">)
  19: (SIGNAL Component ASDF/USER::ALEXANDRIA not found, required by #<SYSTEM "xach">)
  20: (ERROR ASDF/FIND-COMPONENT:MISSING-DEPENDENCY :REQUIRED-BY #<ASDF/SYSTEM:SYSTEM "xach"> :REQUIRES ASDF/USER::ALEXANDRIA)
  21: (ASDF/FIND-COMPONENT:RESOLVE-DEPENDENCY-NAME #<ASDF/SYSTEM:SYSTEM "xach"> ASDF/USER::ALEXANDRIA NIL)
  22: (ASDF/PLAN:MAP-DIRECT-DEPENDENCIES #<ASDF/PLAN:SEQUENTIAL-PLAN {1006716B63}> #<ASDF/LISP-ACTION:PREPARE-OP > #<ASDF/SYSTEM:SYSTEM "xach"> #<CLOSURE (LAMBDA (ASDF/PLAN::O ASDF/PLAN::C) :IN ASDF/PLAN:TRAVERSE-ACTION) {1006741C2B}>)
  23: ((LAMBDA NIL :IN ASDF/PLAN:TRAVERSE-ACTION))
  24: ((:METHOD ASDF/PLAN:CALL-WHILE-VISITING-ACTION (ASDF/PLAN:PLAN-TRAVERSAL T T T)) #<ASDF/PLAN:SEQUENTIAL-PLAN {1006716B63}> #<ASDF/LISP-ACTION:PREPARE-OP > #<ASDF/SYSTEM:SYSTEM "xach"> #<CLOSURE (LAMBDA NIL :IN ASDF/PLAN:TRAVERSE-ACTION) {1006741BCB}>) [fast-method]
  25: (ASDF/PLAN:MAP-DIRECT-DEPENDENCIES #<ASDF/PLAN:SEQUENTIAL-PLAN {1006716B63}> #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> #<CLOSURE (LAMBDA (ASDF/PLAN::O ASDF/PLAN::C) :IN ASDF/PLAN:TRAVERSE-ACTION) {10067257CB}>)
  26: ((LAMBDA NIL :IN ASDF/PLAN:TRAVERSE-ACTION))
  27: ((:METHOD ASDF/PLAN:CALL-WHILE-VISITING-ACTION (ASDF/PLAN:PLAN-TRAVERSAL T T T)) #<ASDF/PLAN:SEQUENTIAL-PLAN {1006716B63}> #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> #<CLOSURE (LAMBDA NIL :IN ASDF/PLAN:TRAVERSE-ACTION) {100672576B}>) [fast-method]
  28: ((:METHOD ASDF/PLAN:MAKE-PLAN (T ASDF/OPERATION:OPERATION ASDF/COMPONENT:COMPONENT)) NIL #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> :VERBOSE NIL) [fast-method]
  29: ((:METHOD ASDF/OPERATE:OPERATE (ASDF/OPERATION:OPERATION ASDF/COMPONENT:COMPONENT)) #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> :VERBOSE NIL) [fast-method]
  30: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> :VERBOSE NIL)
  31: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
  32: (SB-DEBUG::TRACE-CALL #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)
  33: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)) #<NULL-LEXENV>)
  34: (EVAL (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)))
  35: (SB-IMPL::ENCAPSULATION #<CLOSURE (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {1006713E1B}> :OVERRIDE NIL :KEY NIL)
  36: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) #<ASDF/LISP-ACTION:LOAD-OP :VERBOSE NIL> #<ASDF/SYSTEM:SYSTEM "xach"> :VERBOSE NIL) [fast-method]
  37: ((SB-PCL::EMF ASDF/OPERATE:OPERATE) #<unused argument> #<unused argument> ASDF/LISP-ACTION:LOAD-OP "xach" :VERBOSE NIL)
  38: ((LAMBDA NIL :IN ASDF/OPERATE:OPERATE))
  39: (ASDF/CACHE:CALL-WITH-ASDF-CACHE #<CLOSURE (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {10066F0CDB}> :OVERRIDE NIL :KEY NIL)
  40: (SB-DEBUG::TRACE-CALL #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)
  41: (SB-INT:SIMPLE-EVAL-IN-LEXENV (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)) #<NULL-LEXENV>)
  42: (EVAL (SB-DEBUG::TRACE-CALL (QUOTE #<SB-DEBUG::TRACE-INFO ASDF/CACHE:CALL-WITH-ASDF-CACHE>)))
  43: (SB-IMPL::ENCAPSULATION #<CLOSURE (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {10066F0CDB}> :OVERRIDE NIL :KEY NIL)
  44: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "xach" :VERBOSE NIL) [fast-method]
  45: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "xach" :VERBOSE NIL) [fast-method]
  46: (QUICKLISP-CLIENT::CALL-WITH-MACROEXPAND-PROGRESS #<CLOSURE (LAMBDA NIL :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY) {10065B765B}>)
  47: (QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES "xach" :PROMPT NIL)
  48: ((:METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION (T T)) #<unavailable argument> #<CLOSURE (FLET QUICKLISP-CLIENT::QL :IN QUICKLISP-CLIENT:QUICKLOAD) {1005DE2FEB}>) [fast-method]
  49: ((:METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION :AROUND (QL-IMPL:SBCL T)) #<QL-IMPL:SBCL {1002D897B3}> #<CLOSURE (FLET QUICKLISP-CLIENT::QL :IN QUICKLISP-CLIENT:QUICKLOAD) {1005DE2FEB}>) [fast-method]
  50: ((:METHOD QUICKLISP-CLIENT:QUICKLOAD (T)) #<unavailable argument> :PROMPT NIL :VERBOSE NIL) [fast-method]
  51: (QL-DIST::CALL-WITH-CONSISTENT-DISTS #<CLOSURE (LAMBDA NIL :IN QUICKLISP-CLIENT:QUICKLOAD) {1005DCA31B}>)
  52: (SB-INT:SIMPLE-EVAL-IN-LEXENV (QUICKLISP-CLIENT:QUICKLOAD :XACH) #<NULL-LEXENV>)
  53: (EVAL (QUICKLISP-CLIENT:QUICKLOAD :XACH))
  54: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:LOAD . "/Users/xach/asdf-3.1.2.6.fasl") (:LOAD . "setup.lisp") (:EVAL . "(trace ql-dist:ensure-installed ql-dist:system-definition-searcher asdf:find-system asdf::find-component asdf::call-with-asdf-cache)") (:EVAL . "(ql:quickload :xach)") (:QUIT)))
  55: (SB-IMPL::TOPLEVEL-INIT)
  56: ((FLET #:WITHOUT-INTERRUPTS-BODY-58 :IN SAVE-LISP-AND-DIE))
  57: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE))

What should I do so that the new system is visible?

(Also, why is (find-system "asdf") called 55 times for such a simple system?)

Revision history for this message
Zach Beane (xach) wrote :

I think I've worked around this locally by not trying to install from the error handler, instead keeping a stack of stuff to install and pushing to it from the handler. That way things unwind before trying again.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote : Re: [Bug 1335323] Re: ASDF 3.1.x cache inhibits loading stuff on demand?

Zach Beane wrote:
> I think I've worked around this locally by not trying to install from
> the error handler, instead keeping a stack of stuff to install and
> pushing to it from the handler. That way things unwind before trying
> again.
>

OK. I am trying to put together a minimal test case to add to the test suite.

Would you mind dropping the code for your error-handler in here so I can see it?

I would have thought that fixing an error return from ASDF:FIND-SYSTEM by installing and retrying would work, but perhaps there's some tricky internal state.

Also, what do you mean by "installing"? If it's just adding to the set of installed systems, and then retrying the FIND-SYSTEM, that seems reasonable. But if you are installing the files and doing some building and loading, it's easy for me to believe that things would go pear-shaped.

Revision history for this message
Zach Beane (xach) wrote :

Here's the code:

(defun autoload-system-and-dependencies (name &key prompt)
  "Try to load the system named by NAME, automatically loading any
Quicklisp-provided systems first, and catching ASDF missing
dependencies too if possible."
  (setf name (string-downcase name))
  (with-simple-restart (abort "Give up on ~S" name)
    (let ((strategy (compute-load-strategy name))
          (tried-so-far (make-hash-table :test 'equalp)))
      (show-load-strategy strategy)
      (when (or (not prompt)
                (press-enter-to-continue))
        (tagbody
         retry
         (handler-bind
             ((asdf:missing-dependency-of-version
               (lambda (c)
                 ;; Nothing Quicklisp can do to recover from this, so
                 ;; just resignal
                 (error c)))
              (asdf:missing-dependency
               (lambda (c)
                 (let ((parent (asdf::missing-required-by c))
                       (missing (asdf::missing-requires c)))
                   (when (typep parent 'asdf:system)
                     (if (gethash missing tried-so-far)
                         (error "Dependency looping -- already tried to load ~
                                 ~A" missing)
                         (setf (gethash missing tried-so-far) missing))
                     (autoload-system-and-dependencies missing
                                                       :prompt prompt)
                     (go retry))))))
           (apply-load-strategy strategy)))))
    name))

APPLY-LOAD-STRATEGY will install new things if they are available in Quicklisp.

By "installing" I mean downloading a tgz file, unpacking it, and making it visible via QL-DIST:SYSTEM-DEFINITION-SEARCHER, which is part of asdf:*system-definition-search-functions*.

Revision history for this message
Zach Beane (xach) wrote :

It seems to me like ASDF is essentially priming its cache with failed lookups when it does RESOLVE-DEPENDENCY-NAME for each depended-on system.

Revision history for this message
Faré (fahree) wrote :

I'm not sure what you're trying to do and how.

The obvious extension point for ASDF is the asdf/find-system:*system-definition-search-functions* — if you register a search function there (possibly at the end) that does the installation, then it will return the system object (or pathname to the system), and the cache will be primed proprely. If you don't want to permanently modify s-d-s-f, nstead of this handler-bind, you could thus bind s-d-s-f to a variant with your search function appended. Or you really don't want to modify s-d-s-f, you could override search-for-system-definition to add your magic function before the end.

I don't understand why you're not using this extension point, but assuming your problem is that the cache gets primed with nil, the solution would be to clear the appropriate cache entry with
      (unset-asdf-cache-entry `(locate-system ,name))
      (unset-asdf-cache-entry `(find-system ,name))

Revision history for this message
Zach Beane (xach) wrote :

I have added my own system search function to *system-definition-search-functions*. It is named QL-DIST:SYSTEM-DEFINITION-SEARCHER.

It is traced in the first session I pasted.

Here is what happens:

1 Attempt to load system "xach", which depends-on alexandria

2 asdf calls find-system for "alexandria" during a resolve-dependency-name step, SYSTEM-DEFINITION-SEARCHER is called but since the project is not installed yet it returns NIL, and so does find-system overall. This NIL is cached.

3 asdf calls find-system for "alexandria" in order to find and load it, and find-system returns the cached NIL

4 asdf signals MISSING-COMPONENT error, which Quicklisp handles via handler-bind

5 Quicklisp downloads and installs alexandria in a way that is visible to SYSTEM-DEFINITION-SEARCHER

6 From the error handler, in a handler-bind, Quicklisp attempts to asdf:load-system alexandria

7 The cached NIL result inhibits discovery of the newly discovered system; SYSTEM-DEFINITION-SEARCHER is not called again

One workaround is to just gather data from the MISSING-COMPONENT and let the stack unwind, rather than recursively trying to find more stuff within the scope of the initial cache.

Revision history for this message
Faré (fahree) wrote :

OK, I think the solution is that (find-system name nil) should not cache negative results, unlike (find-system name t).

A new fallback case to the (return (cond ...)) of the final find-system method could use (return-from find-system nil) to short-circuit the caching. Zach, does that solve your issue?

Of course, I'm wondering: why don't these resolve-dependency-name calls cause their respective systems to be installed by your s-d-s-f hook before they return nil?

Revision history for this message
Zach Beane (xach) wrote :

If you can provide a patch against 3.1.2.6 for me to try, I can test it.

The Quicklisp system definition search function is not intended to install things; it's not an ensure-system function, but a find-system function. quickload provides the context for loading things on demand.

Revision history for this message
Faré (fahree) wrote :

Please try this patch, that disable negative caching.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

I am attaching a draft test which I tried to use to replicate the error. This test does not detect an error, so somehow I'm using a different code path. Thanks.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

OK. Here's a new version of the test, that does show the bug.?field.comment=OK. Here's a new version of the test, that does show the bug, and verifies that it requires cache usage that comes with LOAD-SYSTEM. I believe that this can serve as a minimal replication of the bug.

Revision history for this message
Faré (fahree) wrote :

I'm not sure we should call it a "bug" vs a "new feature request". It's not obvious to me why ASDF shouldn't cache negative hits and let quicklisp clear the relevant cache lines if it wants to. The patch I posted is to confirm that this is indeed the issue, but need not be "the" solution.

About your test:
* the in-package is redundant
* in your handler-bind(s), you probably want an (assert ...) around the find-system.
* I don't understand the purpose of repeating the code
* you may or may not be aware that there is an implicit with-asdf-cache around the entire test

Revision history for this message
Zach Beane (xach) wrote :

Is the behavior of asdf:*system-definition-search-functions* documented with respect to the caching? As a longtime user of that interface, I expected my functions to be called every time.

Revision history for this message
Faré (fahree) wrote :

I don't believe the current behavior is documented. As far as I can tell, ASDF always reserves the right to cache everything. Caching is essential for the performance of ASDF 3. Without the cache, performance would go from O(n) to at least O(n^2) and maybe much worse — and was indeed an order of magnitude slower on actual systems in some configurations. With the cache, ASDF 3 is of comparable speed with ASDF 2 despite doing much more, for the sake of correctness.

So far, there is caching for both find-system and locate-system — see how they use with-asdf-cache. Actually, the general purpose cache on find-system catches cases of infinite loops for which special structures were used in ASDF 2 (see with-system-definition in ASDF 2.016 and later), as notably reported by you in the context of using Quicklisp.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

One thing I'm wondering is: for the ordinary ASDF user (as opposed to, e.g., ITA), is the caching a net win? It certainly complicates the behavior and makes it history-dependent.

Fare, when you were building this, did you get a sense of how big the search space had to be before caching made a significant difference?

What would happen if this caching was off by default, and we put it on only when detecting a large search space?

I'd like to get a better sense that the proposed patch represents a principled solution to the stale cache issue, rather than a one-off fix for a particular problem.

E.g., what happens if we have a missing-dependency-of-version error and our solution is to install system foo v 1.1 to replace system foo v. 1.0 and the pathname now is foo-1.1? Now we have a stale cache for a return value that's not NIL.

I don't think we can simply clear the cache for the missing system, either, can we? I.e., we might find that in order to install FOO, we also install BAR and BAZ.

Revision history for this message
Zach Beane (xach) wrote :

I can make Quicklisp work without a major change. I just need to switch from handler-bind to handler-case to let the cache go out of scope. I do not need to resort to asdf-3.1-specific cache-clearing code, or wait for any changes from upstream ASDF.

Revision history for this message
Faré (fahree) wrote :

First, understand that the cache is only enabled around a single asdf API call. It doesn't persist from one call to the next. What it does is ensuring that the filesystem is only accessed once per component, and expensive computations only done once (e.g. transitive component-depends-on computations for bundles or warnings check), providing both speed and coherent semantics (and indeed, guaranteed termination) in the face of potential side-effects to the filesystem or configuration in the middle of the build.

Note however that for the sake of faking time notably, the cache is enabled around all asdf test scripts and needs be explicitly disabled when not wanted in the script.

Yes, the cache is important for ordinary users and not just for large users, though it may only save them a tenfold slowdown rather than a hundred-fold slowdown (NB: back when I was writing ASDF 3, my "complex" test system was IOlib, and the cache made a notable difference for it).

Once again, the caching of find-system replaces the old with-system-definitions, without which there are known cases of infinite loops; see notably test/test-xach-update-bug.script

The proposed patch of not doing negative caching should be innocuous enough and not break any existing functionality. I'm just not convince that it's the right thing to do as compared to requiring whoever wants this behavior to explicitly (clear-defined-system name).

If you install foo 1.1 with foo.asd at the same truename as the previous 1.0, asdf will see the change. If the truename has changed, it won't see the new one unless you initialize-source-registry.

If you somehow filled the cache line for BAR and BAZ with NIL, you may need to clear the cache line if you install them within the same session. What I don't understand is why, if Quicklisp has a function in s-d-s-f, said function ever returns NIL on a system that is not installed yet rather than install the system and return it.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

Actually, an even more obvious case: when installing FOO, we also install FOO/TEST, FOO/UTILS, FOO/DOCS.

Do we simply need an API function to smash the *ASDF-CACHE* altogether, and recommend that people do this when handling missing-component errors?

Revision history for this message
Faré (fahree) wrote :

Zach: if you code depends on things not being cached, you may want to explicitly wrap your code inside a (let ((asdf/cache:*asdf-cache* nil)) ...), or else you'll experience "interesting" bugs. If you want to support ASDF 2 (I don't — Robert, do you?), you'll have to prefix the binding with #+asdf3.

Robert: when we reload foo/test, we'll first reload foo (see the first test in the main find-system method), so that part is OK. So far, there is no API function to smash the cache altogether, except to explicitly set or bind *asdf-cache*. For the binding, you could add a :disabled argument to with-asdf-cache, for instance.

I don't know what to recommend for handling missing-component errors. My first idea would be to recommend that a s-d-s-f function should never signal such an error for a system it will provide in the same cache session — but just install and return the system before to return from the function. But I admit I haven't tried, and I don't understand the design of Quicklisp.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

Perhaps a better idea: should we provide a RETRY restart outside the scope of the with-asdf-cache? Then one could establish a handler to add new systems and invoke the RETRY restart?

Actually, if we were to do that in OPERATE, we would have to flip the order of WITH-ASDF-CACHE and LET, but that shouldn't upset anything.

Revision history for this message
Faré (fahree) wrote :

How do you know you're outside the scope of a wider with-asdf-cache? Or do you first bind *asdf-cache* to nil then use with-asdf-cache to bind it to a hash-table? That's ugly. And what do you put in your RETRY?

If what you want is clear some cache lines, by golly, clear those cache lines! And if you believe there should be no negative caching, apply my patch — but I believe negative caching within a local session is usually a good thing.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

As far as I could tell, the establishment of the ASDF cache is in the top level invocation of OPERATE, which is not invoked recursively. So can't we put such a restart up there, allowing potentially unbounded modifications to the ASDF loading configuration?

I still don't see how we can establish an exhaustive set of cache lines that should be cleared. What's the algorithm for computing the set of cache lines that are stale? I'd certainly prefer to clear selectively, but without such an algorithm, the only solution that's sound is to clear the cache completely.

Revision history for this message
Faré (fahree) wrote :

grep finds 5 occurrences of with-asdf-cache, at various entry points in the nexus of asdf functions. It's definitely not just for operate, and any of these functions can potentially cause the other functions to be called:

find-system
load-asd
locate-system
register-system-definition
operate

I have no idea what kind of restart you want and for what purpose. Maybe it's call-with-asdf-cache itself that needs a restart?

I have no idea what "algorithm for computing the set of cache lines that are stale" you are talking about. Ask Zach, he's the one who seems to have systems that appear in the middle of a session — something I think is a bad idea.

Revision history for this message
Zach Beane (xach) wrote :

I'm happy to just close this issue. I see how to get out of the cache scope on my own without adding any cache invalidation code to my side, and it will work equally well on older ASDFs that do not do the same caching.

I am curious about why (find-system "asdf") is called 55 times, but that's an idle curiosity.

Revision history for this message
Faré (fahree) wrote :

Every time you operate, the first thing ASDF 3 does is to upgrade ASDF itself. It not done first but somehow required, the upgrade would completely break the build in midcourse — as happened to me more than once with ASDF 2. The previous solution was to take complicated measures in your build scripts to always attempt to upgrade ASDF first; I found it easier to fix the issue than to document the workaround. The asdf cache makes that cheap: only the first call in a given cache session will entail filesystem search and and possible upgrade of ASDF.

So, if you call operate many times in your cache session, (find-system "asdf") will be called as many times. If some of your systems explicitly depend on asdf, (find-system "asdf") will also be called accordingly.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

Faré wrote:
> I have no idea what "algorithm for computing the set of cache lines that
> are stale" you are talking about. Ask Zach, he's the one who seems to
> have systems that appear in the middle of a session — something I think
> is a bad idea.

I'm afraid I'm suffering a failure of vision here. I can't imagine an
error handler for a missing-component error that would *NOT* cause
systems to appear in the middle of a session. Can you help me out here?
 Is there a better strategy for recovering from a missing-component
condition? Should we instead be forcing system registration when
retrieving missing systems to avoid an inconsistent ASDF cache? E.g.,
groveling around installed directories to find all the ASDF files and
load them? Will that be more efficient than blowing away the cache?

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

Zach Beane wrote:
> I see how to get out of the cache
> scope on my own without adding any cache invalidation code to my side,
> and it will work equally well on older ASDFs that do not do the same
> caching.

Will you please post your strategy for doing this?

If we *do* drop this as not needing a fix, I'd like to know how to
augment the documentation the process of writing a system search
function and a missing component error handler.

Revision history for this message
Zach Beane (xach) wrote :

The strategy is to switch to handler-case, so the stack is unwound out of the cache, rather than handler-bind, where it isn't.

I haven't fully worked out if it's an exact fit, but hope to do so over the weekend.

https://github.com/quicklisp/quicklisp-client/issues/103 is tracking my progress.

Revision history for this message
Faré (fahree) wrote :

Robert, you're right that if missing-component handlers are supposed to provide the component within the handler to be used in the same cache session, we shouldn't do negative caching, and/or we should have the restart reinitialize-source-registry-and-retry blow up the cache in addition to reinitializing the source-registry (and we should rename the restart, though we might have to keep the old name for compatibility's sake).

Once again, I'm not familiar with code that uses this hook, and would prefer if Zach were to tell exactly what hooks he needs into the system, rather than kluge his way around bugs and missing features. We fixed ASDF for the sake of Quicklisp in the past (see 2.015.2), we can do it again. We certainly did add hooks to ASDF for the sake of other extensions (e.g. POIU, ASDF-ENCODINGS, ASDF-FINALIZERS, ASDF-BUNDLE, etc.). There's nothing wrong for Quicklisp to depend on a recently fixed ASDF and provide it, just like it did with 2.014.6 then 2.26.

Revision history for this message
Faré (fahree) wrote :

PS: regarding the number of times (find-system "asdf") is called, mind that each defsystem-depends-on dependency does generate a call to operate and thus such a call to (find-system "asdf"). Once again, this should be innocuous and handled by the cache. If however, you update the asdf code and blow the cache in the middle of the build, it may be upgraded mid-build and then all bets are off and it might all blow up.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

What about this as a solution:

1. We issue guidance that directs handlers of missing-component wishing to supply the missing component to either (a) provide a top-level handler-case that retries everything (thus getting a fresh cache, rather than a stale one) or (b) use reinitialize-source-registry-and-retry;

2. Modify reinitialize-source-registry-and-retry so that it clears the cache. I would suggest that we actually clear all the cache entries EXCEPT ASDF and POIU, for the reasons you articulate above. If a programmer wishes to upgrade ASDF as part of handling this error, he or she must use recovery method 1(a), and not 1(b).

Does this sound like an appropriate solution?

Revision history for this message
Faré (fahree) wrote :

This sounds good. However, we should probably offer something more elaborate than reinitialize-source-registry-and-retry, and offer the choice between (a) a low-level RETRY restart that lets the handler choose exactly what to reinitialize or not to reinitialize, and (b) a "reset everything then retry" option that calls clear-configuration, clrhash the cache (except for asdf itself?), etc., and then retries.

Revision history for this message
Faré (fahree) wrote :

OK, so Robert identified a clear bug in the current setup, as the cached value of (find-system "foo" nil) being returned by with-asdf-cache even when error-p is t, instead of causing an error. So the patch I offered above to disable negative caching is indeed required. I will apply.

Revision history for this message
Faré (fahree) wrote :

Robert, I see you made an incomplete attempt based on my previous patch. I pushed my take on completing it to the
bug1335323 branch.

Revision history for this message
Robert P. Goldman (rpgoldman) wrote :

We have fixed a this bug and a related ASDF caching issue and pushed the patch in 3.1.2.9

Changed in asdf:
milestone: none → asdf3.1.3
status: New → Fix Committed
Changed in asdf:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.