Am 04.04.2016 um 03:21 schrieb Henrik Lindberg: >>> We are happy if we initially only get 5-10% out of this... >> >> And this is where I currently disagree. Very often I invest lots of time >> for just 1%. But being able to run without a fragile caching layer could >> be worth even 50% as long as I'm able to scale. When someone has to stop >> a deployment chain because he needs to troubleshoot a caching layer, >> lot's of people are sitting around and cannot work. Ask them whether >> they would have preferred to buy more hardwar. >> > > We have to start somewhere and when doing so we want to apply the KISS > principle. The intent is for puppet server to automatically keep the XPP > files in sync. There may be no need for "caching" - it is simply done as > a step in atomic deploy of modified puppet code.
Details apart it seems that what we disagree on is "caching", more on this (and a related proposal) below. Btw, until now I experienced "real" atomic deploys only in non-standard environments. Everything that would currently automagically let files pop up in module directories would have a very good chance to cause trouble for a lot of environments with something I'd like to name "custom-tuned" deployments. >> So, where will this transit phase lead to? That's IMO the question that >> many would love to see answered. Will ruby still be there? So where is >> the transition? If it won't, how would it's successor look like? I guess >> you know what I mean, please enlighten us! >> > > It is too premature to describe this in detail. Happy to share the ideas > which we plan to pursuit though. > > At this point we have decided to try an approach where the c++ compiler > will use an RPC mechanism to talk to co-processors. When doing so it > will use the same serialization technology that is used in XPP > (basically based on the Puppet Type System). (Rationale: linking native > things into the same memory image is complex and creates vulnerabilities). Honestly, I expected a little bit more on this. An "RPC mechanism to talk to co-processors" is pretty far from what I'd call an idea of how it should work in future. Sorry for insisting, but this is IMO one of the most essential questions the "we are moving to C++" strategy should be able to answer. To me, faster compilation for the cost of slower data lookups might eventually not give a very good deal, just to give one example of my concerns. Same for "forking" a replacement for custom functions. Running co-processors sounds good at first, but after a single catalog build they would be as dirty as they are now. And there will still be different environments and versions for the very same "function". Everything but a new fork at every run would have it's own drawbacks and issues, wouldn't it? As long as "custom functions" or their replacement will be able to generate resources (what many of them do), they will have strong influence on the generated catalog. They are also the main reason while caching catalogs rarely made any sense. Many of the external factors have an unpredictable influence on them, with Facter and Hiera of course being the most prominent ones. But back to what this section was all about: the "ruby successor". It doesn't have to be immediately, but please try to figure out whether you could tell us a little bit more on this. Currently for an outsider it feels like this is still very, very unclear. But going forward and hoping that this issue would silently vanish over time wouldn't work I guess. If no decision has yet been taken, why not share some details about the possible variants that are still in the game? I guess quite some people would love to help out with their ideas, influenced by their very own completely different circumstances. Extensibility and ease of customization to me was one of the key factors of Puppet's success story. No DSL could ever replace this. > That pretty much leaves functions written in Ruby, and hiera backends. > As a hiera backend/data provider can be thought of as functions as well, > we believe that the RPC based approach will work fine. This also to be > continued after XPP (as we then have the serialization/deserialization > parts in place in both the c++ and ruby implementations. RPC like in XML-RPC? Like in forking a Plugin? Like in forking a plugin through a preforking daemon? > In the long run, in general, we want it to be possible to express as > much as possible using the Puppet Language itself, and where that is not > practical, that it is easy to integrate an implementation (written in > c++, ruby, or whatever the logic is best written in for the target). People tend to use custom functions for the most awful hacks you have ever seen. But it works for them, by the end it solves their very own problems. That's what they need Puppet for: getting work done. Sometimes dirty work. There will hardly be SQL-Adapters, memcaches, message queues, LDAP and and and in the Puppet language. > Some clues above to what we are thinking above. Cannot promise when we > have something more concrete to talk about - would love to be able to do > so around next Puppet Conf. I'll be there :) >> I would mostly agree, but experience teaches me to not trust such >> statements. And your problem is: an AST is not data. It cannot be >> represented in a defined structure. And we are in a phase where even >> data types are still subject to change, with lot's of new related >> features in 4.4. All this would affect an AST, wouldn't it? >> > The AST is indeed a data structure, not even a very complicated one. > The rate of change has dramatically gone done. We rarely touch the > grammar and the AST itself, and the last couple of changes have been > additions. This is the benefit of the "expression based approach" taken > in the "future parser" - the semantics are not implemented in the > grammar, and they are not implemented as methods/behavior inside the AST > objects. We are back to XPP. Sorry, my wording wasn't precise enough I guess. The non-data "thing" I meant to talk about was the already parsed and validated AST. So for example I didn't distinguish between lexing and parsing. What I intended to name when I talked about "AST as data" was more "what's written to the XPP file". And from what I understood that will at least be lexed & parsed & validated. Probably not evaluated, because that's where from my understanding the "it's no longer data" starts. If I'm wrong on that: nice. If not, just out of curiosity: is evaluation in Ruby expensive? > The "shipped with modules" is what seems to be what most have concerns > about and where it seems that a "produce all of them at deploy time" is > perceived as far less complex. Let me throw in one more idea. This "produce all of them at deploy time" will probably only work fine if "deploy" describes a specific (atomic, as mentioned before) process. Every possible user interference could be troublesome. Users do not want to see those files, they do not want to pollute their GIT workdirs. So why not "hiding" them completely? Think more of a bytecode-cache like opcache in PHP, rather than .pyc in Python. Doesn't even have to mirror the module directory structure. Could be flat, structured differently, eventually binary... Store "XPP" in a dedicated place, vardir/whatever, with that "place" referring exactly one specific environment (or module) in a specific version. > Basically extrapolated from benchmarks of small/medium catalog > compilation doing non crazy stuff. It assumes though that very long > compilation times are more of the same rather than user "design flaws" > (managing lots of small things vs. larger, poor design of data lookup, > poor algorithms used for data transformation etc.). That's what I experienced too. Catalog compilation is slow, but for me it never turned out to be the root cause of the issues I've met. Sure, it wouldn't hurt if it was a fraction of a second instead of "a few" or "a little bit more than a few" seconds. But I never arrived to a point where I would have said "OMG, we need a faster compiler, otherwise we are lost". So, I have absolutely no problem with any optimizations getting catalogs compiled A LOT faster. But I do not want to pay this with the the potential trouble "yet another caching layer" could bring. I see no problem with "this is the bytecode cache for module X in version Y". But I see a lot of problems with "we store related cache-files directly to our module directories". Imagine someone going there, manually, running "git checkout v4.0.3" for a specific module. Sure, he (or his tool) is then doing it wrong. But that's gonna be hard to argue I guess. > To be continued over beers somewhere... I'd love to join you :) Thomas -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-dev/ndu91a%24km6%241%40ger.gmane.org. For more options, visit https://groups.google.com/d/optout.