MCPcopy Create free account
hub / github.com/AbelChe/evil_minio / put

Method put

cmd/disk-cache-backend.go:851–927  ·  view source on GitHub ↗

Caches the object to disk

(ctx context.Context, bucket, object string, data io.Reader, size int64, rs *HTTPRangeSpec, opts ObjectOptions, incHitsOnly, writeback bool)

Source from the content-addressed store, hash-verified

849
850// Caches the object to disk
851func (c *diskCache) put(ctx context.Context, bucket, object string, data io.Reader, size int64, rs *HTTPRangeSpec, opts ObjectOptions, incHitsOnly, writeback bool) (oi ObjectInfo, err error) {
852 if !c.diskSpaceAvailable(size) {
853 io.Copy(io.Discard, data)
854 return oi, errDiskFull
855 }
856 cachePath := getCacheSHADir(c.dir, bucket, object)
857 meta, _, numHits, err := c.statCache(ctx, cachePath)
858 // Case where object not yet cached
859 if osIsNotExist(err) && c.after >= 1 {
860 return oi, c.saveMetadata(ctx, bucket, object, opts.UserDefined, size, nil, "", false)
861 }
862 // Case where object already has a cache metadata entry but not yet cached
863 if err == nil && numHits < c.after {
864 cETag := extractETag(meta.Meta)
865 bETag := extractETag(opts.UserDefined)
866 if cETag == bETag {
867 return oi, c.saveMetadata(ctx, bucket, object, opts.UserDefined, size, nil, "", false)
868 }
869 incHitsOnly = true
870 }
871
872 if rs != nil {
873 return oi, c.putRange(ctx, bucket, object, data, size, rs, opts)
874 }
875 if !c.diskSpaceAvailable(size) {
876 return oi, errDiskFull
877 }
878
879 if writeback {
880 cachePath = getCacheWriteBackSHADir(c.dir, bucket, object)
881 }
882
883 if err := os.MkdirAll(cachePath, 0o777); err != nil {
884 removeAll(cachePath)
885 return oi, err
886 }
887 metadata := cloneMSS(opts.UserDefined)
888 reader := data
889 actualSize := uint64(size)
890 if globalCacheKMS != nil {
891 reader, err = newCacheEncryptReader(ctx, data, bucket, object, metadata)
892 if err != nil {
893 removeAll(cachePath)
894 return oi, err
895 }
896 actualSize, _ = sio.EncryptedSize(uint64(size))
897 }
898 n, md5sum, err := c.bitrotWriteToCache(cachePath, cacheDataFile, reader, actualSize)
899 if IsErr(err, baseErrs...) {
900 // take the cache drive offline
901 c.setOffline()
902 }
903 if err != nil {
904 removeAll(cachePath)
905 return oi, err
906 }
907
908 if actualSize != uint64(n) {

Callers 2

PutMethod · 0.95
PutObjectMethod · 0.80

Calls 15

diskSpaceAvailableMethod · 0.95
statCacheMethod · 0.95
saveMetadataMethod · 0.95
putRangeMethod · 0.95
bitrotWriteToCacheMethod · 0.95
setOfflineMethod · 0.95
getCacheSHADirFunction · 0.85
osIsNotExistFunction · 0.85
extractETagFunction · 0.85
getCacheWriteBackSHADirFunction · 0.85
removeAllFunction · 0.85
cloneMSSFunction · 0.85

Tested by

no test coverage detected