~dave-cheney/juju-core/069-worker-stater-I

« back to all changes in this revision

Viewing changes to worker/uniter/uniter.go

  • Committer: William Reade
  • Author(s): William Reade
  • Date: 2013-01-15 11:37:23 UTC
  • mfrom: (822.1.8 juju-core)
  • Revision ID: fwereade@gmail.com-20130115113723-9yvzpddjcm1uk1dr
uniter: react sanely to Dying required subordinate

see lp:1091866

R=dimitern, rog
CC=
https://codereview.appspot.com/7094045

Show diffs side-by-side

added added

removed removed

Lines of Context:
354
354
                        if err := rel.Refresh(); err != nil {
355
355
                                return nil, fmt.Errorf("cannot update relation %q: %v", rel, err)
356
356
                        }
357
 
                        switch rel.Life() {
358
 
                        case state.Dying:
 
357
                        if rel.Life() == state.Dying {
359
358
                                if err := r.SetDying(); err != nil {
360
359
                                        return nil, err
 
360
                                } else if r.IsImplicit() {
 
361
                                        delete(u.relationers, id)
361
362
                                }
362
 
                        case state.Dead:
363
 
                                return nil, fmt.Errorf("had reference to dead relation %q", rel)
364
363
                        }
365
364
                        continue
366
365
                }
417
416
// addRelation causes the unit agent to join the supplied relation, and to
418
417
// store persistent state in the supplied dir.
419
418
func (u *Uniter) addRelation(rel *state.Relation, dir *relation.StateDir) error {
 
419
        log.Printf("worker/uniter: joining relation %q", rel)
420
420
        ru, err := rel.Unit(u.unit)
421
421
        if err != nil {
422
422
                return err
423
423
        }
424
424
        r := NewRelationer(ru, dir, u.relationHooks)
425
 
        if err = r.Join(); err != nil {
426
 
                return err
 
425
        w := u.unit.Watch()
 
426
        defer watcher.Stop(w, &u.tomb)
 
427
        for {
 
428
                select {
 
429
                case <-u.tomb.Dying():
 
430
                        return tomb.ErrDying
 
431
                case _, ok := <-w.Changes():
 
432
                        if !ok {
 
433
                                return watcher.MustErr(w)
 
434
                        }
 
435
                        if err := r.Join(); err == state.ErrCannotEnterScopeYet {
 
436
                                log.Printf("worker/uniter: cannot enter scope for relation %q; waiting for subordinate to be removed", rel)
 
437
                                continue
 
438
                        } else if err != nil {
 
439
                                return err
 
440
                        }
 
441
                        log.Printf("worker/uniter: joined relation %q", rel)
 
442
                        u.relationers[rel.Id()] = r
 
443
                        return nil
 
444
                }
427
445
        }
428
 
        u.relationers[rel.Id()] = r
429
 
        return nil
 
446
        panic("unreachable")
430
447
}