mirror of
				https://github.com/minio/minio.git
				synced 2025-10-29 15:55:00 -04: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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user