Skip to content

Commit c006256

Browse files
committed
Introduces PooledState as the return from StatePool.Get.
PooledState wraps the State reference and implements callbacks perviously passed as closures.
1 parent 22584d1 commit c006256

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+622
-517
lines changed

agent/agentbootstrap/bootstrap_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,9 @@ LXC_BRIDGE="ignored"`[1:])
257257
// controller model.
258258
statePool := state.NewStatePool(st)
259259
defer statePool.Close()
260-
hostedModelSt, release, err := statePool.Get(hostedModelUUID)
260+
hostedModelSt, err := statePool.Get(hostedModelUUID)
261261
c.Assert(err, jc.ErrorIsNil)
262-
defer release()
262+
defer hostedModelSt.Release()
263263
gotModelConstraints, err = hostedModelSt.ModelConstraints()
264264
c.Assert(err, jc.ErrorIsNil)
265265
c.Assert(gotModelConstraints, gc.DeepEquals, expectModelConstraints)

api/watcher/watcher_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/juju/utils"
1212
gc "gopkg.in/check.v1"
1313
"gopkg.in/juju/names.v2"
14-
worker "gopkg.in/juju/worker.v1"
14+
"gopkg.in/juju/worker.v1"
1515
"gopkg.in/macaroon-bakery.v1/bakery"
1616
"gopkg.in/macaroon-bakery.v1/bakery/checkers"
1717
"gopkg.in/macaroon.v1"
@@ -511,10 +511,10 @@ type migrationSuite struct {
511511
var _ = gc.Suite(&migrationSuite{})
512512

513513
func (s *migrationSuite) startSync(c *gc.C, st *state.State) {
514-
backingSt, releaser, err := s.BackingStatePool.Get(st.ModelUUID())
514+
backingSt, err := s.BackingStatePool.Get(st.ModelUUID())
515515
c.Assert(err, jc.ErrorIsNil)
516516
backingSt.StartSync()
517-
releaser()
517+
backingSt.Release()
518518
}
519519

520520
func (s *migrationSuite) TestMigrationStatusWatcher(c *gc.C) {

apiserver/admin_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -931,9 +931,9 @@ func (s *loginSuite) assertRemoteModel(c *gc.C, api api.Connection, expected nam
931931
// the expected model. We make a change in state on that model, and
932932
// then check that it is picked up by a call to the API.
933933

934-
st, release, err := s.StatePool.Get(tag.Id())
934+
st, err := s.StatePool.Get(tag.Id())
935935
c.Assert(err, jc.ErrorIsNil)
936-
defer release()
936+
defer st.Release()
937937

938938
expectedCons := constraints.MustParse("mem=8G")
939939
err = st.SetModelConstraints(expectedCons)

apiserver/apiserver.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -585,21 +585,21 @@ func (srv *Server) endpoints() []apihttp.Endpoint {
585585
)
586586

587587
add("/model/:modeluuid/applications/:application/resources/:resource", &ResourcesHandler{
588-
StateAuthFunc: func(req *http.Request, tagKinds ...string) (ResourcesBackend, state.StatePoolReleaser, names.Tag, error) {
589-
st, closer, entity, err := httpCtxt.stateForRequestAuthenticatedTag(req, tagKinds...)
588+
StateAuthFunc: func(req *http.Request, tagKinds ...string) (ResourcesBackend, state.PoolHelper, names.Tag, error) {
589+
st, entity, err := httpCtxt.stateForRequestAuthenticatedTag(req, tagKinds...)
590590
if err != nil {
591591
return nil, nil, nil, errors.Trace(err)
592592
}
593593
rst, err := st.Resources()
594594
if err != nil {
595595
return nil, nil, nil, errors.Trace(err)
596596
}
597-
return rst, closer, entity.Tag(), nil
597+
return rst, st, entity.Tag(), nil
598598
},
599599
})
600600
add("/model/:modeluuid/units/:unit/resources/:resource", &UnitResourcesHandler{
601-
NewOpener: func(req *http.Request, tagKinds ...string) (resource.Opener, state.StatePoolReleaser, error) {
602-
st, closer, _, err := httpCtxt.stateForRequestAuthenticatedTag(req, tagKinds...)
601+
NewOpener: func(req *http.Request, tagKinds ...string) (resource.Opener, state.PoolHelper, error) {
602+
st, _, err := httpCtxt.stateForRequestAuthenticatedTag(req, tagKinds...)
603603
if err != nil {
604604
return nil, nil, errors.Trace(err)
605605
}
@@ -608,11 +608,11 @@ func (srv *Server) endpoints() []apihttp.Endpoint {
608608
if err != nil {
609609
return nil, nil, errors.Trace(err)
610610
}
611-
opener, err := resourceadapters.NewResourceOpener(st, tag.Id())
611+
opener, err := resourceadapters.NewResourceOpener(st.State, tag.Id())
612612
if err != nil {
613613
return nil, nil, errors.Trace(err)
614614
}
615-
return opener, closer, nil
615+
return opener, st, nil
616616
},
617617
})
618618

@@ -831,17 +831,16 @@ func (srv *Server) serveConn(
831831
modelUUID: modelUUID,
832832
})
833833
var (
834-
st *state.State
835-
h *apiHandler
836-
releaser state.StatePoolReleaser
834+
st *state.PooledState
835+
h *apiHandler
837836
)
838837
if err == nil {
839-
st, releaser, err = srv.statePool.Get(resolvedModelUUID)
838+
st, err = srv.statePool.Get(resolvedModelUUID)
840839
}
841840

842841
if err == nil {
843-
defer releaser()
844-
h, err = newAPIHandler(srv, st, conn, modelUUID, connectionID, host)
842+
defer st.Release()
843+
h, err = newAPIHandler(srv, st.State, conn, modelUUID, connectionID, host)
845844
}
846845

847846
if err != nil {

apiserver/backup.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,20 @@ type backupHandler struct {
3636
func (h *backupHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
3737
// Validate before authenticate because the authentication is dependent
3838
// on the state connection that is determined during the validation.
39-
st, releaser, err := h.ctxt.stateForRequestAuthenticatedUser(req)
39+
st, err := h.ctxt.stateForRequestAuthenticatedUser(req)
4040
if err != nil {
4141
h.sendError(resp, err)
4242
return
4343
}
44-
defer releaser()
44+
defer st.Release()
4545

4646
m, err := st.Model()
4747
if err != nil {
4848
h.sendError(resp, err)
4949
return
5050
}
5151

52-
backups, closer := newBackups(st, m)
52+
backups, closer := newBackups(st.State, m)
5353
defer closer.Close()
5454

5555
switch req.Method {

apiserver/charms.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (h *CharmsHTTPHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
7676
type charmsHandler struct {
7777
ctxt httpContext
7878
dataDir string
79-
stateAuthFunc func(*http.Request) (*state.State, state.StatePoolReleaser, error)
79+
stateAuthFunc func(*http.Request) (*state.PooledState, error)
8080
}
8181

8282
// bundleContentSenderFunc functions are responsible for sending a
@@ -92,14 +92,14 @@ func (h *charmsHandler) ServePost(w http.ResponseWriter, r *http.Request) error
9292
return errors.Trace(emitUnsupportedMethodErr(r.Method))
9393
}
9494

95-
st, releaser, err := h.stateAuthFunc(r)
95+
st, err := h.stateAuthFunc(r)
9696
if err != nil {
9797
return errors.Trace(err)
9898
}
99-
defer releaser()
99+
defer st.Release()
100100

101101
// Add a charm to the store provider.
102-
charmURL, err := h.processPost(r, st)
102+
charmURL, err := h.processPost(r, st.State)
103103
if err != nil {
104104
return errors.NewBadRequest(err, "")
105105
}
@@ -111,18 +111,18 @@ func (h *charmsHandler) ServeGet(w http.ResponseWriter, r *http.Request) error {
111111
return errors.Trace(emitUnsupportedMethodErr(r.Method))
112112
}
113113

114-
st, releaser, _, err := h.ctxt.stateForRequestAuthenticated(r)
114+
st, _, err := h.ctxt.stateForRequestAuthenticated(r)
115115
if err != nil {
116116
return errors.Trace(err)
117117
}
118-
defer releaser()
118+
defer st.Release()
119119

120120
// Retrieve or list charm files.
121121
// Requires "url" (charm URL) and an optional "file" (the path to the
122122
// charm file) to be included in the query. Optionally also receives an
123123
// "icon" query for returning the charm icon or a default one in case the
124124
// charm has no icon.
125-
charmArchivePath, fileArg, serveIcon, err := h.processGet(r, st)
125+
charmArchivePath, fileArg, serveIcon, err := h.processGet(r, st.State)
126126
if err != nil {
127127
// An error occurred retrieving the charm bundle.
128128
if errors.IsNotFound(err) {

apiserver/common/cloudspec/statehelpers.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@ import (
1515
// Pool describes an interface for retrieving State instances from a
1616
// collection.
1717
type Pool interface {
18-
Get(string) (*state.State, state.StatePoolReleaser, error)
18+
Get(string) (*state.PooledState, error)
1919
}
2020

2121
// MakeCloudSpecGetter returns a function which returns a CloudSpec
2222
// for a given model, using the given Pool.
2323
func MakeCloudSpecGetter(pool Pool) func(names.ModelTag) (environs.CloudSpec, error) {
2424
return func(tag names.ModelTag) (environs.CloudSpec, error) {
25-
st, release, err := pool.Get(tag.Id())
25+
st, err := pool.Get(tag.Id())
2626
if err != nil {
2727
return environs.CloudSpec{}, errors.Trace(err)
2828
}
29-
defer release()
29+
defer st.Release()
3030

3131
m, err := st.Model()
3232
if err != nil {
@@ -35,7 +35,9 @@ func MakeCloudSpecGetter(pool Pool) func(names.ModelTag) (environs.CloudSpec, er
3535
// TODO - CAAS(externalreality): Once cloud methods are migrated
3636
// to model EnvironConfigGetter will no longer need to contain
3737
// both state and model but only model.
38-
return stateenvirons.EnvironConfigGetter{st, m}.CloudSpec()
38+
// TODO (manadart 2018-02-15): This potentially frees the state from
39+
// the pool. Release is called, but the state reference survives.
40+
return stateenvirons.EnvironConfigGetter{st.State, m}.CloudSpec()
3941
}
4042
}
4143

apiserver/common/crossmodel/state.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ type statePoolShim struct {
2222
}
2323

2424
func (p *statePoolShim) Get(modelUUID string) (Backend, func(), error) {
25-
st, releaser, err := p.StatePool.Get(modelUUID)
25+
st, err := p.StatePool.Get(modelUUID)
2626
if err != nil {
2727
return nil, func() {}, err
2828
}
2929
closer := func() {
30-
releaser()
30+
st.Release()
3131
}
3232
model, err := st.Model()
3333
if err != nil {
3434
return stateShim{}, closer, err
3535
}
36-
return stateShim{st, model}, closer, err
36+
return stateShim{st.State, model}, closer, err
3737
}
3838

3939
func GetStatePool(pool *state.StatePool) StatePool {

apiserver/common/modelmanagerinterface.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,24 +141,24 @@ func (st modelManagerStateShim) ControllerTag() names.ControllerTag {
141141

142142
// GetBackend implements ModelManagerBackend.
143143
func (st modelManagerStateShim) GetBackend(modelUUID string) (ModelManagerBackend, func() bool, error) {
144-
otherState, release, err := st.pool.Get(modelUUID)
144+
otherState, err := st.pool.Get(modelUUID)
145145
if err != nil {
146146
return nil, nil, errors.Trace(err)
147147
}
148148
otherModel, err := otherState.Model()
149149
if err != nil {
150150
return nil, nil, err
151151
}
152-
return modelManagerStateShim{otherState, otherModel, st.pool}, release, nil
152+
return modelManagerStateShim{otherState.State, otherModel, st.pool}, otherState.Release, nil
153153
}
154154

155155
// GetModel implements ModelManagerBackend.
156156
func (st modelManagerStateShim) GetModel(modelUUID string) (Model, func() bool, error) {
157-
model, release, err := st.pool.GetModel(modelUUID)
157+
model, hp, err := st.pool.GetModel(modelUUID)
158158
if err != nil {
159159
return nil, nil, errors.Trace(err)
160160
}
161-
return modelShim{model}, release, nil
161+
return modelShim{model}, hp.Release, nil
162162
}
163163

164164
// Model implements ModelManagerBackend.

apiserver/debuglog.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ func (h *debugLogHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
7373
socket := &debugLogSocketImpl{conn}
7474
defer conn.Close()
7575

76-
st, releaser, _, err := h.ctxt.stateForRequestAuthenticatedTag(req, names.MachineTagKind, names.UserTagKind)
76+
st, _, err := h.ctxt.stateForRequestAuthenticatedTag(req, names.MachineTagKind, names.UserTagKind)
7777
if err != nil {
7878
socket.sendError(err)
7979
return
8080
}
81-
defer releaser()
81+
defer st.Release()
8282

8383
params, err := readDebugLogParams(req.URL.Query())
8484
if err != nil {

apiserver/facades/client/applicationoffers/applicationoffers.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,16 @@ func createOffersAPI(
6767
// NewOffersAPI returns a new application offers OffersAPI facade.
6868
func NewOffersAPI(ctx facade.Context) (*OffersAPI, error) {
6969
environFromModel := func(modelUUID string) (environs.Environ, error) {
70-
st, releaser, err := ctx.StatePool().Get(modelUUID)
70+
st, err := ctx.StatePool().Get(modelUUID)
7171
if err != nil {
7272
return nil, errors.Trace(err)
7373
}
74-
defer releaser()
74+
defer st.Release()
7575
model, err := st.Model()
7676
if err != nil {
7777
return nil, errors.Trace(err)
7878
}
79-
g := stateenvirons.EnvironConfigGetter{st, model}
79+
g := stateenvirons.EnvironConfigGetter{st.State, model}
8080
env, err := environs.GetEnviron(g, environs.New)
8181
if err != nil {
8282
return nil, errors.Trace(err)

apiserver/facades/client/applicationoffers/state.go

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ type statePoolShim struct {
3434
}
3535

3636
func (pool statePoolShim) Get(modelUUID string) (Backend, func(), error) {
37-
st, release, err := pool.StatePool.Get(modelUUID)
37+
st, err := pool.StatePool.Get(modelUUID)
3838
if err != nil {
3939
return nil, nil, errors.Trace(err)
4040
}
4141
return &stateShim{
42-
st: st,
43-
Backend: commoncrossmodel.GetBackend(st),
44-
}, func() { release() }, nil
42+
st: st.State,
43+
Backend: commoncrossmodel.GetBackend(st.State),
44+
}, func() { st.Release() }, nil
4545
}
4646

4747
func (pool statePoolShim) GetModel(modelUUID string) (Model, func(), error) {
48-
m, release, err := pool.StatePool.GetModel(modelUUID)
48+
m, ph, err := pool.StatePool.GetModel(modelUUID)
4949
if err != nil {
5050
return nil, nil, errors.Trace(err)
5151
}
52-
return &modelShim{m}, func() { release() }, nil
52+
return &modelShim{m}, func() { ph.Release() }, nil
5353
}
5454

5555
// Backend provides selected methods off the state.State struct.
@@ -133,14 +133,6 @@ var GetApplicationOffers = func(backend interface{}) crossmodel.ApplicationOffer
133133
return nil
134134
}
135135

136-
type applicationShim struct {
137-
*state.Application
138-
}
139-
140-
func (a *applicationShim) Charm() (ch commoncrossmodel.Charm, force bool, err error) {
141-
return a.Application.Charm()
142-
}
143-
144136
type Subnet interface {
145137
CIDR() string
146138
VLANTag() int
@@ -220,7 +212,3 @@ func (s *stateShim) User(tag names.UserTag) (User, error) {
220212
type User interface {
221213
DisplayName() string
222214
}
223-
224-
type userShim struct {
225-
*state.User
226-
}

apiserver/facades/client/client/backend.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ type stateShim struct {
9898
model *state.Model
9999
}
100100

101-
func (st stateShim) UpdateModelConfig(u map[string]interface{}, r []string, a ...state.ValidateConfigFunc) error {
102-
return st.model.UpdateModelConfig(u, r, a...)
101+
func (s stateShim) UpdateModelConfig(u map[string]interface{}, r []string, a ...state.ValidateConfigFunc) error {
102+
return s.model.UpdateModelConfig(u, r, a...)
103103
}
104104

105-
func (st stateShim) ModelConfigValues() (config.ConfigValues, error) {
106-
return st.model.ModelConfigValues()
105+
func (s stateShim) ModelConfigValues() (config.ConfigValues, error) {
106+
return s.model.ModelConfigValues()
107107
}
108108

109109
func (s *stateShim) Annotations(entity state.GlobalEntity) (map[string]string, error) {
@@ -136,11 +136,11 @@ type poolShim struct {
136136
}
137137

138138
func (p *poolShim) GetModel(uuid string) (*state.Model, func(), error) {
139-
model, release, err := p.pool.GetModel(uuid)
139+
model, ph, err := p.pool.GetModel(uuid)
140140
if err != nil {
141141
return nil, nil, errors.Trace(err)
142142
}
143-
return model, func() { release() }, nil
143+
return model, func() { ph.Release() }, nil
144144
}
145145

146146
func (s stateShim) ModelConfig() (*config.Config, error) {
@@ -156,6 +156,6 @@ func (s stateShim) ModelConfig() (*config.Config, error) {
156156
return cfg, nil
157157
}
158158

159-
func (st stateShim) ModelTag() names.ModelTag {
160-
return names.NewModelTag(st.State.ModelUUID())
159+
func (s stateShim) ModelTag() names.ModelTag {
160+
return names.NewModelTag(s.State.ModelUUID())
161161
}

0 commit comments

Comments
 (0)