Eagerly create generic pools
Poolmgr now watches the controller's list of environments and eagerly creates a generic pool for each environment, if one doesn't already exist.
This commit is contained in:
+36
-1
@@ -17,8 +17,13 @@ limitations under the License.
|
|||||||
package poolmgr
|
package poolmgr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/platform9/fission"
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
"k8s.io/client-go/1.4/kubernetes"
|
"k8s.io/client-go/1.4/kubernetes"
|
||||||
|
|
||||||
|
"github.com/platform9/fission"
|
||||||
|
"github.com/platform9/fission/controller/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -27,6 +32,7 @@ type (
|
|||||||
kubernetesClient *kubernetes.Clientset
|
kubernetesClient *kubernetes.Clientset
|
||||||
namespace string
|
namespace string
|
||||||
controllerUrl string
|
controllerUrl string
|
||||||
|
controllerClient *client.Client
|
||||||
|
|
||||||
requestChannel chan *request
|
requestChannel chan *request
|
||||||
}
|
}
|
||||||
@@ -46,9 +52,12 @@ func MakeGenericPoolManager(controllerUrl string, kubernetesClient *kubernetes.C
|
|||||||
kubernetesClient: kubernetesClient,
|
kubernetesClient: kubernetesClient,
|
||||||
namespace: namespace,
|
namespace: namespace,
|
||||||
controllerUrl: controllerUrl,
|
controllerUrl: controllerUrl,
|
||||||
|
controllerClient: client.MakeClient(controllerUrl),
|
||||||
requestChannel: make(chan *request),
|
requestChannel: make(chan *request),
|
||||||
}
|
}
|
||||||
go gpm.service()
|
go gpm.service()
|
||||||
|
go gpm.eagerPoolCreator()
|
||||||
|
|
||||||
return gpm
|
return gpm
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,3 +86,29 @@ func (gpm *GenericPoolManager) GetPool(env *fission.Environment) (*GenericPool,
|
|||||||
resp := <-c
|
resp := <-c
|
||||||
return resp.pool, resp.error
|
return resp.pool, resp.error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gpm *GenericPoolManager) eagerPoolCreator() {
|
||||||
|
failureCount := 0
|
||||||
|
maxFailures := 5
|
||||||
|
pollSleep := time.Duration(2 * time.Second)
|
||||||
|
for {
|
||||||
|
time.Sleep(pollSleep)
|
||||||
|
|
||||||
|
// get list of envs from controller
|
||||||
|
envs, err := gpm.controllerClient.EnvironmentList()
|
||||||
|
if err != nil {
|
||||||
|
failureCount++
|
||||||
|
if failureCount >= maxFailures {
|
||||||
|
log.Fatalf("Failed to connect to controller %v times: %v", maxFailures, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create pools for all envs. TODO: we should make this a bit less eager, only
|
||||||
|
// creating pools for envs that are actually used by functions. Also we might want
|
||||||
|
// to keep these eagerly created pools smaller than the ones created when there are
|
||||||
|
// actual function calls.
|
||||||
|
for _, env := range envs {
|
||||||
|
gpm.GetPool(&env)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user