@@ -23,19 +23,20 @@ import (
2323// HandlerSet represents a collection of Handlers of a worker server. It
2424// manages the Handler by HandlerLRU.
2525type HandlerManagerSet struct {
26- mutex sync.Mutex
27- hmMap map [string ]* HandlerManager
28- regMgr registry.RegistryManager
29- sbFactory sb.SandboxFactory
30- cacheMgr * cache.CacheManager
31- config * config.Config
32- lru * HandlerLRU
33- workerDir string
34- indexHost string
35- indexPort string
36- hhits * int64
37- ihits * int64
38- misses * int64
26+ mutex sync.Mutex
27+ hmMap map [string ]* HandlerManager
28+ regMgr registry.RegistryManager
29+ sbFactory sb.SandboxFactory
30+ cacheMgr * cache.CacheManager
31+ config * config.Config
32+ lru * HandlerLRU
33+ workerDir string
34+ indexHost string
35+ indexPort string
36+ maxRunners int
37+ hhits * int64
38+ ihits * int64
39+ misses * int64
3940}
4041
4142type HandlerManager struct {
@@ -86,17 +87,18 @@ func NewHandlerManagerSet(opts *config.Config) (hms *HandlerManagerSet, err erro
8687 var ihits int64 = 0
8788 var misses int64 = 0
8889 hms = & HandlerManagerSet {
89- hmMap : make (map [string ]* HandlerManager ),
90- regMgr : rm ,
91- sbFactory : sf ,
92- cacheMgr : cm ,
93- config : opts ,
94- workerDir : opts .Worker_dir ,
95- indexHost : opts .Index_host ,
96- indexPort : opts .Index_port ,
97- hhits : & hhits ,
98- ihits : & ihits ,
99- misses : & misses ,
90+ hmMap : make (map [string ]* HandlerManager ),
91+ regMgr : rm ,
92+ sbFactory : sf ,
93+ cacheMgr : cm ,
94+ config : opts ,
95+ workerDir : opts .Worker_dir ,
96+ indexHost : opts .Index_host ,
97+ indexPort : opts .Index_port ,
98+ maxRunners : opts .Max_runners ,
99+ hhits : & hhits ,
100+ ihits : & ihits ,
101+ misses : & misses ,
100102 }
101103
102104 hms .lru = NewHandlerLRU (hms , opts .Handler_cache_size ) //kb
@@ -148,6 +150,11 @@ func (hms *HandlerManagerSet) Get(name string) (h *Handler, err error) {
148150 }
149151
150152 h .runners += 1
153+
154+ if h .hm .hms .maxRunners != 0 && h .runners == h .hm .hms .maxRunners {
155+ hm .handlers .Remove (hEle )
156+ delete (hm .hElements , h )
157+ }
151158 h .mutex .Unlock ()
152159 }
153160 // not perfect, but removal from the LRU needs to be atomic
@@ -302,9 +309,11 @@ func (h *Handler) RunStart() (ch *sb.SandboxChannel, err error) {
302309 }
303310
304311 // we are up so we can add ourselves for reuse
305- hm .mutex .Lock ()
306- hm .hElements [h ] = hm .handlers .PushFront (h )
307- hm .mutex .Unlock ()
312+ if hms .maxRunners == 0 || h .runners < hms .maxRunners {
313+ hm .mutex .Lock ()
314+ hm .hElements [h ] = hm .handlers .PushFront (h )
315+ hm .mutex .Unlock ()
316+ }
308317
309318 } else if sbState , _ := h .sandbox .State (); sbState == state .Paused {
310319 // unpause if paused
@@ -327,6 +336,19 @@ func (h *Handler) RunFinish() {
327336 h .mutex .Lock ()
328337 defer h .mutex .Unlock ()
329338
339+ hm := h .hm
340+ hms := h .hm .hms
341+
342+ // if we finish first
343+ // no deadlock can occur here despite taking the locks in the
344+ // opposite order because hm -> h in Get has no reference
345+ // in the handler list
346+ if hms .maxRunners != 0 && h .runners == hms .maxRunners {
347+ hm .mutex .Lock ()
348+ hm .hElements [h ] = hm .handlers .PushFront (h )
349+ hm .mutex .Unlock ()
350+ }
351+
330352 h .runners -= 1
331353
332354 // are we the last?
@@ -338,7 +360,7 @@ func (h *Handler) RunFinish() {
338360 log .Printf ("Could not pause %v! Error: %v\n " , h .name , err )
339361 }
340362
341- h . hm . hms .lru .Add (h )
363+ hms .lru .Add (h )
342364 }
343365}
344366
0 commit comments