Specifically: don't pass nil Contexts. They are not valid, and most code that uses Contexts don't check for nil and will panic. On Sun, May 14, 2017 at 11:43 AM Sameer Ajmani <sam...@golang.org> wrote:
> Generally I'd suggest passing context.Background() when calling functions > that need a context from main or tests. > On Sat, May 13, 2017 at 8:27 AM Peter Weinberger (温博格) <p...@google.com> > wrote: > >> Hi. I was one of the people who failed in an attempt to auto-insert >> contexts in all of google3. I no longer remember all the obstacles I failed >> to overcome, but would encourage others to take on the project. >> >> One issue was libraries that were used both in paths from http requests >> (so they needed the context propagated through them) but were also used in >> places where their callers (starting at main) didn't have any contexts at >> all. Sitting by my coffee this morning this no longer seems like an >> insuperable obstacle (e.g., pass nils and change them to >> context.Background() inside, or, like appengine's log, split packages into >> one that requires contexts and one that doesn't). But I had lots of what I >> thought were plausible ideas that broke on the hard rock of google3, and I >> suspect these would too. >> >> (The project wasn't a total failure. It did plumb contexts through a >> bunch of packages. But the general case was too hard for me.) >> >> On Sat, May 13, 2017 at 3:50 AM, <mhhc...@gmail.com> wrote: >> >>> A reference i found about "reactive programming" >>> https://github.com/dsyer/reactive-notes/blob/master/intro.adoc >>> >>> Hope this introduced the concept correctly, thanks for pointing that. >>> >>> Following are only some thoughts, >>> >>> Two things surprising here, >>> 1/ a programmer prefers not to solve a problem >>> 2/ one failed attempt mean the end of all attempts** >>> >>> That being said, my little understanding so far is that current context >>> is used for two purposes, >>> - cancellation >>> - data (transmission? not sure) (+/- ts, have not checked i expect so in >>> regards to previous referenceS cited) >>> >>> While cancellation is a feature i really want to take advantage of, >>> the other one is much more arguable in the sense that >>> it can remains expressed purely by the end user without bloating >>> his productivity and quality (you don t really need it everywhere, just >>> where it is needed), >>> it seems to be highly software context dependent. >>> >>> Whereas cancellation, while it looks likes simple, is maybe more subtle. >>> After all it is about assigning uuid to a chain of call and >>> appropriately propagate, disjoint/rejoin new uuids with the previous >>> one, >>> so that we can ask to stop execution of a sub selection of a chain of >>> calls >>> via an handle. >>> Am i too simplistic? >>> >>> Its difficulty reside in its requirement to be passed absolutely >>> everywhere, >>> That reveals an important fact about the nature of cancellation, >>> it is there, it is everywhere, at all time (...within the program >>> lifetime), >>> it is somewhere in the background of every ops since the very beginning >>> the program began, >>> but not necessarily enabled, and certainly not a straight line. >>> >>> That is where the syntax might help to establish the plots >>> that the runtime consumes to connect the dots >>> and support what the developers want to achieve, >>> in my understanding so far. >>> >>> My best comparison to cancellation is >>> request rays tracing in micro services oriented architecture, >>> on both end it is a multi-tenant, >>> it always start with one ray, >>> the ray always split into multiple rays, >>> because we do programming, we need ways >>> to create, control distribute existing/new rays, >>> and possibly let the userland introduce a new behavior for the rays. >>> >>> So yeah basically main has a ray, >>> if you process an http request, >>> you to create a new ray >>> to be able to cancel only that request, >>> but it needs to be connected to the main ray >>> because if main should be canceled, >>> that signals should propagate to all rays connected with it, >>> probably. >>> >>> ** i want to put emphasis because in the description provided >>> by Sameer, as i tried to summarize, It has been tried to handle >>> the problem via the type system as if it was >>> a completely defined set of types. >>> Which in go is wrong (yeah i m very affirmative here :), >>> from my understanding, that might be correct in other oop languages. >>> Technically it is possible to rewrite interfaces, methods signatures, >>> taken individually, >>> as a whole, and from the consumer pov, >>> i d say it is an impossible task in go because it it goes against its >>> nature. >>> And i confirm/understand that by reading to Sameer feedback. >>> >>> Notes: i m a strong lover of go type system (not talking about values >>> and pointers ;) >>> >>> >>> On Friday, May 12, 2017 at 4:42:54 PM UTC+2, Henrik Johansson wrote: >>>> >>>> With the whole "Reactive" movement thread locals have started to vanish >>>> at least in the Java ecosystem. >>>> I agree with Sameer that, while convenient, it comes with a whole set >>>> of obscure bugs. >>>> >>>> On Fri, May 12, 2017, 14:57 Sameer Ajmani <sam...@golang.org> wrote: >>>> >>>>> Hmm, I'm not finding good open-source examples of ThreadLocal context >>>>> propagation in C++ and Java. My experience with this is based on what >>>>> Google uses internally. Perhaps someone more familiar with context use >>>>> (tracing?) outside Google can chime in? +Jaana Burcu Dogan >>>>> >>>>> On Thu, May 11, 2017 at 7:02 AM <mhh...@gmail.com> wrote: >>>>> >>>>>> thanks, >>>>>> >>>>>> ..integrating Context into the runtime.. >>>>>> >>>>>> >>>>>> 50% runtime, 50% syntax with explicit contextualization. >>>>>> >>>>>> ..The flow of request processing in Go may include multiple >>>>>> goroutines and may move across channels; >>>>>> >>>>>> >>>>>> yes big ? mark here. might the 50% of an handy and explicit syntax >>>>>> help with it? >>>>>> >>>>>> >>>>>> C++ and Java use thread-local Contexts, and while this is convenient, >>>>>> it is often a source of mysterious bugs. >>>>>> >>>>>> thanks! I don't know them, >>>>>> >>>>>> I quickly checked according to this >>>>>> >>>>>> https://dzone.com/articles/painless-introduction-javas-threadlocal-storage >>>>>> I may have totally wrong, the syntax does not look like, not even >>>>>> from a 100km, >>>>>> to how i represent go contexts in my head. >>>>>> >>>>>> This is more like the actor pattern dave cheney talks about in >>>>>> https://dave.cheney.net/2016/11/13/do-not-fear-first-class-functions >>>>>> (search for Let’s talk about actors) >>>>>> >>>>>> Is the dzone link correctly describe >>>>>> what you mentioned as being go context equivalent in java ? >>>>>> >>>>>> sorry my questions are so basic. >>>>>> >>>>>> >>>>>> On Thursday, May 11, 2017 at 12:29:11 PM UTC+2, Sameer Ajmani wrote: >>>>>> >>>>>>> I think you are asking whether we considered integrating Context >>>>>>> into the runtime, so that it does not need to be passed explicitly. >>>>>>> Yes, we >>>>>>> discussed this, but decided against it. The flow of request processing >>>>>>> in >>>>>>> Go may include multiple goroutines and may move across channels; we >>>>>>> decided >>>>>>> an explicit Context made this much easier to get right. C++ and Java use >>>>>>> thread-local Contexts, and while this is convenient, it is often a >>>>>>> source >>>>>>> of mysterious bugs. >>>>>>> >>>>>> On Thu, May 11, 2017 at 4:08 AM <mhh...@gmail.com> wrote: >>>>>>> >>>>>>>> Thanks a lot! >>>>>>>> >>>>>>>> Might i guess and try to generalize your explanations into >>>>>>>> "we tried to write a plumber for all cases possible" >>>>>>>> >>>>>>>> Which matters a lot, in my humble opinion. >>>>>>>> >>>>>>>> At least for the various reasons you put there, >>>>>>>> simply put, >>>>>>>> because it seems not technically achievable. >>>>>>>> >>>>>>>> Still i m happy you gave me those details, they are of interest >>>>>>>> indeed. >>>>>>>> >>>>>>>> I rather intent to solve the problem on a smaller surface >>>>>>>> with more predictability, less impossible solution to find. >>>>>>>> I hope so. >>>>>>>> And if it saves 90% of the time, that s already a win, imho. >>>>>>>> >>>>>>>> May i ask another question, >>>>>>>> have you considered to create the plumbing >>>>>>>> at runtime rather than statically ? >>>>>>>> With some intents from the syntax, necessarily >>>>>>>> (and yeah go 1 compat will be a problem, let s forget it for 1 >>>>>>>> minute). >>>>>>>> >>>>>>>> I suspect in some aspects in might be handier, >>>>>>>> because it might be all about chained func calls and not type >>>>>>>> system handling, >>>>>>>> and it might be easier to interleave the ctx.check in the flaw of >>>>>>>> ops, >>>>>>>> I don t know enough to realize for sure. >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wednesday, May 10, 2017 at 11:40:27 PM UTC+2, Sameer Ajmani >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Our approach was to identify function calls that consume a Context >>>>>>>>> (indicated by a call to context.TODO in the function body) and >>>>>>>>> function >>>>>>>>> calls that provide a Context (such as RPC and HTTP handlers). Then we >>>>>>>>> use >>>>>>>>> the guru callgraph tool to find all call paths from context providers >>>>>>>>> to >>>>>>>>> context consumers. These are the call paths that need to have a >>>>>>>>> context >>>>>>>>> plumbed through them. >>>>>>>>> >>>>>>>>> Starting from a context consumer, we can work upward to the >>>>>>>>> context provider, adding a context parameter to reach intervening >>>>>>>>> function >>>>>>>>> signature. Replace context.TODO in the consumer function body with >>>>>>>>> the new >>>>>>>>> ctx parameter, then update all the places that call the consumer to >>>>>>>>> pass >>>>>>>>> context.TODO. Now we have a new set of context consumers. Repeat >>>>>>>>> until you >>>>>>>>> reach the context providers (if you reach main or a Test function, >>>>>>>>> pass >>>>>>>>> context.Background instead). >>>>>>>>> >>>>>>>>> This works OK for static function calls but gets messy for dynamic >>>>>>>>> calls. If you need to add a context parameter to an interface method, >>>>>>>>> now >>>>>>>>> you have to update all implementations of that method, too (guru can >>>>>>>>> find >>>>>>>>> these for you). And if that interface is outside your control (like >>>>>>>>> io.Writer), you cannot change its signature, so you have to pass the >>>>>>>>> context some other way (such as via the method receiver). >>>>>>>>> >>>>>>>>> This gets yet more complicated if you cannot make atomic changes >>>>>>>>> to all callers of your functions, because callers may be in other >>>>>>>>> repositories. In this case, you must do an incremental refactoring in >>>>>>>>> multiple steps: each change to a function signature involves adding a >>>>>>>>> new >>>>>>>>> function that has the context parameter, then changing all existing >>>>>>>>> calls >>>>>>>>> to use the new function, while preventing new calls to the old >>>>>>>>> function, so >>>>>>>>> that you can finally delete it. >>>>>>>>> >>>>>>>>> Inside Google, we ended up not needing to build all this: Context >>>>>>>>> was introduced early enough that Go users could plumb it manually >>>>>>>>> where >>>>>>>>> needed. I think a context plumbing tool could still be interesting and >>>>>>>>> useful to other Go users. I'd love to see someone build it! >>>>>>>>> >>>>>>>>> S >>>>>>>>> >>>>>>>>> On Tue, May 9, 2017 at 10:54 AM <mhh...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> > I've done a limited form of this using awk ;-) >>>>>>>>>> >>>>>>>>>> if you have a minute, >>>>>>>>>> >>>>>>>>>> can you tell more about what limited you >>>>>>>>>> in your attempts and which trade made you stop (guessing), >>>>>>>>>> if any ? >>>>>>>>>> >>>>>>>>>> Do you still think it be awesome ? >>>>>>>>>> Or have you made your mind to an opposite position ? >>>>>>>>>> if so, For which reasons? >>>>>>>>>> >>>>>>>>>> My tool is very poor, consider it as on going, a place for >>>>>>>>>> inspiration to get started from absolutely no idea to lets get a >>>>>>>>>> dirty >>>>>>>>>> prototype. >>>>>>>>>> not sure yet how long is going to be the road, still digging :) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Tuesday, May 9, 2017 at 4:25:46 PM UTC+2, Sameer Ajmani wrote: >>>>>>>>>> >>>>>>>>>>> The eg tool can execute simple refactoring steps, but automating >>>>>>>>>>> context plumbing through a chain of calls is an open problem. Alan >>>>>>>>>>> Donovan >>>>>>>>>>> put some thought into this a few years ago, and I've done a limited >>>>>>>>>>> form of >>>>>>>>>>> this using awk ;-) >>>>>>>>>>> >>>>>>>>>> On Tue, May 9, 2017 at 6:10 AM <mhh...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>> I want something similar too. >>>>>>>>>>>> >>>>>>>>>>>> Automatic and smart insertion of context args in a chain of >>>>>>>>>>>> calls. >>>>>>>>>>>> >>>>>>>>>>>> Methods signature updates are easy, but how to appropriately >>>>>>>>>>>> insert context check in the ast ? >>>>>>>>>>>> I m not sure yet. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >The difficulty here seems to differentiate intra package calls >>>>>>>>>>>> from calls to standard/3rd party libraries which shouldn't be >>>>>>>>>>>> having new >>>>>>>>>>>> param. >>>>>>>>>>>> >>>>>>>>>>>> That does not sound too difficult, from the pkg identifier, >>>>>>>>>>>> lookup for the import path, for every import path, exists in >>>>>>>>>>>> GOROOT ? >>>>>>>>>>>> >>>>>>>>>>>> Please put updates here anything you want to share. >>>>>>>>>>>> >>>>>>>>>>>> At that moment i m using this package to help me with ast, >>>>>>>>>>>> https://github.com/mh-cbon/astutil >>>>>>>>>>>> >>>>>>>>>>>> might be a start even though it needs refactoring. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Monday, May 8, 2017 at 1:03:52 AM UTC+2, meir fischer wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> I'm adding tracing to an existing code base with many packages >>>>>>>>>>>>> and it seems the best way to have context's passed around is to >>>>>>>>>>>>> just have >>>>>>>>>>>>> every method take a context.Context. >>>>>>>>>>>>> >>>>>>>>>>>>> Is there any tooling for converting a code base/package to >>>>>>>>>>>>> have: >>>>>>>>>>>>> (a) context.Context as the first parameter in each function - >>>>>>>>>>>>> ctx context.Context >>>>>>>>>>>>> (b) for any function that has changed, have its callers >>>>>>>>>>>>> (within that package) pass ctx as the first arg >>>>>>>>>>>>> >>>>>>>>>>>>> The difficulty here seems to differentiate intra package calls >>>>>>>>>>>>> from calls to standard/3rd party libraries which shouldn't be >>>>>>>>>>>>> having new >>>>>>>>>>>>> param. >>>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>>> Google Groups "golang-nuts" group. >>>>>>>>>>>> >>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>>> it, send an email to golang-nuts...@googlegroups.com. >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>> Google Groups "golang-nuts" group. >>>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>> >>>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "golang-nuts" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "golang-nuts" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golang-nuts...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.