the comment was for libraries without context parameters but which would
need to have them added.


On Sun, May 14, 2017 at 11:46 AM, Sameer Ajmani <sam...@golang.org> wrote:

> 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