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.

Reply via email to