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  }