Merge lp:~fwereade/juju-core/fix-1233457-for-1.16 into lp:juju-core/1.16
Proposed by
William Reade
Status: | Merged |
---|---|
Approved by: | William Reade |
Approved revision: | no longer in the source branch. |
Merged at revision: | 1983 |
Proposed branch: | lp:~fwereade/juju-core/fix-1233457-for-1.16 |
Merge into: | lp:juju-core/1.16 |
Diff against target: |
120 lines (+80/-3) 3 files modified
state/service.go (+7/-3) state/unit.go (+22/-0) state/unit_test.go (+51/-0) |
To merge this branch: | bzr merge lp:~fwereade/juju-core/fix-1233457-for-1.16 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Juju Engineering | Pending | ||
Review via email: mp+195003@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Reviewers: mp+195003_ code.launchpad. net,
Message:
Please take a look.
Description:
cherrypick r2042 from trunk
fixes lp:1233457
https:/ /code.launchpad .net/~fwereade/ juju-core/ fix-1233457- for-1.16/ +merge/ 195003
(do not edit description out of merge proposal)
Please review this at https:/ /codereview. appspot. com/25920043/
Affected files (+82, -3 lines):
A [revision details]
M state/service.go
M state/unit.go
M state/unit_test.go
Index: [revision details] 20131104221242- cvjcmqbdcnln1c5 0
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: tarmac-
+New revision: <email address hidden>
Index: state/service.go
=== modified file 'state/service.go'
--- state/service.go 2013-07-30 14:00:53 +0000
+++ state/service.go 2013-11-13 08:47:41 +0000
@@ -718,14 +718,18 @@
// Relations returns a Relation for every relation the service is in. extf(&err, "can't get relations for service %q", s) s(s.st, s.doc.Name) extf(&err, "can't get relations for service %q", Find(D{ {"endpoints. servicename" , }).All( &docs) Find(D{ {"endpoints. servicename" , name}}).All(&docs)
func (s *Service) Relations() (relations []*Relation, err error) {
- defer utils.ErrorCont
+ return serviceRelation
+}
+
+func serviceRelations(st *State, name string) (relations []*Relation, err
error) {
+ defer utils.ErrorCont
name)
docs := []relationDoc{}
- err = s.st.relations.
s.doc.Name}
+ err = st.relations.
if err != nil {
return nil, err
}
for _, v := range docs {
- relations = append(relations, newRelation(s.st, &v))
+ relations = append(relations, newRelation(st, &v))
}
return relations, nil
}
Index: state/unit.go s(u.st, u.doc.Service) isDeadDoc) ; err {
=== modified file 'state/unit.go'
--- state/unit.go 2013-10-02 13:14:49 +0000
+++ state/unit.go 2013-11-13 08:47:41 +0000
@@ -387,6 +387,28 @@
if u.doc.Life != Dead {
return stderrors.New("unit is not dead")
}
+
+ // Now the unit is Dead, we can be sure that it's impossible for it to
+ // enter relation scopes (once it's Dying, we can be sure of this; but
+ // EnsureDead does not require that it already be Dying, so this is the
+ // only point at which we can safely backstop lp:1233457 and mitigate
+ // the impact of unit agent bugs that leave relation scopes occupied).
+ relations, err := serviceRelation
+ if err != nil {
+ return err
+ }
+ for _, rel := range relations {
+ ru, err := rel.Unit(u)
+ if err != nil {
+ return err
+ }
+ if err := ru.LeaveScope(); err != nil {
+ return err
+ }
+ }
+
+ // Now we're sure we haven't left any scopes occupied by this unit, we
+ // can safely remove the document.
unit := &Unit{st: u.st, doc: u.doc}
for i := 0; i < 5; i++ {
switch ops, err := unit.removeOps(
Index: state/unit_test.go unit_test. go' IsNotFoundError )
=== modified file 'state/
--- state/unit_test.go 2013-09-27 15:33:10 +0000
+++ state/unit_test.go 2013-11-13 08:47:41 +0000
@@ -1121,6 +1121,57 @@
c.Assert(err, jc.Satisfies, errors.
}
+func (s *UnitSuite) TestRemovePatho logicalWithBugg yUniter( c *gc.C) {
+ // Add a relation ...