func assertUnlocked(c *gc.C, waiter gate.Waiter) { select { case <-waiter.Unlocked(): default: c.Fatalf("expected gate to be unlocked") } }
func getWaiterChannel(waiter gate.Waiter) <-chan struct{} { // If a gate is unlocked, don't select on it. if waiter.IsUnlocked() { return nil } return waiter.Unlocked() }
func assertUnlocked(c *gc.C, waiter gate.Waiter) { c.Assert(waiter.IsUnlocked(), jc.IsTrue) select { case <-waiter.Unlocked(): default: c.Fatalf("expected gate to be unlocked") } }
func assertLocked(c *gc.C, waiter gate.Waiter) { c.Assert(waiter.IsUnlocked(), jc.IsFalse) select { case <-waiter.Unlocked(): c.Fatalf("expected gate to be locked") default: } }
// New starts a logsender worker which reads log message structs from // a channel and sends them to the JES via the logsink API. func New(logs LogRecordCh, apiInfoGate gate.Waiter, agent agent.Agent) worker.Worker { loop := func(stop <-chan struct{}) error { logger.Debugf("started log-sender worker; waiting for api info") select { case <-apiInfoGate.Unlocked(): case <-stop: return nil } logger.Debugf("dialing log-sender connection") apiInfo := agent.CurrentConfig().APIInfo() conn, err := dialLogsinkAPI(apiInfo) if err != nil { return errors.Annotate(err, "logsender dial failed") } defer conn.Close() for { select { case rec := <-logs: err := sendLogRecord(conn, rec.Time, rec.Module, rec.Location, rec.Level, rec.Message) if err != nil { return errors.Trace(err) } if rec.DroppedAfter > 0 { // If messages were dropped after this one, report // the count (the source of the log messages - // BufferedLogWriter - handles the actual dropping // and counting). // // Any logs indicated as dropped here are will // never end up in the logs DB in the JES // (although will still be in the local agent log // file). Message dropping by the // BufferedLogWriter is last resort protection // against memory exhaustion and should only // happen if API connectivity is lost for extended // periods. The maximum in-memory log buffer is // quite large (see the InstallBufferedLogWriter // call in jujuDMain). err := sendLogRecord(conn, rec.Time, loggerName, "", loggo.WARNING, fmt.Sprintf("%d log messages dropped due to lack of API connectivity", rec.DroppedAfter)) if err != nil { return errors.Trace(err) } } case <-stop: return nil } } } return worker.NewSimpleWorker(loop) }
func assertGate(c *gc.C, manifold dependency.Manifold, unlocker gate.Unlocker) { w, err := manifold.Start(nil) c.Assert(err, jc.ErrorIsNil) defer worker.Stop(w) var waiter gate.Waiter err = manifold.Output(w, &waiter) c.Assert(err, jc.ErrorIsNil) select { case <-waiter.Unlocked(): c.Fatalf("expected gate to be locked") default: } unlocker.Unlock() select { case <-waiter.Unlocked(): default: c.Fatalf("expected gate to be unlocked") } }