@@ -26,14 +26,25 @@ type StorageInterface interface {
2626 Remove (Node ) error
2727}
2828
29+ type StrategyInterface interface {
30+ Reserve (Capabilities ) (Node , error )
31+ CleanUp (Node ) error
32+ }
33+
2934type Pool struct {
3035 storage StorageInterface
3136 busyNodeDuration time.Duration
3237 reservedNodeDuration time.Duration
38+ strategyList StrategyListInterface
3339}
3440
35- func NewPool (storage StorageInterface ) * Pool {
36- return & Pool {storage , defaultBusyNodeDuration , defaultReservedNodeDuration }
41+ func NewPool (storage StorageInterface , strategyList StrategyListInterface ) * Pool {
42+ return & Pool {
43+ storage : storage ,
44+ busyNodeDuration : defaultBusyNodeDuration ,
45+ reservedNodeDuration : defaultReservedNodeDuration ,
46+ strategyList : strategyList ,
47+ }
3748}
3849
3950func (p * Pool ) SetBusyNodeDuration (duration time.Duration ) {
@@ -45,11 +56,12 @@ func (p *Pool) SetReservedNodeDuration(duration time.Duration) {
4556}
4657
4758// TODO: research close transaction and defer close mysql result body.
48- func (p * Pool ) ReserveAvailableNode (capabilities Capabilities ) (* Node , error ) {
49- node , err := p .storage . ReserveAvailable ( capabilities )
59+ func (p * Pool ) ReserveAvailableNode (caps Capabilities ) (* Node , error ) {
60+ node , err := p .strategyList . Reserve ( caps )
5061 if err != nil {
5162 err = errors .New ("Can't reserve available node, " + err .Error ())
5263 log .Error (err )
64+ return nil , err
5365 }
5466 return & node , err
5567}
@@ -91,7 +103,7 @@ func (p *Pool) GetNodeByAddress(address string) (*Node, error) {
91103}
92104
93105func (p * Pool ) CleanUpNode (node * Node ) error {
94- err := p .storage . SetAvailable (* node )
106+ err := p .strategyList . CleanUp (* node )
95107 if err != nil {
96108 err = errors .New ("Can't clean up node: " + err .Error ())
97109 log .Error (err )
0 commit comments