@@ -26,7 +26,8 @@ import (
2626)
2727
2828const (
29- opPut = iota
29+ opFree = iota
30+ opPut
3031 opGet
3132 opUpdateExisting // {GET followed by PUT(same name, same size)} combo
3233 opConfig
@@ -50,6 +51,31 @@ type (
5051 }
5152)
5253
54+ var (
55+ woPool sync.Pool
56+ wo0 workOrder
57+ )
58+
59+ func allocWO (op int ) * workOrder {
60+ v := woPool .Get ()
61+ if v == nil {
62+ return & workOrder {op : op }
63+ }
64+ wo := v .(* workOrder )
65+ debug .Assert (wo .op == opFree )
66+ wo .op = op
67+ return wo
68+ }
69+
70+ func freeWO (wo * workOrder ) {
71+ // - work orders with SGLs are freed via wo2Free
72+ // - opFree when already freed
73+ if wo .sgl == nil && wo .op != opFree {
74+ * wo = wo0
75+ woPool .Put (wo )
76+ }
77+ }
78+
5379func postNewWorkOrder () (err error ) {
5480 if runParams .getConfig {
5581 workCh <- newGetConfigWorkOrder ()
@@ -171,6 +197,8 @@ func completeWorkOrder(wo *workOrder, terminating bool) {
171197 }
172198 if w .sgl != nil && ! w .sgl .IsNil () {
173199 w .sgl .Free ()
200+ w .sgl = nil
201+ freeWO (w )
174202 copy (wo2Free [i :], wo2Free [i + 1 :])
175203 i --
176204 l --
@@ -347,6 +375,10 @@ func worker(wos <-chan *workOrder, results chan<- *workOrder, wg *sync.WaitGroup
347375///////////////
348376
349377func newPutWorkOrder () (* workOrder , error ) {
378+ return newPutWO (opPut )
379+ }
380+
381+ func newPutWO (op int ) (* workOrder , error ) {
350382 objName , err := _genObjName ()
351383 if err != nil {
352384 return nil , err
@@ -357,35 +389,20 @@ func newPutWorkOrder() (*workOrder, error) {
357389 size = runParams .minSize + d
358390 }
359391 putPending ++
360- return & workOrder {
361- proxyURL : runParams .proxyURL ,
362- bck : runParams .bck ,
363- op : opPut ,
364- objName : objName ,
365- size : size ,
366- cksumType : runParams .cksumType ,
367- }, nil
392+
393+ wo := allocWO (op )
394+ {
395+ wo .proxyURL = runParams .proxyURL
396+ wo .bck = runParams .bck
397+ wo .objName = objName
398+ wo .size = size
399+ wo .cksumType = runParams .cksumType
400+ }
401+ return wo , nil
368402}
369403
370404func newMultipartWorkOrder () (* workOrder , error ) {
371- objName , err := _genObjName ()
372- if err != nil {
373- return nil , err
374- }
375- size := runParams .minSize
376- if runParams .maxSize != runParams .minSize {
377- d := rnd .Int64N (runParams .maxSize + 1 - runParams .minSize )
378- size = runParams .minSize + d
379- }
380- putPending ++
381- return & workOrder {
382- proxyURL : runParams .proxyURL ,
383- bck : runParams .bck ,
384- op : opPutMultipart ,
385- objName : objName ,
386- size : size ,
387- cksumType : runParams .cksumType ,
388- }, nil
405+ return newPutWO (opPutMultipart )
389406}
390407
391408func _genObjName () (string , error ) {
@@ -423,17 +440,19 @@ func _genObjName() (string, error) {
423440}
424441
425442func newGetWorkOrder (op int ) (* workOrder , error ) {
443+ debug .Assert (op == opGet || op == opUpdateExisting , op )
426444 if objnameGetter .Len () == 0 {
427445 return nil , errors .New ("no objects in bucket" )
428446 }
429447
430448 getPending ++
431- return & workOrder {
432- proxyURL : runParams .proxyURL ,
433- bck : runParams .bck ,
434- op : op ,
435- objName : objnameGetter .Pick (),
436- }, nil
449+ wo := allocWO (op )
450+ {
451+ wo .proxyURL = runParams .proxyURL
452+ wo .bck = runParams .bck
453+ wo .objName = objnameGetter .Pick ()
454+ }
455+ return wo , nil
437456}
438457
439458func newGetConfigWorkOrder () * workOrder {
0 commit comments