Skip to content

Commit

Permalink
Delay the creation of cache directories until they're used
Browse files Browse the repository at this point in the history
  • Loading branch information
bep committed Aug 30, 2023
1 parent d2ae9e1 commit e082591
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 4 deletions.
37 changes: 33 additions & 4 deletions cache/filecache/filecache.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ type Cache struct {
pruneAllRootDir string

nlocker *lockTracker

initOnce sync.Once
}

type lockTracker struct {
Expand Down Expand Up @@ -103,9 +105,24 @@ func (l *lockedFile) Close() error {
return l.File.Close()
}

func (c *Cache) init() error {
var initErr error
c.initOnce.Do(func() {
// Create the base dir if it does not exist.
if err := c.Fs.MkdirAll("", 0777); err != nil && !os.IsExist(err) {
initErr = err
}
})
return initErr
}

// WriteCloser returns a transactional writer into the cache.
// It's important that it's closed when done.
func (c *Cache) WriteCloser(id string) (ItemInfo, io.WriteCloser, error) {
if err := c.init(); err != nil {
return ItemInfo{}, nil, err
}

id = cleanID(id)
c.nlocker.Lock(id)

Expand All @@ -130,6 +147,10 @@ func (c *Cache) WriteCloser(id string) (ItemInfo, io.WriteCloser, error) {
func (c *Cache) ReadOrCreate(id string,
read func(info ItemInfo, r io.ReadSeeker) error,
create func(info ItemInfo, w io.WriteCloser) error) (info ItemInfo, err error) {
if err := c.init(); err != nil {
return ItemInfo{}, err
}

id = cleanID(id)

c.nlocker.Lock(id)
Expand Down Expand Up @@ -163,6 +184,9 @@ func (c *Cache) ReadOrCreate(id string,
// be invoked and the result cached.
// This method is protected by a named lock using the given id as identifier.
func (c *Cache) GetOrCreate(id string, create func() (io.ReadCloser, error)) (ItemInfo, io.ReadCloser, error) {
if err := c.init(); err != nil {
return ItemInfo{}, nil, err
}
id = cleanID(id)

c.nlocker.Lock(id)
Expand Down Expand Up @@ -197,6 +221,9 @@ func (c *Cache) GetOrCreate(id string, create func() (io.ReadCloser, error)) (It

// GetOrCreateBytes is the same as GetOrCreate, but produces a byte slice.
func (c *Cache) GetOrCreateBytes(id string, create func() ([]byte, error)) (ItemInfo, []byte, error) {
if err := c.init(); err != nil {
return ItemInfo{}, nil, err
}
id = cleanID(id)

c.nlocker.Lock(id)
Expand Down Expand Up @@ -232,6 +259,9 @@ func (c *Cache) GetOrCreateBytes(id string, create func() ([]byte, error)) (Item

// GetBytes gets the file content with the given id from the cache, nil if none found.
func (c *Cache) GetBytes(id string) (ItemInfo, []byte, error) {
if err := c.init(); err != nil {
return ItemInfo{}, nil, err
}
id = cleanID(id)

c.nlocker.Lock(id)
Expand All @@ -250,6 +280,9 @@ func (c *Cache) GetBytes(id string) (ItemInfo, []byte, error) {

// Get gets the file with the given id from the cache, nil if none found.
func (c *Cache) Get(id string) (ItemInfo, io.ReadCloser, error) {
if err := c.init(); err != nil {
return ItemInfo{}, nil, err
}
id = cleanID(id)

c.nlocker.Lock(id)
Expand Down Expand Up @@ -347,10 +380,6 @@ func NewCaches(p *helpers.PathSpec) (Caches, error) {

baseDir := v.DirCompiled

if err := cfs.MkdirAll(baseDir, 0777); err != nil && !os.IsExist(err) {
return nil, err
}

bfs := afero.NewBasePathFs(cfs, baseDir)

var pruneAllRootDir string
Expand Down
6 changes: 6 additions & 0 deletions cache/filecache/filecache_pruner.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ func (c *Cache) Prune(force bool) (int, error) {
if c.pruneAllRootDir != "" {
return c.pruneRootDir(force)
}
if err := c.init(); err != nil {
return 0, err
}

counter := 0

Expand Down Expand Up @@ -117,6 +120,9 @@ func (c *Cache) Prune(force bool) (int, error) {
}

func (c *Cache) pruneRootDir(force bool) (int, error) {
if err := c.init(); err != nil {
return 0, err
}
info, err := c.Fs.Stat(c.pruneAllRootDir)
if err != nil {
if herrors.IsNotExist(err) {
Expand Down
7 changes: 7 additions & 0 deletions testscripts/unfinished/new_content.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
hugo new site myblog
cd myblog
hugo new content --kind post post/first-post.md
! exists resources
grep 'draft = true' content/post/first-post.md


0 comments on commit e082591

Please sign in to comment.