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.