Caches the object to disk
(ctx context.Context, bucket, object string, data io.Reader, size int64, rs *HTTPRangeSpec, opts ObjectOptions, incHitsOnly, writeback bool)
| 849 | |
| 850 | // Caches the object to disk |
| 851 | func (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) { |
no test coverage detected