Anurag S. Maskey wrote: > > > Stephen Hahn wrote: >> * Anurag S. Maskey <Anurag.Maskey at Sun.COM> [2009-05-04 22:33]: >> >>> NWAM Phase 1 introduces a couple of new SMF services and modifies a >>> few others. These new SMF services have dependencies between each >>> other and existing services. When system/manifest-import runs, it >>> doesn't care about the dependencies. Thus, we have a problem >>> because we want one service online before the second one starts.. >>> >>> Couple of things we have tried (let me illustrate with SMF services >>> A and B where B depends on A (in other words, A must start before >>> B)). manifest-import doesn't care if B was imported and started >>> before A. >>> >>> 1. In B's start method, explicitly enable A. If A is already >>> enabled, it does nothing. Otherwise, A is started. This doesn't >>> work (all the time) because if manifest-import hasn't imported A >>> yet, then the enable finds nothing. >>> >>> Two solutions we're looking at: >>> >>> 1. In B's start method, check if A been enabled (it will be if it >>> has been imported). If not, sleep for a while and check again. If >>> A still hasn't been enabled, exit with an error. We don't want to >>> have a loop here for fear that A may have failed and don't want B to >>> keep checking forever. >>> >>> 2. In B's start method, check if A has been enabled. If not, svccfg >>> import A. The issue here it that it may create a race condition >>> where B imports A and manifest-import is also importing A. I don't >>> see any other scripts (in /lib/svc/method) doing such imports, so >>> what would happen here? Are there any controls to make the import >>> operation exclusive? >>> >>> Is there a different solution to the problem of manifest-import >>> respecting service dependencies? >>> Other comments? >>> >> >> The problem statement mentions dependencies between A and B, but the >> discussion only talks about start method implementations. What are >> the expected dependencies between A and B, and what characteristics do >> the dependencies have? >> > >> For instance, if B requires A, then B will remain offline until A is >> online. No enabling, sleeping, etc. should be required in the start >> method. (Are you seeing other behaviour with a require dependency?) >> > SMF service B required A, and the dependencies were indirect via an > already existing SMF service C (that's also updated). I think this > caused the failure. The problem is that when manifest-import runs the > dependencies with existing services are not respected. > > In the above case, C was already online with the old manifest. Thus, > when B started, it's dependency with C was satisfied and B went online. > And, B assumed that A was already online since C is already online > (albeit with an old manifest). > > This can be solved by have B directly depend on A. > > However, there's still different a problem that still exists with > manifest-import. manifest-import doesn't import the updated manifests > in any particular order. This means that when property/property-groups > are added/removed from manifest, other services cannot assume that the > change has taken place. Again, let me try with example services and > properties: > > SMF service X already exists in the system and is online before > manifest-import runs. SMF service Y is a new service that depends on X > and is introduced by our project. Our project also added a > property-group p to service X. Service Y uses property-group p in its > start method. Now, manifest-import doesn't guarantee that the new > manifest for X is imported before Y's. If the imports happened in that > order, then there's no problem. But, if Y was imported before X, then > Y's start method will look for the property-group p and fail. :(. > There's error in /var/svc/log/Y.log saying "svccfg: property group p > doesn't exist") > > For situations like this, can Y explicitly import X's new manifest? Or, > is it better for Y to simply sleep and wait for X's new manifest to be > imported? (Y can determine whether X's new manifest has been imported > or not by checking for a property in property-group p that it know > should/will exist after the new manifest is imported.) >
If Y does not need to start prior to manifest-import, can you try define a dependency on manifest-import service for service Y? This should make service Y wait until manifest-import service completely imported all new manifests. -tony