Uploaded image for project: 'Ivy'
  1. Ivy
  2. IVY-1333

Impossible to get artifacts when data has not been loaded for multiple dynamic revisions

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.2.0
    • 2.3.0-RC1
    • None
    • None

    Description

      When some transitive dependencies depend on the same artifact with the same dynamic revision (say, "1.0.0.+"), and some depend on the actual latest version (say, "1.0.0.m4"), sometimes it results in an IllegalStateException:

      java.lang.IllegalStateException: impossible to get artifacts when data has not been loaded. IvyNode = rev#artifact;1.0.0.m4
      	at org.apache.ivy.core.resolve.IvyNode.getArtifacts(IvyNode.java:762)
      	at org.apache.ivy.core.resolve.IvyNode.getSelectedArtifacts(IvyNode.java:739)
      	at org.apache.ivy.core.report.ResolveReport.setDependencies(ResolveReport.java:235)
      	at org.apache.ivy.core.resolve.ResolveEngine.resolve(ResolveEngine.java:238)
      	at org.apache.ivy.Ivy.resolve(Ivy.java:512)
      

      This exception is reproducable for a given combination of artifacts. Changing the dependencies slightly so the module depends directly on a specific version of the artifact seems to fix this problem, as does changing some of the transitive dependencies.

      The issue seems to be caused by the LatestRevisionStrategy comparing two IvyNodes as equal because they have the same resolved id, but their actual IDs differ. The following debug log shows the conflict manager trying to resolve the 1.0.0.+ and 1.0.0.m4 dependencies:

      found conflicting revisions for rev#artifact;1.0.0.m4 in rev#another-artifact;1.0.0.beta: rev#artifact;1.0.0.m4, rev#artifact;1.0.0.m4

      When the LatestRevisionStrategy is asked to pick the latest revision out of those two artifacts, it just chooses the last one in the list (since they compare as equal the order is maintained). At different points in the resolve, the list is passed to the LatestRevisionStrategy in a different order and a different artifact is considered the latest one, so both versions end up being evicted.

      loadData of rev#artifact;1.0.0.m4 of rootConf=dist
      dist is evicted. Skip loading

      The fix is to make the order deterministic when the resolved ids are equal but unresolved ids are not. A simple hacky workaround is to try the regular comparison, and if that doesn't work, try comparing the real revisions. This seems hacky because the ArtifactInfo class doesn't provide any information about the real revisions, only the resolved revisions. I have a local hacked subclass of LatestRevisionStrategy which fixes this problem, if it helps.

      Attachments

        1. MaybeFixedLatestRevisionStrategy.java
          2 kB
          Nicholas Hinds
        2. ErrorTest.zip
          6 kB
          Nicholas Hinds
        3. anterror.zip
          4 kB
          Nicholas Hinds

        Activity

          People

            maartenc Maarten Coene
            nhinds Nicholas Hinds
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: