Ug.. I'll look at this tomorrow (12:30 is a bad time for me to be diving
into windows API BS)

On Mon, May 23, 2016 at 11:40 PM David Cheney <david.che...@canonical.com>
wrote:

> TL;DR read issue https://bugs.launchpad.net/bugs/1581337
>
> Thumper asked me to forward this to juju-dev for discussion
>
>
> http://reports.vapour.ws/releases/3964/job/run-unit-tests-win2012-amd64/attempt/2384
>
> Fails because, npipe.Accept is blocking on accept
>
> goroutine 41 [syscall, locked to thread]:
> syscall.Syscall(0x7f8139f102c, 0x2, 0x1a8, 0xffffffff, 0x0,
> 0xc082183de8, 0x3e5, 0x1c0050)
>  C:/Go/src/runtime/syscall_windows.go:163 +0x5c
> syscall.WaitForSingleObject(0x1a8, 0xc0ffffffff, 0xc082183e10, 0x0, 0x0)
>  C:/Go/src/syscall/zsyscall_windows.go:693 +0x6f
> gopkg.in/natefinch/npipe%2ev2.waitForCompletion(0x15c, 0xc0822a42a0,
> 0xc08202b880, 0x0, 0x0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/natefinch/npipe.v2/npipe_windows.go:181
> +0x45 <http://gopkg.in/natefinch/npipe.v2/npipe_windows.go:181+0x45>
> gopkg.in/natefinch/npipe%2ev2.(*PipeListener).AcceptPipe(0xc08202b880,
> 0x0, 0x0, 0x0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/natefinch/npipe.v2/npipe_windows.go:307
> +0x397 <http://gopkg.in/natefinch/npipe.v2/npipe_windows.go:307+0x397>
> gopkg.in/natefinch/npipe%2ev2.(*PipeListener).Accept(0xc08202b880,
> 0x0, 0x0, 0x0, 0x0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/natefinch/npipe.v2/npipe_windows.go:261
> +0x44 <http://gopkg.in/natefinch/npipe.v2/npipe_windows.go:261+0x44>
>
> github.com/juju/juju/worker/metrics/spool.(*socketListener).loop(0xc08227e780
> ,
> 0x0, 0x0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/spool/listener.go:71
> +0xaa
> <http://github.com/juju/juju/worker/metrics/spool/listener.go:71+0xaa>
>
> github.com/juju/juju/worker/metrics/spool.NewSocketListener.func1(0xc08227e780)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/spool/listener.go:43
> +0x65
> <http://github.com/juju/juju/worker/metrics/spool/listener.go:43+0x65>
> created by github.com/juju/juju/worker/metrics/spool.NewSocketListener
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/spool/listener.go:44
> +0x140
> <http://github.com/juju/juju/worker/metrics/spool/listener.go:44+0x140>
>
> and
>
> socketListener is waiting on the tomb to hit done.
>
> goroutine 43 [chan receive]:
> launchpad.net/tomb.(*Tomb).Wait(0xc08227e790, 0x0, 0x0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> launchpad.net/tomb/tomb.go:108
> +0x5f <http://launchpad.net/tomb/tomb.go:108+0x5f>
>
> github.com/juju/juju/worker/metrics/spool.(*socketListener).Stop(0xc08227e780)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/spool/listener.go:56
> +0x18c
> <http://github.com/juju/juju/worker/metrics/spool/listener.go:56+0x18c>
> github.com/juju/juju/worker/metrics/sender.(*sender).stop(0xc082269770)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/sender/sender.go:104
> +0x45
> <http://github.com/juju/juju/worker/metrics/sender/sender.go:104+0x45>
>
> github.com/juju/juju/worker/metrics/sender.(*sender).(github.com/juju/juju/worker/metrics/sender.stop)-fm()
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/sender/manifold.go:77
> +0x27
> <http://github.com/juju/juju/worker/metrics/sender/manifold.go:77+0x27>
>
> github.com/juju/juju/worker/metrics/spool.(*periodicWorker).Kill(0xc0822a40e0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/spool/listener.go:103
> +0x28
> <http://github.com/juju/juju/worker/metrics/spool/listener.go:103+0x28>
>
> github.com/juju/juju/worker/metrics/sender_test.(*ManifoldSuite).setupWorkerTest.func1(0xc0822791d0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/juju/worker/metrics/sender/manifold_test.go:101
> +0x3d
> <http://github.com/juju/juju/worker/metrics/sender/manifold_test.go:101+0x3d>
> github.com/juju/testing.(*CleanupSuite).callStack(0xc0821a9a28,
> 0xc0822791d0, 0xc08226bdd0, 0x2, 0x2)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/testing/cleanup.go:52
> +0x51 <http://github.com/juju/testing/cleanup.go:52+0x51>
> github.com/juju/testing.(*CleanupSuite).TearDownTest(0xc0821a9a28,
> 0xc0822791d0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/testing/cleanup.go:46
> +0x4d <http://github.com/juju/testing/cleanup.go:46+0x4d>
> github.com/juju/testing.(*IsolationSuite).TearDownTest(0xc0821a9a20,
> 0xc0822791d0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> github.com/juju/testing/isolation.go:38
> +0x44 <http://github.com/juju/testing/isolation.go:38+0x44>
> reflect.Value.call(0xcf2800, 0xc0821a9a20, 0x2213, 0xd242c0, 0x4,
> 0xc0822adf10, 0x1, 0x1, 0x0, 0x0, ...)
>  C:/Go/src/reflect/value.go:435 +0x1214
> reflect.Value.Call(0xcf2800, 0xc0821a9a20, 0x2213, 0xc0822adf10, 0x1,
> 0x1, 0x0, 0x0, 0x0)
>  C:/Go/src/reflect/value.go:303 +0xb8
> gopkg.in/check%2ev1.(*suiteRunner).runFixture.func1(0xc0822791d0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/check.v1/check.go:721
> +0x16a <http://gopkg.in/check.v1/check.go:721+0x16a>
> gopkg.in/check%2ev1.(*suiteRunner).forkCall.func1(0xc0821eac00,
> 0xc0822791d0, 0xea4fb0)
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/check.v1/check.go:666
> +0x76 <http://gopkg.in/check.v1/check.go:666+0x76>
> created by gopkg.in/check%2ev1.(*suiteRunner).forkCall
>  c:/users/admini~1/appdata/local/temp/tmpyrijbo/gogo/src/
> gopkg.in/check.v1/check.go:667
> +0x2a0 <http://gopkg.in/check.v1/check.go:667+0x2a0>
> FAIL github.com/juju/juju/worker/metrics/sender 1200.101s
>
> But the wait on listener.go:56 only happens after the listener is
> closed on listener.go:52. But if the listener is closed, then the
> Accept on listener.go:71 will have returned an error and the goroutine
> will be in the process of tearing itself down. But we see that isn't
> the case, the signal for accept to return with an error has not
> happened.
>
> This is usually referred to as concurrent read/close semantics. POSIX
> _does_not_ define this behaviour for file descriptors. ie one thread
> may be blocked on read, another may issue close but that is not
> defined to wake any other thread in a blocking operation on the fd. If
> you need this behaviour you must use select(2) or similar.
>
> Go _does_ support this behaviour for network type file descriptors
> (anything you get from the net package), which the juju/sockets
> packages then wrap. But for the windows version of named pipes
> provided by npipe, this behaviour does not hold either because these
> operations are not going via select(2), or named pipes on windows do
> not support this read/close notification.
>
> This bug needs a windows expert.
>
> Thanks
>
> DAve
>
> --
> Juju-dev mailing list
> Juju-dev@lists.ubuntu.com
> Modify settings or unsubscribe at:
> https://lists.ubuntu.com/mailman/listinfo/juju-dev
>
-- 
Juju-dev mailing list
Juju-dev@lists.ubuntu.com
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/juju-dev

Reply via email to