| package ramdisk |
| |
| import ( |
| "context" |
| "fmt" |
| "os" |
| |
| "go.skia.org/infra/go/executil" |
| "go.skia.org/infra/go/skerr" |
| "go.skia.org/infra/go/sklog" |
| ) |
| |
| // New mounts a ram disk and returns the mount location and a cleanup function |
| // which should be deferred immediately after checking the returned error. |
| func New(ctx context.Context) (string, func(), error) { |
| location, err := os.MkdirTemp(os.TempDir(), "ramdisk") |
| if err != nil { |
| return "", nil, skerr.Wrap(err) |
| } |
| fmt.Println("sudo is required in order to mount the ram disk.") |
| cmd := executil.CommandContext(ctx, "sudo", "mount", "-t", "tmpfs", "-o", "size=10m", "tmpfs", location) |
| if output, err := cmd.Output(); err != nil { |
| if err2 := os.RemoveAll(location); err2 != nil { |
| return "", nil, skerr.Wrapf(err, "failed to mount ram disk and failed to remove mount point with: %s", err2) |
| } |
| return "", nil, skerr.Wrapf(err, "output: %s", string(output)) |
| } |
| return location, func() { |
| cmd := executil.CommandContext(ctx, "sudo", "umount", location) |
| if output, err := cmd.Output(); err != nil { |
| sklog.Errorf("Failed to unmount ram disk: %s; output: %s", err, string(output)) |
| return |
| } |
| if err := os.RemoveAll(location); err != nil { |
| sklog.Errorf("Failed to delete ram disk mount point: %s", err) |
| } |
| }, nil |
| } |