<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 9, 2018 at 2:30 AM, Jean-Francois Denise <span dir="ltr">&lt;<a href="mailto:jdenise@redhat.com" target="_blank">jdenise@redhat.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
in the galleon project, in a context where we would not provision a <br>
complete server but just a subset required to run a given configuration, <br>
we have identified a need for subsystems to advertise to the galleon <br>
tooling some modules in addition to the modules galleon discover by <br>
traversing the module dependency tree.<br>
<br>
The first case is DeploymentProcessor injecting modules into the <br>
deployment units (implicit modules).<br>
<br>
The deployment injected ones are not required to be a dependency of the <br>
subsystem module, so galleon has the risk to miss some of them.<br>
<br>
As an example, in logging subsystem we have the following non optional <br>
injected modules :<br>
&quot;org.jboss.logging&quot;,<br>
&quot;org.apache.commons.logging&quot;,<br>
&quot;org.apache.log4j&quot;,<br>
&quot;org.slf4j&quot;,<br>
&quot;org.jboss.logging.jul-to-<wbr>slf4j-stub&quot;<br>
<br>
Some of these modules are direct dependencies of logging subsystem, some <br>
others are indirect dependencies, others could be not present at all in <br>
the module dependency tree (eg: org.jboss.logging.jul-to-<wbr>slf4j-stub).<br>
<br>
So we are thinking at solving this issue in 2 possible ways:<br>
<br>
1) Mandate that all injected modules become dependencies of the <br>
subsystem module at the cost to load some useless modules at runtime.<br>
<br>
2) Possibly better, make the subsystem to call <br>
RuntimeCapability.<wbr>addAdditionalRequiredPackages (package name being <br>
module name) for each injected module. An existing capability or a new <br>
one  would have to be created.<br>
<br>
There is also the case of optional injected module dependencies (eg: ee <br>
subsystem org.glassfish.javax.el, org.eclipse.yasson, ...). We need to <br>
treat them differently. When one is provisioning a server using galleon <br>
he can choose to exclude some packages from the provisioned server. <br>
Optional packages can be excluded without making the provisioned state <br>
invalid (as opposed to required package that can&#39;t be excluded). These <br>
optional implicit dependencies are typical usage of this, they are not <br>
required by the deployment unit to properly operate.<br>
<br>
For these, we plan to use <br>
RuntimeCapability.<wbr>addAdditionalOptionalPackages. We can&#39;t make them <br>
&quot;optional&quot; in JBoss module. When galleon provision a subset of the <br>
server we don&#39;t include all optional dependencies.<br>
<br>
This brings the case of provisioning of optional dependencies present in <br>
JBOSS module.xml.<br>
<br>
We have identified multiple kind of optional dependencies.<br>
<br>
1) The optional dependencies that are referencing modules only in use <br>
when a feature is present in the configuration of the subsystem (eg: jmx <br>
subsystem optional dep on org.jboss.remoting-jmx due to <br>
&lt;remoting-connector/&gt;, remoting subsystem optional dep on <br>
io.undertow.core for &lt;http-connector/&gt;, elytron subsystem optional dep <br>
on org.picketbox for &lt;jacc-policy&gt;)<br>
<br>
In order to have these dependencies to be provisioned with the <br>
subsystem, we can attach thanks to <br>
RuntimeCapability.<wbr>addAdditionalRequiredPackages the modules to the <br>
feature. When the feature is present in the configuration, the module is <br>
no more optional but required.<br>
<br>
2) The optional dependencies that reference modules that are part of <br>
another subsystems and only use if this other subsystem is present (eg: <br>
org.jboss.as.jpa optional dep on org.jboss.as.ejb3, <br>
org.jboss.as.transactions optional dep on org.jboss.remoting). These <br>
ones are simply not taken into account<br>
<br>
3)  The optional dependencies that reference modules that are not part <br>
of another subsystem (so are not provisioned by another source) but are <br>
only meaningful if the other subsystem is present. We call these ones <br>
&quot;passive&quot; (eg: org.jboss.as.weld optional dependency on <br>
org.jboss.as.weld.ejb|jpa|<wbr>beanvalidation|webservices|<wbr>transactions). <br>
&quot;passive&quot; are analyzed. If all their dependencies are present, then they <br>
are included. Some implicit optional dependencies can fall into this <br>
category (eg: org.jboss.jaxrs optional dep on <br>
org.jboss.resteasy.resteasy-<wbr>validator-provider-11).<br>
<br>
The passive optional dependencies would be advertised with <br>
RuntimeCapability.<wbr>addAdditionalPassiveOptionalPa<wbr>ckages(optional <br>
dependency package name).<br>
<br>
So to summarize:<br>
<br>
- RuntimeCapability.<wbr>addAdditionalRequiredPackages for all required <br>
implicit modules<br>
<br>
- RuntimeCapability.<wbr>addAdditionalRequiredPackages to associate optional <br>
dependencies to a feature<br>
<br>
- RuntimeCapability.<wbr>addAdditionalOptionalPackages for all optional <br>
implicit dependencies that are not passive<br>
<br>
- RuntimeCapability.<wbr>addAdditionalPassiveOptionalPa<wbr>ckages for all <br>
optional dependencies (implicit or not) that are passive<br></blockquote><div><br></div><div>A good question Alexey raised is whether the capability is the right concept for encapsulating this information.</div><div><br></div><div>In the end the key point is that the information ends up in the galleon feature-spec. That&#39;s the thing that encapsulates the configuration elements and the packages (i.e. fs content) that are needed to provide a feature. It&#39;s the feature that needs the package. We generate the galleon feature specs from our management model information. When in WF 13 we hit the first must-implement use case for getting additional package info into a feature spec I kind of arbitrarily picked &#39;RuntimeCapability&#39; as the place to record that. It was a reasonable enough choice for that one use case but isn&#39;t great otherwise.</div><div><br></div><div>The alternative is to record this data in the ResourceDefinition, which is the primary source of the data that&#39;s used in the feature spec generation.</div><div><br></div><div>The conceptual argument is a capability is all about a named provider of a contract that other elements of the server can rely on; e.g. some MSC Service with a particular value type that will be exposed.  But this additional package stuff isn&#39;t really about that contract, it&#39;s about other things that will be done that likely are not relevant to other elements of the system.</div><div><br></div><div>A hint of a design smell would be if we end up creating RuntimeCapability instances for no other reason than to record this additional package information. Something I could see happening with this logging case you mentioned at the start.</div><div><br></div><div>I don&#39;t think ResourceDefinition has this problem.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Is it something that subsystems owner would be ready to put in place to <br>
help galleon in this task? It would require a bit of analysis of the <br>
dependencies of your modules but the gain could be quite important. </blockquote><div><br></div><div>Please don&#39;t let my point above derail consideration of this question.  Use of ResourceDefinition vs RuntimeCapability is a relatively small detail. </div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Some <br>
early experimentation of this has shown a big reduction of the server <br>
filesystem footprint (web server + cdi has been reduced from 156MB to <br>
46MB). The runtime memory usage reduction is not that big, but less <br>
modules being loaded we have a gain.<br>
<br>
Thanks for reading.<br>
<br>
JF<br>
<br>
______________________________<wbr>_________________<br>
wildfly-dev mailing list<br>
<a href="mailto:wildfly-dev@lists.jboss.org">wildfly-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/wildfly-dev" rel="noreferrer" target="_blank">https://lists.jboss.org/<wbr>mailman/listinfo/wildfly-dev</a></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Brian Stansberry<div>Manager, Senior Principal Software Engineer</div><div>Red Hat</div></div></div>
</div></div>