88 "bytes"
99 "fmt"
1010 "io"
11+ "maps"
1112 "math/rand/v2"
1213 "os"
1314 "path"
@@ -651,7 +652,7 @@ type memNode struct {
651652 }
652653
653654 children map [string ]* memNode
654- syncedChildren map [string ]* memNode
655+ syncedChildren map [string ]* memNode // may be nil if never synced
655656}
656657
657658func newRootMemNode () * memNode {
@@ -661,14 +662,6 @@ func newRootMemNode() *memNode {
661662 }
662663}
663664
664- func cloneChildren (f map [string ]* memNode ) map [string ]* memNode {
665- m := make (map [string ]* memNode )
666- for k , v := range f {
667- m [k ] = v
668- }
669- return m
670- }
671-
672665func (f * memNode ) dump (w * bytes.Buffer , level int , name string ) {
673666 if f .isDir {
674667 w .WriteString (" " )
@@ -689,10 +682,7 @@ func (f *memNode) dump(w *bytes.Buffer, level int, name string) {
689682 w .WriteByte (sep [0 ])
690683 }
691684 w .WriteByte ('\n' )
692- names := make ([]string , 0 , len (f .children ))
693- for name := range f .children {
694- names = append (names , name )
695- }
685+ names := slices .Collect (maps .Keys (f .children ))
696686 sort .Strings (names )
697687 for _ , name := range names {
698688 f .children [name ].dump (w , level + 1 , name )
@@ -704,7 +694,11 @@ func (f *memNode) dump(w *bytes.Buffer, level int, name string) {
704694func (f * memNode ) CrashClone (cfg * CrashCloneCfg ) * memNode {
705695 newNode := & memNode {isDir : f .isDir }
706696 if f .isDir {
707- newNode .children = cloneChildren (f .syncedChildren )
697+ newNode .children = maps .Clone (f .syncedChildren )
698+ if newNode .children == nil {
699+ // syncedChildren may be nil, but children cannot.
700+ newNode .children = make (map [string ]* memNode )
701+ }
708702 // Randomly include some non-synced children.
709703 for name , child := range f .children {
710704 if cfg .UnsyncedDataPercent > 0 && cfg .RNG .IntN (100 ) < cfg .UnsyncedDataPercent {
@@ -714,7 +708,7 @@ func (f *memNode) CrashClone(cfg *CrashCloneCfg) *memNode {
714708 for name , child := range newNode .children {
715709 newNode .children [name ] = child .CrashClone (cfg )
716710 }
717- newNode .syncedChildren = cloneChildren (newNode .children )
711+ newNode .syncedChildren = maps . Clone (newNode .children )
718712 } else {
719713 newNode .mu .data = slices .Clone (f .mu .syncedData )
720714 newNode .mu .modTime = f .mu .modTime
@@ -880,7 +874,7 @@ func (f *memFile) Sync() error {
880874 f .fs .mu .Lock ()
881875 defer f .fs .mu .Unlock ()
882876 if f .n .isDir {
883- f .n .syncedChildren = cloneChildren (f .n .children )
877+ f .n .syncedChildren = maps . Clone (f .n .children )
884878 } else {
885879 f .n .mu .Lock ()
886880 f .n .mu .syncedData = append (f .n .mu .syncedData [:0 ], f .n .mu .data ... )
0 commit comments