MCPcopy
hub / github.com/kopia/kopia / writeTempFileAtomicImp

Function writeTempFileAtomicImp

repo/content/write_temp_file.go:44–86  ·  view source on GitHub ↗
(fsi fsInterface, dirname string, data []byte)

Source from the content-addressed store, hash-verified

42}
43
44func writeTempFileAtomicImp(fsi fsInterface, dirname string, data []byte) (filename string, err error) {
45 // write to a temp file to avoid race where two processes are writing at the same time.
46 tf, err2 := fsi.CreateTemp(dirname, "tmp")
47 if err2 != nil {
48 if os.IsNotExist(err2) {
49 if mdErr := fsi.MkdirAll(dirname, cache.DirMode); mdErr != nil {
50 return "", stderrors.Join(errors.Wrap(mdErr, "cannot create parent directory for temp file"),
51 errors.Wrap(err2, "cannot create temp file"))
52 }
53
54 tf, err2 = fsi.CreateTemp(dirname, "tmp")
55 }
56 }
57
58 if err2 != nil {
59 return "", errors.Wrap(err2, "can't create tmp file")
60 }
61
62 defer func() {
63 if cerr := tf.Close(); cerr != nil {
64 err = stderrors.Join(err, errors.Wrap(cerr, "can't close tmp file"))
65 }
66
67 if err != nil {
68 // remove tmp file on error to avoid leaving them behind
69 if rerr := fsi.Remove(tf.Name()); rerr != nil {
70 err = stderrors.Join(err, errors.Wrap(rerr, "can't remove tmp file"))
71 }
72
73 filename = ""
74 }
75 }()
76
77 if _, err2 := tf.Write(data); err2 != nil {
78 return "", errors.Wrap(err2, "can't write to temp file")
79 }
80
81 if err2 := tf.Sync(); err2 != nil {
82 return "", errors.Wrapf(err2, "cannot sync temporary file in dir %s", dirname)
83 }
84
85 return tf.Name(), nil
86}

Calls 8

CreateTempMethod · 0.65
IsNotExistMethod · 0.65
MkdirAllMethod · 0.65
CloseMethod · 0.65
RemoveMethod · 0.65
NameMethod · 0.65
SyncMethod · 0.65
WriteMethod · 0.45