Jelajahi Sumber

Engine: fix a bug which caused handlers to be shared between multiple engine instances

Solomon Hykes 11 tahun lalu
induk
melakukan
847411a1ee
2 mengubah file dengan 23 tambahan dan 3 penghapusan
  1. 21 1
      engine/engine.go
  2. 2 2
      server.go

+ 21 - 1
engine/engine.go

@@ -18,6 +18,10 @@ func init() {
 }
 }
 
 
 func Register(name string, handler Handler) error {
 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
 	globalHandlers[name] = handler
 	return nil
 	return nil
 }
 }
@@ -31,6 +35,17 @@ type Engine struct {
 	hack		Hack	// data for temporary hackery (see hack.go)
 	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`.
 // 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.
 // `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
 // 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{
 	eng := &Engine{
 		root:		root,
 		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
 	return eng, nil
 }
 }

+ 2 - 2
server.go

@@ -60,10 +60,10 @@ func jobInitApi(job *engine.Job) string {
 		os.Exit(0)
 		os.Exit(0)
 	}()
 	}()
 	job.Eng.Hack_SetGlobalVar("httpapi.server", srv)
 	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()
 		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 err.Error()
 	}
 	}
 	return "0"
 	return "0"