felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Florent BENOIT (JIRA)" <j...@apache.org>
Subject [jira] Commented: (FELIX-2459) Wrong error message on a missing package
Date Thu, 01 Jul 2010 15:24:49 GMT

    [ https://issues.apache.org/jira/browse/FELIX-2459?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12884313#action_12884313
] 

Florent BENOIT commented on FELIX-2459:
---------------------------------------

>Is your bundle reasonably self contained so that you could attach it as an example? 
>Or does it have lots of dependencies that would make it difficult to recreate the situation?


Well my bundle failure was part of a new development in JOnAS ;-)
I think that I can provide you a JOnAS  bundle with this kind of failure. The only step to
reproduce is to download a Nightly snapshot of JOnAS (which is using Felix v3.0.1), replace
a correct bundle and performing "jonas start -debug -p xxx -s y" and then you can remotely
So it's easy to reproduce as we only have to start JOnAS by you need to download some megabytes
;-)

> You raise a very valid point and we should look into seeing if there is a way to improve
how we report such errors.
> It is difficult when resolving bundle dependencies because the resolver algorithm discovers
many errors and it doesn't necessarily 
> have a way of knowing which error is the most important or the "root" error.
> If you could make a reproducible scenario, it would give us a better idea if we were
missing something obvious. At a minimum, we could
> log intermediate errors (although I'd worry about logging too much). Regardless, we can
try to look into improving the situation.

In my case, the first error thrown was my "root cause" and the other one were some kind of
effects of this first failure but maybe the first error is not a correct one for all cases
?
It would be interesting also if I could have a list of missing dependencies instead of only
one missing dependency.
When we integrate/develop some bundles with many dependencies (and when the dependencies are
not well done), we have situations where we need to avoid or make optional some imports.
But we need to repeat the step for each import that needs to be fixed as Felix report only
one failure at each time. Also, I would know which package is requiring my missing package
and maybe a list of packages that have a dependencies on this missing package
With this information, I could figure if I should provide or make optional this package. And
with a good report from Felix, I could go faster than today.




> Wrong error message on a missing package
> ----------------------------------------
>
>                 Key: FELIX-2459
>                 URL: https://issues.apache.org/jira/browse/FELIX-2459
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-3.0.1
>            Reporter: Florent BENOIT
>             Fix For: framework-3.2.0
>
>
>   Hi,
> Here is the case :
>  I have one bundle with a missing import, I need to fix the bundle but Felix 3.0.1 is
not helping me with the errors that are thrown. (the missing package required to start my
bundle is "org.apache.juli.logging") and this missing package is not reported as a missing
package in 3.0.1 while it was reported with Felix 2.0.5
> When testing this bundle with Felix 3.0.1, I get the following message :
> org.osgi.framework.BundleException: Unresolved constraint in bundle xxx [89]: Unable
to resolve 89.0: missing requirement [89.0] package; (&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0))
- [89.0] package; (&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0))
> 	at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3421)
> 	at org.apache.felix.framework.Felix.startBundle(Felix.java:1754)
> 	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)
> This package (org.apache.catalina.tribes.group.interceptors) is present in my bundle
archive. 
> It tells me that a requirement is not available but I don't know which package is missing
which is a big problem as it's quite difficult to fix an issue when there is a missing information
> By switching back to Felix v2.0.5, I have the following error :
> org.osgi.framework.BundleException: Unresolved constraint in bundle xxx [89]: package;
(package=org.apache.juli.logging)
> 	at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3299)
> 	at org.apache.felix.framework.Felix.startBundle(Felix.java:1657)
> 	at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)
> And now, we can see that the missing package is printed
> By adding some breakpoint in Felix 3.0.1, I can see that the original error is raised
in ResolverImpl class but then this error is ignored
> Here is the code that is raising my expecting missing package :
>             if ((candidates.size() == 0) && !req.isOptional())
>             {
>                 ResolveException ex =
>                     new ResolveException("Unable to resolve " + module
>                         + ": missing requirement " + req, module, req);
>                 resultCache.put(module, ex);
>                 m_logger.log(Logger.LOG_DEBUG, "No viable candidates", ex);
>                 throw ex;
>             }
> The exception which is built here is :
> org.apache.felix.framework.resolver.ResolveException: Unable to resolve 89.0: missing
requirement [89.0] package; (package=org.apache.juli.logging)
> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 437

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.resolve(Resolver$ResolverState, Module) line: 78	
> 	Felix$FelixResolver.resolve(Module) line: 4005	
> 	Felix.resolveBundle(BundleImpl) line: 3414	
> 	Felix.startBundle(BundleImpl, int) line: 1754	
> 	BundleImpl.start(int) line: 905	
> But this issue is ignored at the line 422 by the following code :
>                     try
>                     {
>                         populateCandidates(state, candCap.getModule(),
>                             candidateMap, resultCache);
>                     }
>                     catch (ResolveException ex)  <--- silently catched
>                     {
>                         // Remove the candidate since we weren't able to
>                         // populate its candidates.
>                         itCandCap.remove();
>                     }
> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 422

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, Map) line: 415

> 	ResolverImpl.resolve(Resolver$ResolverState, Module) line: 78	
> 	Felix$FelixResolver.resolve(Module) line: 4005	
> 	Felix.resolveBundle(BundleImpl) line: 3414	
> 	Felix.startBundle(BundleImpl, int) line: 1754	
> 	BundleImpl.start(int) line: 905	
> Then I get an error by Felix but not the original root cause which is a problem for me
> I get at these lines :
> ex = org.apache.felix.framework.resolver.ResolveException: Unable to resolve 89.0: missing
requirement [89.0] package; (&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0))
>                             catch (ResolveException ex)
>                             {
>                                 if ((ex.getRequirement() != null)
>                                     && (ex.getRequirement() instanceof FragmentRequirement)
>                                     && (rootModule !=
>                                         ((FragmentRequirement) ex.getRequirement()).getFragment()))
>                                 {
>                                     m_resolverState.detachFragment(
>                                         newRootModule,
>                                         ((FragmentRequirement) ex.getRequirement()).getFragment());
>                                     repeat = true;
>                                 }
>                                 else
>                                 {
>                                     throw ex;
>                                 }
>                             }
> 	Felix$FelixResolver.resolve(Module) line: 4013	
> 	Felix.resolveBundle(BundleImpl) line: 3414	
> 	Felix.startBundle(BundleImpl, int) line: 1754	
> 	BundleImpl.start(int) line: 905	
> and this is the error which is reported to me, but this can't help me as the true missing
package has been lost.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message