Details
-
Bug
-
Resolution: Fixed
-
Major
-
None
-
Untriaged
-
1
-
Unknown
Description
plasma.go constructors New(), New2(), New3() all accept argument cfg Config, which is a struct, therefore it is being passed by value not by reference. This means each call, and each child this is passed to that does the same thing, makes a new shallow copy of the entire Config struct. By my count this struct currently contains 113 fields, so these copies are doing a lot of extra CPU work and consuming significant stack.
E.g. a call to New(cfg) triggers the following copies (at least the first 5, and possibly up to 7, assuming none of the great-grandchildren copy it further):
- New(cfg) – arg copied on call
- New2(cfg, ...) – copied to child call
- New3(cfg, ...) – copied to grandchild call
- applyConfigDefaults(cfg, ...) – copied to first great-grandchild call
- cfg = applyConfigDefaults(...) – and copied again assigning the returned copy back to New3's cfg variable
- doRecovery(..., cfg, ...) – copied to second great-grandchild if this call is made
- newPlasmaSkeleton(cfg, ...) – copied to third great-grandchild if this call is made