mirror of
https://github.com/minio/minio.git
synced 2025-01-11 15:03:22 -05:00
cache: allow ellipse style entries for MINIO_CACHE_DRIVES (#6088)
Fixes #5863
This commit is contained in:
parent
e40a5e05e1
commit
1da362538b
@ -19,6 +19,9 @@ package cmd
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/minio/minio/pkg/ellipses"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CacheConfig represents cache config settings
|
// CacheConfig represents cache config settings
|
||||||
@ -52,12 +55,42 @@ func (cfg *CacheConfig) UnmarshalJSON(data []byte) (err error) {
|
|||||||
|
|
||||||
// Parses given cacheDrivesEnv and returns a list of cache drives.
|
// Parses given cacheDrivesEnv and returns a list of cache drives.
|
||||||
func parseCacheDrives(drives []string) ([]string, error) {
|
func parseCacheDrives(drives []string) ([]string, error) {
|
||||||
|
if len(drives) == 0 {
|
||||||
|
return drives, nil
|
||||||
|
}
|
||||||
|
var endpoints []string
|
||||||
for _, d := range drives {
|
for _, d := range drives {
|
||||||
|
if ellipses.HasEllipses(d) {
|
||||||
|
s, err := parseCacheDrivePaths(d)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
endpoints = append(endpoints, s...)
|
||||||
|
} else {
|
||||||
|
endpoints = append(endpoints, d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, d := range endpoints {
|
||||||
if !filepath.IsAbs(d) {
|
if !filepath.IsAbs(d) {
|
||||||
return nil, uiErrInvalidCacheDrivesValue(nil).Msg("cache dir should be absolute path: %s", d)
|
return nil, uiErrInvalidCacheDrivesValue(nil).Msg("cache dir should be absolute path: %s", d)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return drives, nil
|
return endpoints, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parses all arguments and returns a slice of drive paths following the ellipses pattern.
|
||||||
|
func parseCacheDrivePaths(arg string) (ep []string, err error) {
|
||||||
|
patterns, perr := ellipses.FindEllipsesPatterns(arg)
|
||||||
|
if perr != nil {
|
||||||
|
return []string{}, uiErrInvalidCacheDrivesValue(nil).Msg(perr.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, lbls := range patterns.Expand() {
|
||||||
|
ep = append(ep, strings.Join(lbls, ""))
|
||||||
|
}
|
||||||
|
|
||||||
|
return ep, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses given cacheExcludesEnv and returns a list of cache exclude patterns.
|
// Parses given cacheExcludesEnv and returns a list of cache exclude patterns.
|
||||||
|
@ -41,12 +41,32 @@ func TestParseCacheDrives(t *testing.T) {
|
|||||||
expectedPatterns []string
|
expectedPatterns []string
|
||||||
success bool
|
success bool
|
||||||
}{"C:/home/drive1;C:/home/drive2;C:/home/drive3", []string{"C:/home/drive1", "C:/home/drive2", "C:/home/drive3"}, true})
|
}{"C:/home/drive1;C:/home/drive2;C:/home/drive3", []string{"C:/home/drive1", "C:/home/drive2", "C:/home/drive3"}, true})
|
||||||
|
testCases = append(testCases, struct {
|
||||||
|
driveStr string
|
||||||
|
expectedPatterns []string
|
||||||
|
success bool
|
||||||
|
}{"C:/home/drive{1...3}", []string{"C:/home/drive1", "C:/home/drive2", "C:/home/drive3"}, true})
|
||||||
|
testCases = append(testCases, struct {
|
||||||
|
driveStr string
|
||||||
|
expectedPatterns []string
|
||||||
|
success bool
|
||||||
|
}{"C:/home/drive{1..3}", []string{}, false})
|
||||||
} else {
|
} else {
|
||||||
testCases = append(testCases, struct {
|
testCases = append(testCases, struct {
|
||||||
driveStr string
|
driveStr string
|
||||||
expectedPatterns []string
|
expectedPatterns []string
|
||||||
success bool
|
success bool
|
||||||
}{"/home/drive1;/home/drive2;/home/drive3", []string{"/home/drive1", "/home/drive2", "/home/drive3"}, true})
|
}{"/home/drive1;/home/drive2;/home/drive3", []string{"/home/drive1", "/home/drive2", "/home/drive3"}, true})
|
||||||
|
testCases = append(testCases, struct {
|
||||||
|
driveStr string
|
||||||
|
expectedPatterns []string
|
||||||
|
success bool
|
||||||
|
}{"/home/drive{1...3}", []string{"/home/drive1", "/home/drive2", "/home/drive3"}, true})
|
||||||
|
testCases = append(testCases, struct {
|
||||||
|
driveStr string
|
||||||
|
expectedPatterns []string
|
||||||
|
success bool
|
||||||
|
}{"/home/drive{1..3}", []string{}, false})
|
||||||
}
|
}
|
||||||
for i, testCase := range testCases {
|
for i, testCase := range testCases {
|
||||||
drives, err := parseCacheDrives(strings.Split(testCase.driveStr, cacheEnvDelimiter))
|
drives, err := parseCacheDrives(strings.Split(testCase.driveStr, cacheEnvDelimiter))
|
||||||
|
@ -110,6 +110,7 @@ By default, parity for objects with standard storage class is set to `N/2`, and
|
|||||||
|``drives``| _[]string_ | List of mounted file system drives with [`atime`](http://kerolasa.github.io/filetimes.html) support enabled|
|
|``drives``| _[]string_ | List of mounted file system drives with [`atime`](http://kerolasa.github.io/filetimes.html) support enabled|
|
||||||
|``exclude`` | _[]string_ | List of wildcard patterns for prefixes to exclude from cache |
|
|``exclude`` | _[]string_ | List of wildcard patterns for prefixes to exclude from cache |
|
||||||
|``expiry`` | _int_ | Days to cache expiry |
|
|``expiry`` | _int_ | Days to cache expiry |
|
||||||
|
|``maxuse`` | _int_ | Percentage of disk available to cache |
|
||||||
|
|
||||||
#### Notify
|
#### Notify
|
||||||
|Field|Type|Description|
|
|Field|Type|Description|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"version": "24",
|
"version": "26",
|
||||||
"credential": {
|
"credential": {
|
||||||
"accessKey": "USWUXHGYZQYFYFFIT3RE",
|
"accessKey": "USWUXHGYZQYFYFFIT3RE",
|
||||||
"secretKey": "MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03"
|
"secretKey": "MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03"
|
||||||
},
|
},
|
||||||
"region": "us-east-1",
|
"region": "us-east-1",
|
||||||
"browser": "on",
|
"browser": "on",
|
||||||
|
"worm": "off",
|
||||||
"domain": "",
|
"domain": "",
|
||||||
"storageclass": {
|
"storageclass": {
|
||||||
"standard": "",
|
"standard": "",
|
||||||
@ -14,11 +15,12 @@
|
|||||||
"cache": {
|
"cache": {
|
||||||
"drives": [],
|
"drives": [],
|
||||||
"expiry": 90,
|
"expiry": 90,
|
||||||
"exclude": []
|
"exclude": [],
|
||||||
|
"maxuse": 80
|
||||||
},
|
},
|
||||||
"usage": {
|
"usage": {
|
||||||
"interval": "3h"
|
"interval": "3h"
|
||||||
}
|
},
|
||||||
"notify": {
|
"notify": {
|
||||||
"amqp": {
|
"amqp": {
|
||||||
"1": {
|
"1": {
|
||||||
@ -124,3 +126,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,10 +16,10 @@ minio server -h
|
|||||||
...
|
...
|
||||||
...
|
...
|
||||||
|
|
||||||
7. Start minio server with edge caching enabled on '/mnt/drive1', '/mnt/drive2' and '/mnt/drive3',
|
7. Start minio server with edge caching enabled on '/mnt/drive1', '/mnt/drive2' and '/mnt/export1 ... /mnt/export24',
|
||||||
exclude all objects under 'mybucket', exclude all objects with '.pdf' as extension
|
exclude all objects under 'mybucket', exclude all objects with '.pdf' as extension
|
||||||
with expiry upto 40 days.
|
with expiry upto 40 days.
|
||||||
$ export MINIO_CACHE_DRIVES="/mnt/drive1;/mnt/drive2;/mnt/drive3"
|
$ export MINIO_CACHE_DRIVES="/mnt/drive1;/mnt/drive2;/mnt/export{1..24}"
|
||||||
$ export MINIO_CACHE_EXCLUDE="mybucket/*;*.pdf"
|
$ export MINIO_CACHE_EXCLUDE="mybucket/*;*.pdf"
|
||||||
$ export MINIO_CACHE_EXPIRY=40
|
$ export MINIO_CACHE_EXPIRY=40
|
||||||
$ export MINIO_CACHE_MAXUSE=80
|
$ export MINIO_CACHE_MAXUSE=80
|
||||||
|
@ -17,14 +17,15 @@ Disk caching can be enabled by updating the `cache` config settings for Minio se
|
|||||||
"cache": {
|
"cache": {
|
||||||
"drives": ["/mnt/drive1", "/mnt/drive2", "/mnt/drive3"],
|
"drives": ["/mnt/drive1", "/mnt/drive2", "/mnt/drive3"],
|
||||||
"expiry": 90,
|
"expiry": 90,
|
||||||
"exclude": ["*.pdf","mybucket/*"]
|
"exclude": ["*.pdf","mybucket/*"],
|
||||||
|
"maxuse" : 70,
|
||||||
},
|
},
|
||||||
```
|
```
|
||||||
|
|
||||||
The cache settings may also be set through environment variables. When set, environment variables override any `cache` config settings for Minio server. Following example uses `/mnt/drive1`, `/mnt/drive2` and `/mnt/drive3` for caching, with expiry upto 90 days while excluding all objects under bucket `mybucket` and all objects with '.pdf' as extension while starting a standalone erasure coded setup.
|
The cache settings may also be set through environment variables. When set, environment variables override any `cache` config settings for Minio server. Following example uses `/mnt/drive1`, `/mnt/drive2` ,`/mnt/cache1` ... `/mnt/cache3` for caching, with expiry upto 90 days while excluding all objects under bucket `mybucket` and all objects with '.pdf' as extension while starting a standalone erasure coded setup. Cache max usage is restricted to 80% of disk capacity in this example.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
export MINIO_CACHE_DRIVES="/mnt/drive1;/mnt/drive2;/mnt/drive3"
|
export MINIO_CACHE_DRIVES="/mnt/drive1;/mnt/drive2;/mnt/cache{1...3}"
|
||||||
export MINIO_CACHE_EXPIRY=90
|
export MINIO_CACHE_EXPIRY=90
|
||||||
export MINIO_CACHE_EXCLUDE="*.pdf;mybucket/*"
|
export MINIO_CACHE_EXCLUDE="*.pdf;mybucket/*"
|
||||||
export MINIO_CACHE_MAXUSE=80
|
export MINIO_CACHE_MAXUSE=80
|
||||||
|
Loading…
Reference in New Issue
Block a user