| 
									
										
										
										
											2021-04-19 03:41:13 +08:00
										 |  |  | // Copyright (c) 2015-2021 MinIO, Inc.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This file is part of MinIO Object Storage stack
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2016-04-22 11:07:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2016-04-08 10:01:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-12 00:15:54 +08:00
										 |  |  | // DeleteOptions represents the disk level delete options available for the APIs
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2022-07-12 00:15:54 +08:00
										 |  |  | //msgp:ignore DeleteOptions
 | 
					
						
							|  |  |  | type DeleteOptions struct { | 
					
						
							|  |  |  | 	Recursive bool | 
					
						
							|  |  |  | 	Force     bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-03 09:07:52 +08:00
										 |  |  | //go:generate msgp -file=$GOFILE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 02:10:54 +08:00
										 |  |  | // DiskInfo is an extended type which returns current
 | 
					
						
							|  |  |  | // disk usage per path.
 | 
					
						
							| 
									
										
										
										
											2021-01-04 03:27:57 +08:00
										 |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //msgp:tuple DiskInfo
 | 
					
						
							| 
									
										
										
										
											2020-11-05 02:10:54 +08:00
										 |  |  | type DiskInfo struct { | 
					
						
							| 
									
										
										
										
											2020-12-27 14:58:06 +08:00
										 |  |  | 	Total      uint64 | 
					
						
							|  |  |  | 	Free       uint64 | 
					
						
							|  |  |  | 	Used       uint64 | 
					
						
							|  |  |  | 	UsedInodes uint64 | 
					
						
							| 
									
										
										
										
											2021-05-06 14:03:40 +08:00
										 |  |  | 	FreeInodes uint64 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:13:49 +08:00
										 |  |  | 	Major      uint32 | 
					
						
							|  |  |  | 	Minor      uint32 | 
					
						
							| 
									
										
										
										
											2020-12-27 14:58:06 +08:00
										 |  |  | 	FSType     string | 
					
						
							|  |  |  | 	RootDisk   bool | 
					
						
							|  |  |  | 	Healing    bool | 
					
						
							| 
									
										
										
										
											2022-08-16 22:13:49 +08:00
										 |  |  | 	Scanning   bool | 
					
						
							| 
									
										
										
										
											2020-12-27 14:58:06 +08:00
										 |  |  | 	Endpoint   string | 
					
						
							|  |  |  | 	MountPath  string | 
					
						
							|  |  |  | 	ID         string | 
					
						
							| 
									
										
										
										
											2021-03-17 11:06:57 +08:00
										 |  |  | 	Metrics    DiskMetrics | 
					
						
							| 
									
										
										
										
											2020-12-27 14:58:06 +08:00
										 |  |  | 	Error      string // carries the error over the network
 | 
					
						
							| 
									
										
										
										
											2020-11-05 02:10:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 11:06:57 +08:00
										 |  |  | // DiskMetrics has the information about XL Storage APIs
 | 
					
						
							|  |  |  | // the number of calls of each API and the moving average of
 | 
					
						
							|  |  |  | // the duration of each API.
 | 
					
						
							|  |  |  | type DiskMetrics struct { | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	LastMinute map[string]AccElem `json:"apiLatencies,omitempty"` | 
					
						
							|  |  |  | 	APICalls   map[string]uint64  `json:"apiCalls,omitempty"` | 
					
						
							| 
									
										
										
										
											2021-03-17 11:06:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 02:10:54 +08:00
										 |  |  | // VolsInfo is a collection of volume(bucket) information
 | 
					
						
							|  |  |  | type VolsInfo []VolInfo | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // VolInfo - represents volume stat information.
 | 
					
						
							| 
									
										
										
										
											2021-01-04 03:27:57 +08:00
										 |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //msgp:tuple VolInfo
 | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | type VolInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Name of the volume.
 | 
					
						
							|  |  |  | 	Name string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time when the volume was created.
 | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 	Created time.Time | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | // FilesInfo represent a list of files, additionally
 | 
					
						
							|  |  |  | // indicates if the list is last.
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | //msgp:tuple FileInfo
 | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | type FilesInfo struct { | 
					
						
							|  |  |  | 	Files       []FileInfo | 
					
						
							|  |  |  | 	IsTruncated bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | // Size returns size of all versions for the object 'Name'
 | 
					
						
							|  |  |  | func (f FileInfoVersions) Size() (size int64) { | 
					
						
							|  |  |  | 	for _, v := range f.Versions { | 
					
						
							|  |  |  | 		size += v.Size | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return size | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FileInfoVersions represent a list of versions for a given file.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //
 | 
					
						
							|  |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //msgp:tuple FileInfoVersions
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | type FileInfoVersions struct { | 
					
						
							|  |  |  | 	// Name of the volume.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Volume string `msg:"v,omitempty"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the file.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Name string `msg:"n,omitempty"` | 
					
						
							| 
									
										
										
										
											2021-01-27 18:19:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// Represents the latest mod time of the
 | 
					
						
							|  |  |  | 	// latest version.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	LatestModTime time.Time `msg:"lm"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-20 09:54:10 +08:00
										 |  |  | 	Versions     []FileInfo `msg:"vs"` | 
					
						
							|  |  |  | 	FreeVersions []FileInfo `msg:"fvs"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-12 02:22:03 +08:00
										 |  |  | // findVersionIndex will return the version index where the version
 | 
					
						
							|  |  |  | // was found. Returns -1 if not found.
 | 
					
						
							|  |  |  | func (f *FileInfoVersions) findVersionIndex(v string) int { | 
					
						
							|  |  |  | 	if f == nil || v == "" { | 
					
						
							|  |  |  | 		return -1 | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	for i, ver := range f.Versions { | 
					
						
							|  |  |  | 		if ver.VersionID == v { | 
					
						
							| 
									
										
										
										
											2021-02-12 02:22:03 +08:00
										 |  |  | 			return i | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-02-12 02:22:03 +08:00
										 |  |  | 	return -1 | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-21 03:49:05 +08:00
										 |  |  | // RawFileInfo - represents raw file stat information as byte array.
 | 
					
						
							|  |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							|  |  |  | // Make sure to bump the internode version at storage-rest-common.go
 | 
					
						
							|  |  |  | type RawFileInfo struct { | 
					
						
							|  |  |  | 	// Content of entire xl.meta (may contain data depending on what was requested by the caller.
 | 
					
						
							|  |  |  | 	Buf []byte `msg:"b"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// DiskMTime indicates the mtime of the xl.meta on disk
 | 
					
						
							|  |  |  | 	// This is mainly used for detecting a particular issue
 | 
					
						
							|  |  |  | 	// reported in https://github.com/minio/minio/pull/13803
 | 
					
						
							|  |  |  | 	DiskMTime time.Time `msg:"dmt"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // FileInfo - represents file stat information.
 | 
					
						
							| 
									
										
										
										
											2020-11-03 09:07:52 +08:00
										 |  |  | // The above means that any added/deleted fields are incompatible.
 | 
					
						
							| 
									
										
										
										
											2022-04-21 03:49:05 +08:00
										 |  |  | // Make sure to bump the internode version at storage-rest-common.go
 | 
					
						
							| 
									
										
										
										
											2016-04-08 10:01:15 +08:00
										 |  |  | type FileInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Name of the volume.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Volume string `msg:"v,omitempty"` | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the file.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Name string `msg:"n,omitempty"` | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// Version of the file.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	VersionID string `msg:"vid,omitempty"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Indicates if the version is the latest
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	IsLatest bool `msg:"is"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Deleted is set when this FileInfo represents
 | 
					
						
							|  |  |  | 	// a deleted marker for a versioned bucket.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Deleted bool `msg:"del"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-13 04:12:09 +08:00
										 |  |  | 	// TransitionStatus is set to Pending/Complete for transitioned
 | 
					
						
							|  |  |  | 	// entries based on state of transition
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	TransitionStatus string `msg:"ts"` | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 	// TransitionedObjName is the object name on the remote tier corresponding
 | 
					
						
							|  |  |  | 	// to object (version) on the source tier.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	TransitionedObjName string `msg:"to"` | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 	// TransitionTier is the storage class label assigned to remote tier.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	TransitionTier string `msg:"tt"` | 
					
						
							| 
									
										
										
										
											2021-06-04 05:26:51 +08:00
										 |  |  | 	// TransitionVersionID stores a version ID of the object associate
 | 
					
						
							|  |  |  | 	// with the remote tier.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	TransitionVersionID string `msg:"tv"` | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 	// ExpireRestored indicates that the restored object is to be expired.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	ExpireRestored bool `msg:"exp"` | 
					
						
							| 
									
										
										
										
											2020-11-13 04:12:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// DataDir of the file
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	DataDir string `msg:"dd"` | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-18 08:41:29 +08:00
										 |  |  | 	// Indicates if this object is still in V1 format.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	XLV1 bool `msg:"v1"` | 
					
						
							| 
									
										
										
										
											2020-07-18 08:41:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// Date and time when the file was last modified, if Deleted
 | 
					
						
							|  |  |  | 	// is 'true' this value represents when while was deleted.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	ModTime time.Time `msg:"mt"` | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Total file size.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Size int64 `msg:"sz"` | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// File mode bits.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Mode uint32 `msg:"m"` | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-27 18:59:41 +08:00
										 |  |  | 	// WrittenByVersion is the unix time stamp of the MinIO
 | 
					
						
							|  |  |  | 	// version that created this version of the object.
 | 
					
						
							|  |  |  | 	WrittenByVersion uint64 `msg:"wv"` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | 	// File metadata
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Metadata map[string]string `msg:"meta"` | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// All the parts per object.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Parts []ObjectPartInfo `msg:"parts"` | 
					
						
							| 
									
										
										
										
											2019-05-15 04:49:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// Erasure info for all objects.
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Erasure ErasureInfo `msg:"ei"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	MarkDeleted      bool             `msg:"md"` // mark this version as deleted
 | 
					
						
							|  |  |  | 	ReplicationState ReplicationState `msg:"rs"` // Internal replication state to be passed back in ObjectInfo
 | 
					
						
							| 
									
										
										
										
											2020-11-20 10:43:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Data []byte `msg:"d,allownil"` // optionally carries object data
 | 
					
						
							| 
									
										
										
										
											2021-01-08 11:27:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	NumVersions      int       `msg:"nv"` | 
					
						
							|  |  |  | 	SuccessorModTime time.Time `msg:"smt"` | 
					
						
							| 
									
										
										
										
											2021-02-02 01:52:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	Fresh bool `msg:"fr"` // indicates this is a first time call to write FileInfo.
 | 
					
						
							| 
									
										
										
										
											2021-08-11 02:12:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 01:50:07 +08:00
										 |  |  | 	// Position of this version or object in a multi-object delete call,
 | 
					
						
							|  |  |  | 	// no other caller must set this value other than multi-object delete call.
 | 
					
						
							|  |  |  | 	// usage in other calls in undefined please avoid.
 | 
					
						
							|  |  |  | 	Idx int `msg:"i"` | 
					
						
							| 
									
										
										
										
											2021-12-22 02:08:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// DiskMTime indicates the mtime of the xl.meta on disk
 | 
					
						
							|  |  |  | 	// This is mainly used for detecting a particular issue
 | 
					
						
							|  |  |  | 	// reported in https://github.com/minio/minio/pull/13803
 | 
					
						
							|  |  |  | 	DiskMTime time.Time `msg:"dmt"` | 
					
						
							| 
									
										
										
										
											2022-08-30 07:57:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Combined checksum when object was uploaded.
 | 
					
						
							| 
									
										
										
										
											2022-08-31 23:13:23 +08:00
										 |  |  | 	Checksum []byte `msg:"cs,allownil"` | 
					
						
							| 
									
										
										
										
											2021-12-22 02:08:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Equals checks if fi(FileInfo) matches ofi(FileInfo)
 | 
					
						
							|  |  |  | func (fi FileInfo) Equals(ofi FileInfo) (ok bool) { | 
					
						
							|  |  |  | 	if !fi.MetadataEquals(ofi) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !fi.ReplicationInfoEquals(ofi) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !fi.TransitionInfoEquals(ofi) { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return fi.ModTime.Equal(ofi.ModTime) | 
					
						
							| 
									
										
										
										
											2020-11-20 10:43:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 02:41:30 +08:00
										 |  |  | // GetDataDir returns an expected dataDir given FileInfo
 | 
					
						
							| 
									
										
										
										
											2022-08-27 03:52:29 +08:00
										 |  |  | //   - deleteMarker returns "delete-marker"
 | 
					
						
							|  |  |  | //   - returns "legacy" if FileInfo is XLV1 and DataDir is
 | 
					
						
							|  |  |  | //     empty, returns DataDir otherwise
 | 
					
						
							|  |  |  | //   - returns "dataDir"
 | 
					
						
							| 
									
										
										
										
											2021-11-22 02:41:30 +08:00
										 |  |  | func (fi FileInfo) GetDataDir() string { | 
					
						
							|  |  |  | 	if fi.Deleted { | 
					
						
							|  |  |  | 		return "delete-marker" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if fi.XLV1 && fi.DataDir == "" { | 
					
						
							|  |  |  | 		return "legacy" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return fi.DataDir | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-17 00:38:27 +08:00
										 |  |  | // InlineData returns true if object contents are inlined alongside its metadata.
 | 
					
						
							|  |  |  | func (fi FileInfo) InlineData() bool { | 
					
						
							|  |  |  | 	_, ok := fi.Metadata[ReservedMetadataPrefixLower+"inline-data"] | 
					
						
							|  |  |  | 	return ok | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SetInlineData marks object (version) as inline.
 | 
					
						
							| 
									
										
										
										
											2021-08-13 23:25:54 +08:00
										 |  |  | func (fi *FileInfo) SetInlineData() { | 
					
						
							|  |  |  | 	if fi.Metadata == nil { | 
					
						
							|  |  |  | 		fi.Metadata = make(map[string]string, 1) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-07-17 00:38:27 +08:00
										 |  |  | 	fi.Metadata[ReservedMetadataPrefixLower+"inline-data"] = "true" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 10:43:58 +08:00
										 |  |  | // VersionPurgeStatusKey denotes purge status in metadata
 | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	VersionPurgeStatusKey = ReservedMetadataPrefixLower + "purgestatus" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2020-11-20 10:43:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | // newFileInfo - initializes new FileInfo, allocates a fresh erasure info.
 | 
					
						
							|  |  |  | func newFileInfo(object string, dataBlocks, parityBlocks int) (fi FileInfo) { | 
					
						
							|  |  |  | 	fi.Erasure = ErasureInfo{ | 
					
						
							|  |  |  | 		Algorithm:    erasureAlgorithm, | 
					
						
							|  |  |  | 		DataBlocks:   dataBlocks, | 
					
						
							|  |  |  | 		ParityBlocks: parityBlocks, | 
					
						
							| 
									
										
											  
											
												[feat]: change erasure coding default block size from 10MiB to 1MiB (#11721)
major performance improvements in range GETs to avoid large
read amplification when ranges are tiny and random
```
-------------------
Operation: GET
Operations: 142014 -> 339421
Duration: 4m50s -> 4m56s
* Average: +139.41% (+1177.3 MiB/s) throughput, +139.11% (+658.4) obj/s
* Fastest: +125.24% (+1207.4 MiB/s) throughput, +132.32% (+612.9) obj/s
* 50% Median: +139.06% (+1175.7 MiB/s) throughput, +133.46% (+660.9) obj/s
* Slowest: +203.40% (+1267.9 MiB/s) throughput, +198.59% (+753.5) obj/s
```
TTFB from 10MiB BlockSize
```
* First Access TTFB: Avg: 81ms, Median: 61ms, Best: 20ms, Worst: 2.056s
```
TTFB from 1MiB BlockSize
```
* First Access TTFB: Avg: 22ms, Median: 21ms, Best: 8ms, Worst: 91ms
```
Full object reads however do see a slight change which won't be
noticeable in real world, so not doing any comparisons
TTFB still had improvements with full object reads with 1MiB
```
* First Access TTFB: Avg: 68ms, Median: 35ms, Best: 11ms, Worst: 1.16s
```
v/s
TTFB with 10MiB
```
* First Access TTFB: Avg: 388ms, Median: 98ms, Best: 20ms, Worst: 4.156s
```
This change should affect all new uploads, previous uploads should
continue to work with business as usual. But dramatic improvements can
be seen with these changes.
											
										 
											2021-03-07 06:09:34 +08:00
										 |  |  | 		BlockSize:    blockSizeV2, | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 		Distribution: hashOrder(object, dataBlocks+parityBlocks), | 
					
						
							| 
									
										
										
										
											2020-02-25 23:52:28 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	return fi | 
					
						
							| 
									
										
										
										
											2020-02-25 23:52:28 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2022-07-19 23:35:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // ReadMultipleReq contains information of multiple files to read from disk.
 | 
					
						
							|  |  |  | type ReadMultipleReq struct { | 
					
						
							|  |  |  | 	Bucket       string   // Bucket. Can be empty if multiple buckets.
 | 
					
						
							|  |  |  | 	Prefix       string   // Shared prefix of all files. Can be empty. Will be joined to filename without modification.
 | 
					
						
							|  |  |  | 	Files        []string // Individual files to read.
 | 
					
						
							|  |  |  | 	MaxSize      int64    // Return error if size is exceed.
 | 
					
						
							|  |  |  | 	MetadataOnly bool     // Read as XL meta and truncate data.
 | 
					
						
							|  |  |  | 	AbortOn404   bool     // Stop reading after first file not found.
 | 
					
						
							| 
									
										
										
										
											2022-07-22 07:47:58 +08:00
										 |  |  | 	MaxResults   int      // Stop after this many successful results. <= 0 means all.
 | 
					
						
							| 
									
										
										
										
											2022-07-19 23:35:29 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ReadMultipleResp contains a single response from a ReadMultipleReq.
 | 
					
						
							|  |  |  | type ReadMultipleResp struct { | 
					
						
							|  |  |  | 	Bucket  string    // Bucket as given by request.
 | 
					
						
							|  |  |  | 	Prefix  string    // Prefix as given by request.
 | 
					
						
							|  |  |  | 	File    string    // File name as given in request.
 | 
					
						
							|  |  |  | 	Exists  bool      // Returns whether the file existed on disk.
 | 
					
						
							|  |  |  | 	Error   string    // Returns any error when reading.
 | 
					
						
							|  |  |  | 	Data    []byte    // Contains all data of file.
 | 
					
						
							|  |  |  | 	Modtime time.Time // Modtime of file on disk.
 | 
					
						
							|  |  |  | } |