Yeah, I eventually found out the reason.
The factory method for the *stuff.Stuff object was using a value by 
refecence, produced on a writer goroutine and read by the goroutine that 
handled the multiplexer.Handler() function.
Simply passing by value the variable on stuff.Stuff factory method solved 
the issue.

Il giorno martedì 28 marzo 2017 16:32:45 UTC+2, dja...@gmail.com ha scritto:
>
> ok, 1st guess is wrong.
> do you run your code with race enabled ?
>
> On Tuesday, March 28, 2017 at 4:08:17 PM UTC+3, Danilo Cianfrone wrote:
>>
>> Doesn't work, and doesn't make sense, even.
>> I assume the problem is in the channel, but can't figure out which and 
>> why.
>>
>> Il giorno martedì 28 marzo 2017 14:47:40 UTC+2, dja...@gmail.com ha 
>> scritto:
>>>
>>> >> go func(j tengin.Job) { m.OnJob(j); m.Done() }(job)
>>> func(j tengin.Job) { go func(){ m.OnJob(j); m.Done()}() }(job)
>>>
>>> Djadala
>>> On Tuesday, March 28, 2017 at 3:27:34 PM UTC+3, Danilo Cianfrone wrote:
>>>>
>>>> I'm experiencing a weird bug.
>>>> I have a microservice that uses FBP architecture, with a structure 
>>>> *graph* as main graph and *multiplexer* as first component.
>>>>
>>>> The code is the following:
>>>>
>>>> type graph struct {
>>>> loggable
>>>> fetchable
>>>>
>>>> multiplexer
>>>> fetcher
>>>> nodeEvaluator
>>>> joiner
>>>> treeEvaluator
>>>>
>>>> closed   atomic.Value
>>>> listener atomic.Value
>>>> }
>>>>
>>>> func (g *graph) Submit(job tengin.Job) error {
>>>> if closed := g.closed.Load().(bool); closed {
>>>> return ErrClosed
>>>> }
>>>>
>>>> if err := job.Validate(); err != nil {
>>>> return err
>>>> }
>>>>
>>>> g.Logger.Debug("added new job to the input channel", job.ZapField())
>>>>
>>>> g.multiplexer.Add(1)
>>>> g.multiplexer.Job <- job
>>>> return nil
>>>> }
>>>>
>>>> type multiplexer struct {
>>>> sync.WaitGroup
>>>> loggable
>>>> multiplexerCallbacks
>>>>
>>>> Job        chan tengin.Job
>>>> FetcherOut chan tengin.Job
>>>> NodeOut    chan tengin.Job
>>>> }
>>>>
>>>> func (m *multiplexer) Handler() {
>>>> go func() {
>>>> for job := range m.Job {
>>>> m.Logger.Debug("JOB ARRIVED", job.ZapField())
>>>> go func(j tengin.Job) { m.OnJob(j); m.Done() }(job)
>>>> }
>>>> }()
>>>> }
>>>>
>>>> type Job struct {
>>>> Event ResourceEvent `json:"event"`
>>>> Stuff *stuff.Stuff  `json:"stuff"`
>>>> }
>>>>
>>>> Every Job is submitted in the main graph, and the *graph.Submit()* 
>>>> function 
>>>> writes the incoming Job into the multiplexer Job channel.
>>>> The *multiplexer.Handler() *listens for incoming jobs from the Job 
>>>> channel, and executes the *multiplexer.OnJob() *function *(which is 
>>>> basically state-less).*
>>>>
>>>> Let's say I'm feeding two Jobs to the graph, *Job1 *and *Job2*, where 
>>>> *Job1.Stuff.ID 
>>>> <http://Job1.Stuff.ID> = x *and *Job2.Stuff.ID <http://Job2.Stuff.ID> 
>>>> = y*
>>>> The *multiplexer.Handler() *receives 2 Jobs, but they're *2 instances 
>>>> of Job2!*
>>>>
>>>> In fact, the Logger on *Submit()* prints Job1 and Job2 as one would 
>>>> expect, but the Logger on *Handler() *prints *2 times Job2!*
>>>> Maybe I'm missing something, but *go vet* doesn't highlight any 
>>>> problems.
>>>>
>>>>

-- 
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