From 847411a1ee6e5ee5d051fc4729425215dc0c8561 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Sun, 27 Oct 2013 06:54:51 +0000 Subject: [PATCH] Engine: fix a bug which caused handlers to be shared between multiple engine instances --- engine/engine.go | 22 +++++++++++++++++++++- server.go | 4 ++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/engine/engine.go b/engine/engine.go index a0d5a3c4ad..956847adee 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -18,6 +18,10 @@ func init() { } func Register(name string, handler Handler) error { + _, exists := globalHandlers[name] + if exists { + return fmt.Errorf("Can't overwrite global handler for command %s", name) + } globalHandlers[name] = handler return nil } @@ -31,6 +35,17 @@ type Engine struct { hack Hack // data for temporary hackery (see hack.go) } +func (eng *Engine) Register(name string, handler Handler) error { + eng.Logf("Register(%s) (handlers=%v)", name, eng.handlers) + _, exists := eng.handlers[name] + if exists { + return fmt.Errorf("Can't overwrite handler for command %s", name) + } + eng.handlers[name] = handler + return nil +} + + // New initializes a new engine managing the directory specified at `root`. // `root` is used to store containers and any other state private to the engine. // Changing the contents of the root without executing a job will cause unspecified @@ -59,7 +74,12 @@ func New(root string) (*Engine, error) { } eng := &Engine{ root: root, - handlers: globalHandlers, + handlers: make(map[string]Handler), + id: utils.RandomString(), + } + // Copy existing global handlers + for k, v := range globalHandlers { + eng.handlers[k] = v } return eng, nil } diff --git a/server.go b/server.go index de79dd966d..72ad39cdce 100644 --- a/server.go +++ b/server.go @@ -60,10 +60,10 @@ func jobInitApi(job *engine.Job) string { os.Exit(0) }() job.Eng.Hack_SetGlobalVar("httpapi.server", srv) - if err := engine.Register("start", srv.ContainerStart); err != nil { + if err := job.Eng.Register("start", srv.ContainerStart); err != nil { return err.Error() } - if err := engine.Register("serveapi", srv.ListenAndServe); err != nil { + if err := job.Eng.Register("serveapi", srv.ListenAndServe); err != nil { return err.Error() } return "0"