storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/cmd/xl-storage-format-utils.go (about) 1 /* 2 * MinIO Cloud Storage, (C) 2020 MinIO, Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package cmd 18 19 import ( 20 jsoniter "github.com/json-iterator/go" 21 ) 22 23 type versionsSorter []FileInfo 24 25 func (v versionsSorter) Len() int { return len(v) } 26 func (v versionsSorter) Swap(i, j int) { v[i], v[j] = v[j], v[i] } 27 func (v versionsSorter) Less(i, j int) bool { 28 if v[i].IsLatest { 29 return true 30 } 31 if v[j].IsLatest { 32 return false 33 } 34 return v[i].ModTime.After(v[j].ModTime) 35 } 36 37 func getFileInfoVersions(xlMetaBuf []byte, volume, path string) (FileInfoVersions, error) { 38 if isXL2V1Format(xlMetaBuf) { 39 var xlMeta xlMetaV2 40 if err := xlMeta.Load(xlMetaBuf); err != nil { 41 return FileInfoVersions{}, err 42 } 43 versions, latestModTime, err := xlMeta.ListVersions(volume, path) 44 if err != nil { 45 return FileInfoVersions{}, err 46 } 47 return FileInfoVersions{ 48 Volume: volume, 49 Name: path, 50 Versions: versions, 51 LatestModTime: latestModTime, 52 }, nil 53 } 54 55 xlMeta := &xlMetaV1Object{} 56 var json = jsoniter.ConfigCompatibleWithStandardLibrary 57 if err := json.Unmarshal(xlMetaBuf, xlMeta); err != nil { 58 return FileInfoVersions{}, errFileCorrupt 59 } 60 61 fi, err := xlMeta.ToFileInfo(volume, path) 62 if err != nil { 63 return FileInfoVersions{}, err 64 } 65 66 fi.IsLatest = true // No versions so current version is latest. 67 fi.XLV1 = true // indicates older version 68 return FileInfoVersions{ 69 Volume: volume, 70 Name: path, 71 Versions: []FileInfo{fi}, 72 LatestModTime: fi.ModTime, 73 }, nil 74 } 75 76 func getFileInfo(xlMetaBuf []byte, volume, path, versionID string, data bool) (FileInfo, error) { 77 if isXL2V1Format(xlMetaBuf) { 78 var xlMeta xlMetaV2 79 if err := xlMeta.Load(xlMetaBuf); err != nil { 80 return FileInfo{}, err 81 } 82 fi, err := xlMeta.ToFileInfo(volume, path, versionID) 83 if !data || err != nil { 84 return fi, err 85 } 86 versionID := fi.VersionID 87 if versionID == "" { 88 versionID = nullVersionID 89 } 90 fi.Data = xlMeta.data.find(versionID) 91 if len(fi.Data) == 0 { 92 // PR #11758 used DataDir, preserve it 93 // for users who might have used master 94 // branch 95 fi.Data = xlMeta.data.find(fi.DataDir) 96 } 97 return fi, nil 98 } 99 100 xlMeta := &xlMetaV1Object{} 101 var json = jsoniter.ConfigCompatibleWithStandardLibrary 102 if err := json.Unmarshal(xlMetaBuf, xlMeta); err != nil { 103 return FileInfo{}, errFileCorrupt 104 } 105 fi, err := xlMeta.ToFileInfo(volume, path) 106 if err == errFileNotFound && versionID != "" { 107 return fi, errFileVersionNotFound 108 } 109 fi.XLV1 = true // indicates older version 110 return fi, err 111 } 112 113 // getXLDiskLoc will return the pool/set/disk id if it can be located in the object layer. 114 // Will return -1 for unknown values. 115 func getXLDiskLoc(diskID string) (poolIdx, setIdx, diskIdx int) { 116 if api := newObjectLayerFn(); api != nil { 117 if ep, ok := api.(*erasureServerPools); ok { 118 if pool, set, disk, err := ep.getPoolAndSet(diskID); err == nil { 119 return pool, set, disk 120 } 121 } 122 } 123 return -1, -1, -1 124 }