[chore]: Bump github.com/minio/minio-go/v7 from 7.0.60 to 7.0.61 (#2041)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
parent
b874e9251e
commit
9ed9d96597
8
go.mod
8
go.mod
|
@ -36,7 +36,7 @@ require (
|
||||||
github.com/jackc/pgx/v5 v5.4.2
|
github.com/jackc/pgx/v5 v5.4.2
|
||||||
github.com/microcosm-cc/bluemonday v1.0.25
|
github.com/microcosm-cc/bluemonday v1.0.25
|
||||||
github.com/miekg/dns v1.1.55
|
github.com/miekg/dns v1.1.55
|
||||||
github.com/minio/minio-go/v7 v7.0.60
|
github.com/minio/minio-go/v7 v7.0.61
|
||||||
github.com/mitchellh/mapstructure v1.5.0
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
github.com/oklog/ulid v1.3.1
|
github.com/oklog/ulid v1.3.1
|
||||||
github.com/spf13/cobra v1.7.0
|
github.com/spf13/cobra v1.7.0
|
||||||
|
@ -128,8 +128,8 @@ require (
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
|
||||||
github.com/klauspost/compress v1.16.5 // indirect
|
github.com/klauspost/compress v1.16.7 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||||
github.com/leodido/go-urn v1.2.4 // indirect
|
github.com/leodido/go-urn v1.2.4 // indirect
|
||||||
github.com/magiconair/properties v1.8.7 // indirect
|
github.com/magiconair/properties v1.8.7 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
github.com/mattn/go-isatty v0.0.19 // indirect
|
||||||
|
@ -144,7 +144,7 @@ require (
|
||||||
github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect
|
github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b // indirect
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||||
github.com/rs/xid v1.5.0 // indirect
|
github.com/rs/xid v1.5.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.9.2 // indirect
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
github.com/spf13/afero v1.9.5 // indirect
|
github.com/spf13/afero v1.9.5 // indirect
|
||||||
github.com/spf13/cast v1.5.1 // indirect
|
github.com/spf13/cast v1.5.1 // indirect
|
||||||
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
|
17
go.sum
17
go.sum
|
@ -408,12 +408,12 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:C
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
|
||||||
github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI=
|
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
|
||||||
github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
|
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
|
||||||
|
@ -450,8 +450,8 @@ github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
||||||
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
||||||
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
|
||||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||||
github.com/minio/minio-go/v7 v7.0.60 h1:iHkrmWyHFs/eZiWc2F/5jAHtNBAFy+HjdhMX6FkkPWc=
|
github.com/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI=
|
||||||
github.com/minio/minio-go/v7 v7.0.60/go.mod h1:NUDy4A4oXPq1l2yK6LTSvCEzAMeIcoz9lcj5dbzSrRE=
|
github.com/minio/minio-go/v7 v7.0.61/go.mod h1:BTu8FcrEw+HidY0zd/0eny43QnVNkXRPXrLXFuQBHXg=
|
||||||
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
||||||
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
||||||
github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
|
github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4=
|
||||||
|
@ -511,8 +511,8 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX
|
||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||||
|
@ -857,7 +857,6 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||||
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|
|
@ -90,9 +90,8 @@ type advancedState struct {
|
||||||
ii uint16 // position of last match, intended to overflow to reset.
|
ii uint16 // position of last match, intended to overflow to reset.
|
||||||
|
|
||||||
// input window: unprocessed data is window[index:windowEnd]
|
// input window: unprocessed data is window[index:windowEnd]
|
||||||
index int
|
index int
|
||||||
estBitsPerByte int
|
hashMatch [maxMatchLength + minMatchLength]uint32
|
||||||
hashMatch [maxMatchLength + minMatchLength]uint32
|
|
||||||
|
|
||||||
// Input hash chains
|
// Input hash chains
|
||||||
// hashHead[hashValue] contains the largest inputIndex with the specified hash value
|
// hashHead[hashValue] contains the largest inputIndex with the specified hash value
|
||||||
|
|
|
@ -34,11 +34,6 @@ const (
|
||||||
// Should preferably be a multiple of 6, since
|
// Should preferably be a multiple of 6, since
|
||||||
// we accumulate 6 bytes between writes to the buffer.
|
// we accumulate 6 bytes between writes to the buffer.
|
||||||
bufferFlushSize = 246
|
bufferFlushSize = 246
|
||||||
|
|
||||||
// bufferSize is the actual output byte buffer size.
|
|
||||||
// It must have additional headroom for a flush
|
|
||||||
// which can contain up to 8 bytes.
|
|
||||||
bufferSize = bufferFlushSize + 8
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Minimum length code that emits bits.
|
// Minimum length code that emits bits.
|
||||||
|
|
|
@ -42,25 +42,6 @@ func quickSortByFreq(data []literalNode, a, b, maxDepth int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// siftDownByFreq implements the heap property on data[lo, hi).
|
|
||||||
// first is an offset into the array where the root of the heap lies.
|
|
||||||
func siftDownByFreq(data []literalNode, lo, hi, first int) {
|
|
||||||
root := lo
|
|
||||||
for {
|
|
||||||
child := 2*root + 1
|
|
||||||
if child >= hi {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if child+1 < hi && (data[first+child].freq == data[first+child+1].freq && data[first+child].literal < data[first+child+1].literal || data[first+child].freq < data[first+child+1].freq) {
|
|
||||||
child++
|
|
||||||
}
|
|
||||||
if data[first+root].freq == data[first+child].freq && data[first+root].literal > data[first+child].literal || data[first+root].freq > data[first+child].freq {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
data[first+root], data[first+child] = data[first+child], data[first+root]
|
|
||||||
root = child
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func doPivotByFreq(data []literalNode, lo, hi int) (midlo, midhi int) {
|
func doPivotByFreq(data []literalNode, lo, hi int) (midlo, midhi int) {
|
||||||
m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow.
|
m := int(uint(lo+hi) >> 1) // Written like this to avoid integer overflow.
|
||||||
if hi-lo > 40 {
|
if hi-lo > 40 {
|
||||||
|
|
|
@ -742,7 +742,6 @@ searchDict:
|
||||||
x := load64(src, s-2)
|
x := load64(src, s-2)
|
||||||
m2Hash := hash6(x, tableBits)
|
m2Hash := hash6(x, tableBits)
|
||||||
currHash := hash6(x>>8, tableBits)
|
currHash := hash6(x>>8, tableBits)
|
||||||
candidate = int(table[currHash])
|
|
||||||
table[m2Hash] = uint32(s - 2)
|
table[m2Hash] = uint32(s - 2)
|
||||||
table[currHash] = uint32(s - 1)
|
table[currHash] = uint32(s - 1)
|
||||||
cv = load64(src, s)
|
cv = load64(src, s)
|
||||||
|
|
|
@ -157,7 +157,6 @@ func encodeBlockBetterGo(dst, src []byte) (d int) {
|
||||||
index0 := base + 1
|
index0 := base + 1
|
||||||
index1 := s - 2
|
index1 := s - 2
|
||||||
|
|
||||||
cv = load64(src, s)
|
|
||||||
for index0 < index1 {
|
for index0 < index1 {
|
||||||
cv0 := load64(src, index0)
|
cv0 := load64(src, index0)
|
||||||
cv1 := load64(src, index1)
|
cv1 := load64(src, index1)
|
||||||
|
@ -269,18 +268,21 @@ func encodeBlockBetterGo(dst, src []byte) (d int) {
|
||||||
lTable[hash7(cv0, lTableBits)] = uint32(index0)
|
lTable[hash7(cv0, lTableBits)] = uint32(index0)
|
||||||
sTable[hash4(cv0>>8, sTableBits)] = uint32(index0 + 1)
|
sTable[hash4(cv0>>8, sTableBits)] = uint32(index0 + 1)
|
||||||
|
|
||||||
|
// lTable could be postponed, but very minor difference.
|
||||||
lTable[hash7(cv1, lTableBits)] = uint32(index1)
|
lTable[hash7(cv1, lTableBits)] = uint32(index1)
|
||||||
sTable[hash4(cv1>>8, sTableBits)] = uint32(index1 + 1)
|
sTable[hash4(cv1>>8, sTableBits)] = uint32(index1 + 1)
|
||||||
index0 += 1
|
index0 += 1
|
||||||
index1 -= 1
|
index1 -= 1
|
||||||
cv = load64(src, s)
|
cv = load64(src, s)
|
||||||
|
|
||||||
// index every second long in between.
|
// Index large values sparsely in between.
|
||||||
for index0 < index1 {
|
// We do two starting from different offsets for speed.
|
||||||
|
index2 := (index0 + index1 + 1) >> 1
|
||||||
|
for index2 < index1 {
|
||||||
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
||||||
lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1)
|
lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2)
|
||||||
index0 += 2
|
index0 += 2
|
||||||
index1 -= 2
|
index2 += 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,12 +461,14 @@ func encodeBlockBetterSnappyGo(dst, src []byte) (d int) {
|
||||||
index1 -= 1
|
index1 -= 1
|
||||||
cv = load64(src, s)
|
cv = load64(src, s)
|
||||||
|
|
||||||
// index every second long in between.
|
// Index large values sparsely in between.
|
||||||
for index0 < index1 {
|
// We do two starting from different offsets for speed.
|
||||||
|
index2 := (index0 + index1 + 1) >> 1
|
||||||
|
for index2 < index1 {
|
||||||
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
||||||
lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1)
|
lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2)
|
||||||
index0 += 2
|
index0 += 2
|
||||||
index1 -= 2
|
index2 += 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,7 +603,6 @@ searchDict:
|
||||||
if s >= sLimit {
|
if s >= sLimit {
|
||||||
break searchDict
|
break searchDict
|
||||||
}
|
}
|
||||||
cv = load64(src, s)
|
|
||||||
// Index in-between
|
// Index in-between
|
||||||
index0 := base + 1
|
index0 := base + 1
|
||||||
index1 := s - 2
|
index1 := s - 2
|
||||||
|
@ -865,12 +868,14 @@ searchDict:
|
||||||
index1 -= 1
|
index1 -= 1
|
||||||
cv = load64(src, s)
|
cv = load64(src, s)
|
||||||
|
|
||||||
// index every second long in between.
|
// Index large values sparsely in between.
|
||||||
for index0 < index1 {
|
// We do two starting from different offsets for speed.
|
||||||
|
index2 := (index0 + index1 + 1) >> 1
|
||||||
|
for index2 < index1 {
|
||||||
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
||||||
lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1)
|
lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2)
|
||||||
index0 += 2
|
index0 += 2
|
||||||
index1 -= 2
|
index2 += 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -961,7 +966,6 @@ searchDict:
|
||||||
index0 := base + 1
|
index0 := base + 1
|
||||||
index1 := s - 2
|
index1 := s - 2
|
||||||
|
|
||||||
cv = load64(src, s)
|
|
||||||
for index0 < index1 {
|
for index0 < index1 {
|
||||||
cv0 := load64(src, index0)
|
cv0 := load64(src, index0)
|
||||||
cv1 := load64(src, index1)
|
cv1 := load64(src, index1)
|
||||||
|
@ -1079,12 +1083,14 @@ searchDict:
|
||||||
index1 -= 1
|
index1 -= 1
|
||||||
cv = load64(src, s)
|
cv = load64(src, s)
|
||||||
|
|
||||||
// index every second long in between.
|
// Index large values sparsely in between.
|
||||||
for index0 < index1 {
|
// We do two starting from different offsets for speed.
|
||||||
|
index2 := (index0 + index1 + 1) >> 1
|
||||||
|
for index2 < index1 {
|
||||||
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
lTable[hash7(load64(src, index0), lTableBits)] = uint32(index0)
|
||||||
lTable[hash7(load64(src, index1), lTableBits)] = uint32(index1)
|
lTable[hash7(load64(src, index2), lTableBits)] = uint32(index2)
|
||||||
index0 += 2
|
index0 += 2
|
||||||
index1 -= 2
|
index2 += 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -147,6 +147,13 @@ type Reader struct {
|
||||||
ignoreCRC bool
|
ignoreCRC bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetBufferCapacity returns the capacity of the internal buffer.
|
||||||
|
// This might be useful to know when reusing the same reader in combination
|
||||||
|
// with the lazy buffer option.
|
||||||
|
func (r *Reader) GetBufferCapacity() int {
|
||||||
|
return cap(r.buf)
|
||||||
|
}
|
||||||
|
|
||||||
// ensureBufferSize will ensure that the buffer can take at least n bytes.
|
// ensureBufferSize will ensure that the buffer can take at least n bytes.
|
||||||
// If false is returned the buffer exceeds maximum allowed size.
|
// If false is returned the buffer exceeds maximum allowed size.
|
||||||
func (r *Reader) ensureBufferSize(n int) bool {
|
func (r *Reader) ensureBufferSize(n int) bool {
|
||||||
|
|
|
@ -771,7 +771,7 @@ func (w *Writer) closeIndex(idx bool) ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var index []byte
|
var index []byte
|
||||||
if w.err(nil) == nil && w.writer != nil {
|
if w.err(err) == nil && w.writer != nil {
|
||||||
// Create index.
|
// Create index.
|
||||||
if idx {
|
if idx {
|
||||||
compSize := int64(-1)
|
compSize := int64(-1)
|
||||||
|
|
|
@ -435,6 +435,7 @@ Exit Code 1
|
||||||
| SYSCALL | System-Call Extension (SCE): SYSCALL and SYSRET instructions. |
|
| SYSCALL | System-Call Extension (SCE): SYSCALL and SYSRET instructions. |
|
||||||
| SYSEE | SYSENTER and SYSEXIT instructions |
|
| SYSEE | SYSENTER and SYSEXIT instructions |
|
||||||
| TBM | AMD Trailing Bit Manipulation |
|
| TBM | AMD Trailing Bit Manipulation |
|
||||||
|
| TDX_GUEST | Intel Trust Domain Extensions Guest |
|
||||||
| TLB_FLUSH_NESTED | AMD: Flushing includes all the nested translations for guest translations |
|
| TLB_FLUSH_NESTED | AMD: Flushing includes all the nested translations for guest translations |
|
||||||
| TME | Intel Total Memory Encryption. The following MSRs are supported: IA32_TME_CAPABILITY, IA32_TME_ACTIVATE, IA32_TME_EXCLUDE_MASK, and IA32_TME_EXCLUDE_BASE. |
|
| TME | Intel Total Memory Encryption. The following MSRs are supported: IA32_TME_CAPABILITY, IA32_TME_ACTIVATE, IA32_TME_EXCLUDE_MASK, and IA32_TME_EXCLUDE_BASE. |
|
||||||
| TOPEXT | TopologyExtensions: topology extensions support. Indicates support for CPUID Fn8000_001D_EAX_x[N:0]-CPUID Fn8000_001E_EDX. |
|
| TOPEXT | TopologyExtensions: topology extensions support. Indicates support for CPUID Fn8000_001D_EAX_x[N:0]-CPUID Fn8000_001E_EDX. |
|
||||||
|
|
|
@ -226,6 +226,7 @@ const (
|
||||||
SYSCALL // System-Call Extension (SCE): SYSCALL and SYSRET instructions.
|
SYSCALL // System-Call Extension (SCE): SYSCALL and SYSRET instructions.
|
||||||
SYSEE // SYSENTER and SYSEXIT instructions
|
SYSEE // SYSENTER and SYSEXIT instructions
|
||||||
TBM // AMD Trailing Bit Manipulation
|
TBM // AMD Trailing Bit Manipulation
|
||||||
|
TDX_GUEST // Intel Trust Domain Extensions Guest
|
||||||
TLB_FLUSH_NESTED // AMD: Flushing includes all the nested translations for guest translations
|
TLB_FLUSH_NESTED // AMD: Flushing includes all the nested translations for guest translations
|
||||||
TME // Intel Total Memory Encryption. The following MSRs are supported: IA32_TME_CAPABILITY, IA32_TME_ACTIVATE, IA32_TME_EXCLUDE_MASK, and IA32_TME_EXCLUDE_BASE.
|
TME // Intel Total Memory Encryption. The following MSRs are supported: IA32_TME_CAPABILITY, IA32_TME_ACTIVATE, IA32_TME_EXCLUDE_MASK, and IA32_TME_EXCLUDE_BASE.
|
||||||
TOPEXT // TopologyExtensions: topology extensions support. Indicates support for CPUID Fn8000_001D_EAX_x[N:0]-CPUID Fn8000_001E_EDX.
|
TOPEXT // TopologyExtensions: topology extensions support. Indicates support for CPUID Fn8000_001D_EAX_x[N:0]-CPUID Fn8000_001E_EDX.
|
||||||
|
@ -1186,13 +1187,8 @@ func support() flagSet {
|
||||||
fs.setIf(edx&(1<<30) != 0, IA32_CORE_CAP)
|
fs.setIf(edx&(1<<30) != 0, IA32_CORE_CAP)
|
||||||
fs.setIf(edx&(1<<31) != 0, SPEC_CTRL_SSBD)
|
fs.setIf(edx&(1<<31) != 0, SPEC_CTRL_SSBD)
|
||||||
|
|
||||||
// CPUID.(EAX=7, ECX=1).EDX
|
|
||||||
fs.setIf(edx&(1<<4) != 0, AVXVNNIINT8)
|
|
||||||
fs.setIf(edx&(1<<5) != 0, AVXNECONVERT)
|
|
||||||
fs.setIf(edx&(1<<14) != 0, PREFETCHI)
|
|
||||||
|
|
||||||
// CPUID.(EAX=7, ECX=1).EAX
|
// CPUID.(EAX=7, ECX=1).EAX
|
||||||
eax1, _, _, _ := cpuidex(7, 1)
|
eax1, _, _, edx1 := cpuidex(7, 1)
|
||||||
fs.setIf(fs.inSet(AVX) && eax1&(1<<4) != 0, AVXVNNI)
|
fs.setIf(fs.inSet(AVX) && eax1&(1<<4) != 0, AVXVNNI)
|
||||||
fs.setIf(eax1&(1<<7) != 0, CMPCCXADD)
|
fs.setIf(eax1&(1<<7) != 0, CMPCCXADD)
|
||||||
fs.setIf(eax1&(1<<10) != 0, MOVSB_ZL)
|
fs.setIf(eax1&(1<<10) != 0, MOVSB_ZL)
|
||||||
|
@ -1202,6 +1198,11 @@ func support() flagSet {
|
||||||
fs.setIf(eax1&(1<<23) != 0, AVXIFMA)
|
fs.setIf(eax1&(1<<23) != 0, AVXIFMA)
|
||||||
fs.setIf(eax1&(1<<26) != 0, LAM)
|
fs.setIf(eax1&(1<<26) != 0, LAM)
|
||||||
|
|
||||||
|
// CPUID.(EAX=7, ECX=1).EDX
|
||||||
|
fs.setIf(edx1&(1<<4) != 0, AVXVNNIINT8)
|
||||||
|
fs.setIf(edx1&(1<<5) != 0, AVXNECONVERT)
|
||||||
|
fs.setIf(edx1&(1<<14) != 0, PREFETCHI)
|
||||||
|
|
||||||
// Only detect AVX-512 features if XGETBV is supported
|
// Only detect AVX-512 features if XGETBV is supported
|
||||||
if c&((1<<26)|(1<<27)) == (1<<26)|(1<<27) {
|
if c&((1<<26)|(1<<27)) == (1<<26)|(1<<27) {
|
||||||
// Check for OS support
|
// Check for OS support
|
||||||
|
@ -1393,6 +1394,13 @@ func support() flagSet {
|
||||||
fs.setIf((a>>24)&1 == 1, VMSA_REGPROT)
|
fs.setIf((a>>24)&1 == 1, VMSA_REGPROT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if mfi >= 0x21 {
|
||||||
|
// Intel Trusted Domain Extensions Guests have their own cpuid leaf (0x21).
|
||||||
|
_, ebx, ecx, edx := cpuid(0x21)
|
||||||
|
identity := string(valAsString(ebx, edx, ecx))
|
||||||
|
fs.setIf(identity == "IntelTDX ", TDX_GUEST)
|
||||||
|
}
|
||||||
|
|
||||||
return fs
|
return fs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,59 +166,60 @@ func _() {
|
||||||
_ = x[SYSCALL-156]
|
_ = x[SYSCALL-156]
|
||||||
_ = x[SYSEE-157]
|
_ = x[SYSEE-157]
|
||||||
_ = x[TBM-158]
|
_ = x[TBM-158]
|
||||||
_ = x[TLB_FLUSH_NESTED-159]
|
_ = x[TDX_GUEST-159]
|
||||||
_ = x[TME-160]
|
_ = x[TLB_FLUSH_NESTED-160]
|
||||||
_ = x[TOPEXT-161]
|
_ = x[TME-161]
|
||||||
_ = x[TSCRATEMSR-162]
|
_ = x[TOPEXT-162]
|
||||||
_ = x[TSXLDTRK-163]
|
_ = x[TSCRATEMSR-163]
|
||||||
_ = x[VAES-164]
|
_ = x[TSXLDTRK-164]
|
||||||
_ = x[VMCBCLEAN-165]
|
_ = x[VAES-165]
|
||||||
_ = x[VMPL-166]
|
_ = x[VMCBCLEAN-166]
|
||||||
_ = x[VMSA_REGPROT-167]
|
_ = x[VMPL-167]
|
||||||
_ = x[VMX-168]
|
_ = x[VMSA_REGPROT-168]
|
||||||
_ = x[VPCLMULQDQ-169]
|
_ = x[VMX-169]
|
||||||
_ = x[VTE-170]
|
_ = x[VPCLMULQDQ-170]
|
||||||
_ = x[WAITPKG-171]
|
_ = x[VTE-171]
|
||||||
_ = x[WBNOINVD-172]
|
_ = x[WAITPKG-172]
|
||||||
_ = x[WRMSRNS-173]
|
_ = x[WBNOINVD-173]
|
||||||
_ = x[X87-174]
|
_ = x[WRMSRNS-174]
|
||||||
_ = x[XGETBV1-175]
|
_ = x[X87-175]
|
||||||
_ = x[XOP-176]
|
_ = x[XGETBV1-176]
|
||||||
_ = x[XSAVE-177]
|
_ = x[XOP-177]
|
||||||
_ = x[XSAVEC-178]
|
_ = x[XSAVE-178]
|
||||||
_ = x[XSAVEOPT-179]
|
_ = x[XSAVEC-179]
|
||||||
_ = x[XSAVES-180]
|
_ = x[XSAVEOPT-180]
|
||||||
_ = x[AESARM-181]
|
_ = x[XSAVES-181]
|
||||||
_ = x[ARMCPUID-182]
|
_ = x[AESARM-182]
|
||||||
_ = x[ASIMD-183]
|
_ = x[ARMCPUID-183]
|
||||||
_ = x[ASIMDDP-184]
|
_ = x[ASIMD-184]
|
||||||
_ = x[ASIMDHP-185]
|
_ = x[ASIMDDP-185]
|
||||||
_ = x[ASIMDRDM-186]
|
_ = x[ASIMDHP-186]
|
||||||
_ = x[ATOMICS-187]
|
_ = x[ASIMDRDM-187]
|
||||||
_ = x[CRC32-188]
|
_ = x[ATOMICS-188]
|
||||||
_ = x[DCPOP-189]
|
_ = x[CRC32-189]
|
||||||
_ = x[EVTSTRM-190]
|
_ = x[DCPOP-190]
|
||||||
_ = x[FCMA-191]
|
_ = x[EVTSTRM-191]
|
||||||
_ = x[FP-192]
|
_ = x[FCMA-192]
|
||||||
_ = x[FPHP-193]
|
_ = x[FP-193]
|
||||||
_ = x[GPA-194]
|
_ = x[FPHP-194]
|
||||||
_ = x[JSCVT-195]
|
_ = x[GPA-195]
|
||||||
_ = x[LRCPC-196]
|
_ = x[JSCVT-196]
|
||||||
_ = x[PMULL-197]
|
_ = x[LRCPC-197]
|
||||||
_ = x[SHA1-198]
|
_ = x[PMULL-198]
|
||||||
_ = x[SHA2-199]
|
_ = x[SHA1-199]
|
||||||
_ = x[SHA3-200]
|
_ = x[SHA2-200]
|
||||||
_ = x[SHA512-201]
|
_ = x[SHA3-201]
|
||||||
_ = x[SM3-202]
|
_ = x[SHA512-202]
|
||||||
_ = x[SM4-203]
|
_ = x[SM3-203]
|
||||||
_ = x[SVE-204]
|
_ = x[SM4-204]
|
||||||
_ = x[lastID-205]
|
_ = x[SVE-205]
|
||||||
|
_ = x[lastID-206]
|
||||||
_ = x[firstID-0]
|
_ = x[firstID-0]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXFP16AMXINT8AMXTILEAVXAVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXIFMAAVXNECONVERTAVXSLOWAVXVNNIAVXVNNIINT8BHI_CTRLBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPCCXADDCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4IDPRED_CTRLINT_WBINVDINVLPGBLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSRLISTMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPREFETCHIPSFDRDPRURDRANDRDSEEDRDTSCPRRSBA_CTRLRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDWRMSRNSX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID"
|
const _FeatureID_name = "firstIDADXAESNIAMD3DNOWAMD3DNOWEXTAMXBF16AMXFP16AMXINT8AMXTILEAVXAVX2AVX512BF16AVX512BITALGAVX512BWAVX512CDAVX512DQAVX512ERAVX512FAVX512FP16AVX512IFMAAVX512PFAVX512VBMIAVX512VBMI2AVX512VLAVX512VNNIAVX512VP2INTERSECTAVX512VPOPCNTDQAVXIFMAAVXNECONVERTAVXSLOWAVXVNNIAVXVNNIINT8BHI_CTRLBMI1BMI2CETIBTCETSSCLDEMOTECLMULCLZEROCMOVCMPCCXADDCMPSB_SCADBS_SHORTCMPXCHG8CPBOOSTCPPCCX16EFER_LMSLE_UNSENQCMDERMSF16CFLUSH_L1DFMA3FMA4FP128FP256FSRMFXSRFXSROPTGFNIHLEHRESETHTTHWAHYBRID_CPUHYPERVISORIA32_ARCH_CAPIA32_CORE_CAPIBPBIBRSIBRS_PREFERREDIBRS_PROVIDES_SMPIBSIBSBRNTRGTIBSFETCHSAMIBSFFVIBSOPCNTIBSOPCNTEXTIBSOPSAMIBSRDWROPCNTIBSRIPINVALIDCHKIBS_FETCH_CTLXIBS_OPDATA4IBS_OPFUSEIBS_PREVENTHOSTIBS_ZEN4IDPRED_CTRLINT_WBINVDINVLPGBLAHFLAMLBRVIRTLZCNTMCAOVERFLOWMCDT_NOMCOMMITMD_CLEARMMXMMXEXTMOVBEMOVDIR64BMOVDIRIMOVSB_ZLMOVUMPXMSRIRCMSRLISTMSR_PAGEFLUSHNRIPSNXOSXSAVEPCONFIGPOPCNTPPINPREFETCHIPSFDRDPRURDRANDRDSEEDRDTSCPRRSBA_CTRLRTMRTM_ALWAYS_ABORTSERIALIZESEVSEV_64BITSEV_ALTERNATIVESEV_DEBUGSWAPSEV_ESSEV_RESTRICTEDSEV_SNPSGXSGXLCSHASMESME_COHERENTSPEC_CTRL_SSBDSRBDS_CTRLSSESSE2SSE3SSE4SSE42SSE4ASSSE3STIBPSTIBP_ALWAYSONSTOSB_SHORTSUCCORSVMSVMDASVMFBASIDSVMLSVMNPSVMPFSVMPFTSYSCALLSYSEETBMTDX_GUESTTLB_FLUSH_NESTEDTMETOPEXTTSCRATEMSRTSXLDTRKVAESVMCBCLEANVMPLVMSA_REGPROTVMXVPCLMULQDQVTEWAITPKGWBNOINVDWRMSRNSX87XGETBV1XOPXSAVEXSAVECXSAVEOPTXSAVESAESARMARMCPUIDASIMDASIMDDPASIMDHPASIMDRDMATOMICSCRC32DCPOPEVTSTRMFCMAFPFPHPGPAJSCVTLRCPCPMULLSHA1SHA2SHA3SHA512SM3SM4SVElastID"
|
||||||
|
|
||||||
var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 62, 65, 69, 79, 91, 99, 107, 115, 123, 130, 140, 150, 158, 168, 179, 187, 197, 215, 230, 237, 249, 256, 263, 274, 282, 286, 290, 296, 301, 309, 314, 320, 324, 333, 351, 359, 366, 370, 374, 388, 394, 398, 402, 411, 415, 419, 424, 429, 433, 437, 444, 448, 451, 457, 460, 463, 473, 483, 496, 509, 513, 517, 531, 548, 551, 561, 572, 578, 586, 597, 605, 617, 633, 647, 658, 668, 683, 691, 702, 712, 719, 723, 726, 733, 738, 749, 756, 763, 771, 774, 780, 785, 794, 801, 809, 813, 816, 822, 829, 842, 847, 849, 856, 863, 869, 873, 882, 886, 891, 897, 903, 909, 919, 922, 938, 947, 950, 959, 974, 987, 993, 1007, 1014, 1017, 1022, 1025, 1028, 1040, 1054, 1064, 1067, 1071, 1075, 1079, 1084, 1089, 1094, 1099, 1113, 1124, 1130, 1133, 1138, 1147, 1151, 1156, 1161, 1167, 1174, 1179, 1182, 1198, 1201, 1207, 1217, 1225, 1229, 1238, 1242, 1254, 1257, 1267, 1270, 1277, 1285, 1292, 1295, 1302, 1305, 1310, 1316, 1324, 1330, 1336, 1344, 1349, 1356, 1363, 1371, 1378, 1383, 1388, 1395, 1399, 1401, 1405, 1408, 1413, 1418, 1423, 1427, 1431, 1435, 1441, 1444, 1447, 1450, 1456}
|
var _FeatureID_index = [...]uint16{0, 7, 10, 15, 23, 34, 41, 48, 55, 62, 65, 69, 79, 91, 99, 107, 115, 123, 130, 140, 150, 158, 168, 179, 187, 197, 215, 230, 237, 249, 256, 263, 274, 282, 286, 290, 296, 301, 309, 314, 320, 324, 333, 351, 359, 366, 370, 374, 388, 394, 398, 402, 411, 415, 419, 424, 429, 433, 437, 444, 448, 451, 457, 460, 463, 473, 483, 496, 509, 513, 517, 531, 548, 551, 561, 572, 578, 586, 597, 605, 617, 633, 647, 658, 668, 683, 691, 702, 712, 719, 723, 726, 733, 738, 749, 756, 763, 771, 774, 780, 785, 794, 801, 809, 813, 816, 822, 829, 842, 847, 849, 856, 863, 869, 873, 882, 886, 891, 897, 903, 909, 919, 922, 938, 947, 950, 959, 974, 987, 993, 1007, 1014, 1017, 1022, 1025, 1028, 1040, 1054, 1064, 1067, 1071, 1075, 1079, 1084, 1089, 1094, 1099, 1113, 1124, 1130, 1133, 1138, 1147, 1151, 1156, 1161, 1167, 1174, 1179, 1182, 1191, 1207, 1210, 1216, 1226, 1234, 1238, 1247, 1251, 1263, 1266, 1276, 1279, 1286, 1294, 1301, 1304, 1311, 1314, 1319, 1325, 1333, 1339, 1345, 1353, 1358, 1365, 1372, 1380, 1387, 1392, 1397, 1404, 1408, 1410, 1414, 1417, 1422, 1427, 1432, 1436, 1440, 1444, 1450, 1453, 1456, 1459, 1465}
|
||||||
|
|
||||||
func (i FeatureID) String() string {
|
func (i FeatureID) String() string {
|
||||||
if i < 0 || i >= FeatureID(len(_FeatureID_index)-1) {
|
if i < 0 || i >= FeatureID(len(_FeatureID_index)-1) {
|
||||||
|
|
|
@ -1,260 +0,0 @@
|
||||||
# 适用于与Amazon S3兼容云存储的MinIO Go SDK [![Slack](https://slack.min.io/slack?type=svg)](https://slack.min.io) [![Sourcegraph](https://sourcegraph.com/github.com/minio/minio-go/-/badge.svg)](https://sourcegraph.com/github.com/minio/minio-go?badge)
|
|
||||||
|
|
||||||
MinIO Go Client SDK提供了简单的API来访问任何与Amazon S3兼容的对象存储服务。
|
|
||||||
|
|
||||||
**支持的云存储:**
|
|
||||||
|
|
||||||
- AWS Signature Version 4
|
|
||||||
- Amazon S3
|
|
||||||
- MinIO
|
|
||||||
|
|
||||||
- AWS Signature Version 2
|
|
||||||
- Google Cloud Storage (兼容模式)
|
|
||||||
- Openstack Swift + Swift3 middleware
|
|
||||||
- Ceph Object Gateway
|
|
||||||
- Riak CS
|
|
||||||
|
|
||||||
本文我们将学习如何安装MinIO client SDK,连接到MinIO,并提供一下文件上传的示例。对于完整的API以及示例,请参考[Go Client API Reference](https://min.io/docs/minio/linux/developers/go/API.html)。
|
|
||||||
|
|
||||||
本文假设你已经有 [Go开发环境](https://golang.org/doc/install)。
|
|
||||||
|
|
||||||
## 从Github下载
|
|
||||||
```sh
|
|
||||||
go get -u github.com/minio/minio-go
|
|
||||||
```
|
|
||||||
|
|
||||||
## 初始化MinIO Client
|
|
||||||
MinIO client需要以下4个参数来连接与Amazon S3兼容的对象存储。
|
|
||||||
|
|
||||||
| 参数 | 描述|
|
|
||||||
| :--- | :--- |
|
|
||||||
| endpoint | 对象存储服务的URL |
|
|
||||||
| accessKeyID | Access key是唯一标识你的账户的用户ID。 |
|
|
||||||
| secretAccessKey | Secret key是你账户的密码。 |
|
|
||||||
| secure | true代表使用HTTPS |
|
|
||||||
|
|
||||||
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/minio/minio-go/v7"
|
|
||||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
endpoint := "play.min.io"
|
|
||||||
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
|
|
||||||
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
|
|
||||||
useSSL := true
|
|
||||||
|
|
||||||
// 初使化 minio client对象。
|
|
||||||
minioClient, err := minio.New(endpoint, &minio.Options{
|
|
||||||
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
|
|
||||||
Secure: useSSL,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("%#v\n", minioClient) // minioClient初使化成功
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 示例-文件上传
|
|
||||||
本示例连接到一个对象存储服务,创建一个存储桶并上传一个文件到存储桶中。
|
|
||||||
|
|
||||||
我们在本示例中使用运行在 [https://play.min.io](https://play.min.io) 上的MinIO服务,你可以用这个服务来开发和测试。示例中的访问凭据是公开的。
|
|
||||||
|
|
||||||
### FileUploader.go
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/minio/minio-go/v7"
|
|
||||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
ctx := context.Background()
|
|
||||||
endpoint := "play.min.io"
|
|
||||||
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
|
|
||||||
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
|
|
||||||
useSSL := true
|
|
||||||
|
|
||||||
// 初使化 minio client对象。
|
|
||||||
minioClient, err := minio.New(endpoint, &minio.Options{
|
|
||||||
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
|
|
||||||
Secure: useSSL,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建一个叫mymusic的存储桶。
|
|
||||||
bucketName := "mymusic"
|
|
||||||
location := "us-east-1"
|
|
||||||
|
|
||||||
err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})
|
|
||||||
if err != nil {
|
|
||||||
// 检查存储桶是否已经存在。
|
|
||||||
exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
|
|
||||||
if errBucketExists == nil && exists {
|
|
||||||
log.Printf("We already own %s\n", bucketName)
|
|
||||||
} else {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.Printf("Successfully created %s\n", bucketName)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上传一个zip文件。
|
|
||||||
objectName := "golden-oldies.zip"
|
|
||||||
filePath := "/tmp/golden-oldies.zip"
|
|
||||||
contentType := "application/zip"
|
|
||||||
|
|
||||||
// 使用FPutObject上传一个zip文件。
|
|
||||||
n, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("Successfully uploaded %s of size %d\n", objectName, n)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 运行FileUploader
|
|
||||||
```sh
|
|
||||||
go run file-uploader.go
|
|
||||||
2016/08/13 17:03:28 Successfully created mymusic
|
|
||||||
2016/08/13 17:03:40 Successfully uploaded golden-oldies.zip of size 16253413
|
|
||||||
|
|
||||||
mc ls play/mymusic/
|
|
||||||
[2016-05-27 16:02:16 PDT] 17MiB golden-oldies.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
## API文档
|
|
||||||
完整的API文档在这里。
|
|
||||||
* [完整API文档](https://min.io/docs/minio/linux/developers/go/API.html)
|
|
||||||
|
|
||||||
### API文档 : 操作存储桶
|
|
||||||
* [`MakeBucket`](https://min.io/docs/minio/linux/developers/go/API.html#MakeBucket)
|
|
||||||
* [`ListBuckets`](https://min.io/docs/minio/linux/developers/go/API.html#ListBuckets)
|
|
||||||
* [`BucketExists`](https://min.io/docs/minio/linux/developers/go/API.html#BucketExists)
|
|
||||||
* [`RemoveBucket`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveBucket)
|
|
||||||
* [`ListObjects`](https://min.io/docs/minio/linux/developers/go/API.html#ListObjects)
|
|
||||||
* [`ListIncompleteUploads`](https://min.io/docs/minio/linux/developers/go/API.html#ListIncompleteUploads)
|
|
||||||
|
|
||||||
### API文档 : 存储桶策略
|
|
||||||
* [`SetBucketPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#SetBucketPolicy)
|
|
||||||
* [`GetBucketPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#GetBucketPolicy)
|
|
||||||
|
|
||||||
### API文档 : 存储桶通知
|
|
||||||
* [`SetBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#SetBucketNotification)
|
|
||||||
* [`GetBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#GetBucketNotification)
|
|
||||||
* [`RemoveAllBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveAllBucketNotification)
|
|
||||||
* [`ListenBucketNotification`](https://min.io/docs/minio/linux/developers/go/API.html#ListenBucketNotification) (MinIO 扩展)
|
|
||||||
* [`ListenNotification`](https://min.io/docs/minio/linux/developers/go/API.html#ListenNotification) (MinIO 扩展)
|
|
||||||
|
|
||||||
### API文档 : 操作文件对象
|
|
||||||
* [`FPutObject`](https://min.io/docs/minio/linux/developers/go/API.html#FPutObject)
|
|
||||||
* [`FGetObject`](https://min.io/docs/minio/linux/developers/go/API.html#FPutObject)
|
|
||||||
|
|
||||||
### API文档 : 操作对象
|
|
||||||
* [`GetObject`](https://min.io/docs/minio/linux/developers/go/API.html#GetObject)
|
|
||||||
* [`PutObject`](https://min.io/docs/minio/linux/developers/go/API.html#PutObject)
|
|
||||||
* [`PutObjectStreaming`](https://min.io/docs/minio/linux/developers/go/API.html#PutObjectStreaming)
|
|
||||||
* [`StatObject`](https://min.io/docs/minio/linux/developers/go/API.html#StatObject)
|
|
||||||
* [`CopyObject`](https://min.io/docs/minio/linux/developers/go/API.html#CopyObject)
|
|
||||||
* [`RemoveObject`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveObject)
|
|
||||||
* [`RemoveObjects`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveObjects)
|
|
||||||
* [`RemoveIncompleteUpload`](https://min.io/docs/minio/linux/developers/go/API.html#RemoveIncompleteUpload)
|
|
||||||
* [`SelectObjectContent`](https://min.io/docs/minio/linux/developers/go/API.html#SelectObjectContent)
|
|
||||||
|
|
||||||
### API文档 : Presigned操作
|
|
||||||
* [`PresignedGetObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedGetObject)
|
|
||||||
* [`PresignedPutObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedPutObject)
|
|
||||||
* [`PresignedHeadObject`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedHeadObject)
|
|
||||||
* [`PresignedPostPolicy`](https://min.io/docs/minio/linux/developers/go/API.html#PresignedPostPolicy)
|
|
||||||
|
|
||||||
### API文档 : 客户端自定义设置
|
|
||||||
* [`SetAppInfo`](https://min.io/docs/minio/linux/developers/go/API.html#SetAppInfo)
|
|
||||||
* [`TraceOn`](https://min.io/docs/minio/linux/developers/go/API.html#TraceOn)
|
|
||||||
* [`TraceOff`](https://min.io/docs/minio/linux/developers/go/API.html#TraceOff)
|
|
||||||
|
|
||||||
## 完整示例
|
|
||||||
|
|
||||||
### 完整示例 : 操作存储桶
|
|
||||||
* [makebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/makebucket.go)
|
|
||||||
* [listbuckets.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbuckets.go)
|
|
||||||
* [bucketexists.go](https://github.com/minio/minio-go/blob/master/examples/s3/bucketexists.go)
|
|
||||||
* [removebucket.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucket.go)
|
|
||||||
* [listobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjects.go)
|
|
||||||
* [listobjectsV2.go](https://github.com/minio/minio-go/blob/master/examples/s3/listobjectsV2.go)
|
|
||||||
* [listincompleteuploads.go](https://github.com/minio/minio-go/blob/master/examples/s3/listincompleteuploads.go)
|
|
||||||
|
|
||||||
### 完整示例 : 存储桶策略
|
|
||||||
* [setbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketpolicy.go)
|
|
||||||
* [getbucketpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketpolicy.go)
|
|
||||||
* [listbucketpolicies.go](https://github.com/minio/minio-go/blob/master/examples/s3/listbucketpolicies.go)
|
|
||||||
|
|
||||||
### 完整示例 : 存储桶生命周期
|
|
||||||
* [setbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketlifecycle.go)
|
|
||||||
* [getbucketlifecycle.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketlifecycle.go)
|
|
||||||
|
|
||||||
### 完整示例 : 存储桶加密
|
|
||||||
* [setbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketencryption.go)
|
|
||||||
* [getbucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketencryption.go)
|
|
||||||
* [deletebucketencryption.go](https://github.com/minio/minio-go/blob/master/examples/s3/deletebucketencryption.go)
|
|
||||||
|
|
||||||
### 完整示例 : 存储桶复制
|
|
||||||
* [setbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketreplication.go)
|
|
||||||
* [getbucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketreplication.go)
|
|
||||||
* [removebucketreplication.go](https://github.com/minio/minio-go/blob/master/examples/s3/removebucketreplication.go)
|
|
||||||
|
|
||||||
### 完整示例 : 存储桶通知
|
|
||||||
* [setbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/setbucketnotification.go)
|
|
||||||
* [getbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/getbucketnotification.go)
|
|
||||||
* [removeallbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeallbucketnotification.go)
|
|
||||||
* [listenbucketnotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listenbucketnotification.go) (MinIO扩展)
|
|
||||||
* [listennotification.go](https://github.com/minio/minio-go/blob/master/examples/minio/listen-notification.go) (MinIO 扩展)
|
|
||||||
|
|
||||||
### 完整示例 : 操作文件对象
|
|
||||||
* [fputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject.go)
|
|
||||||
* [fgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject.go)
|
|
||||||
* [fputobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputobject-context.go)
|
|
||||||
* [fgetobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/fgetobject-context.go)
|
|
||||||
|
|
||||||
### 完整示例 : 操作对象
|
|
||||||
* [putobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject.go)
|
|
||||||
* [getobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject.go)
|
|
||||||
* [putobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/putobject-context.go)
|
|
||||||
* [getobject-context.go](https://github.com/minio/minio-go/blob/master/examples/s3/getobject-context.go)
|
|
||||||
* [statobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/statobject.go)
|
|
||||||
* [copyobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/copyobject.go)
|
|
||||||
* [removeobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobject.go)
|
|
||||||
* [removeincompleteupload.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeincompleteupload.go)
|
|
||||||
* [removeobjects.go](https://github.com/minio/minio-go/blob/master/examples/s3/removeobjects.go)
|
|
||||||
|
|
||||||
### 完整示例 : 操作加密对象
|
|
||||||
* [put-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/put-encrypted-object.go)
|
|
||||||
* [get-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/get-encrypted-object.go)
|
|
||||||
* [fput-encrypted-object.go](https://github.com/minio/minio-go/blob/master/examples/s3/fputencrypted-object.go)
|
|
||||||
|
|
||||||
### 完整示例 : Presigned操作
|
|
||||||
* [presignedgetobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedgetobject.go)
|
|
||||||
* [presignedputobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedputobject.go)
|
|
||||||
* [presignedheadobject.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedheadobject.go)
|
|
||||||
* [presignedpostpolicy.go](https://github.com/minio/minio-go/blob/master/examples/s3/presignedpostpolicy.go)
|
|
||||||
|
|
||||||
## 了解更多
|
|
||||||
* [完整文档](https://min.io/docs/minio/kubernetes/upstream/index.html)
|
|
||||||
* [MinIO Go Client SDK API文档](https://min.io/docs/minio/linux/developers/go/API.html)
|
|
||||||
|
|
||||||
## 贡献
|
|
||||||
[贡献指南](https://github.com/minio/minio-go/blob/master/docs/zh_CN/CONTRIBUTING.md)
|
|
|
@ -219,7 +219,7 @@ func (c *Client) ResetBucketReplicationOnTarget(ctx context.Context, bucketName
|
||||||
|
|
||||||
// ResetBucketReplication kicks off replication of previously replicated objects if ExistingObjectReplication
|
// ResetBucketReplication kicks off replication of previously replicated objects if ExistingObjectReplication
|
||||||
// is enabled in the replication config
|
// is enabled in the replication config
|
||||||
func (c *Client) resetBucketReplicationOnTarget(ctx context.Context, bucketName string, olderThan time.Duration, tgtArn string, resetID string) (rinfo replication.ResyncTargetsInfo, err error) {
|
func (c *Client) resetBucketReplicationOnTarget(ctx context.Context, bucketName string, olderThan time.Duration, tgtArn, resetID string) (rinfo replication.ResyncTargetsInfo, err error) {
|
||||||
// Input validation.
|
// Input validation.
|
||||||
if err = s3utils.CheckValidBucketName(bucketName); err != nil {
|
if err = s3utils.CheckValidBucketName(bucketName); err != nil {
|
||||||
return
|
return
|
||||||
|
|
|
@ -286,8 +286,8 @@ func (c *Client) copyObjectDo(ctx context.Context, srcBucket, srcObject, destBuc
|
||||||
return objInfo, nil
|
return objInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) copyObjectPartDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, uploadID string,
|
func (c *Client) copyObjectPartDo(ctx context.Context, srcBucket, srcObject, destBucket, destObject, uploadID string,
|
||||||
partID int, startOffset int64, length int64, metadata map[string]string,
|
partID int, startOffset, length int64, metadata map[string]string,
|
||||||
) (p CompletePart, err error) {
|
) (p CompletePart, err error) {
|
||||||
headers := make(http.Header)
|
headers := make(http.Header)
|
||||||
|
|
||||||
|
|
|
@ -176,7 +176,7 @@ func (c *Client) listObjectsV2(ctx context.Context, bucketName string, opts List
|
||||||
// ?delimiter - A delimiter is a character you use to group keys.
|
// ?delimiter - A delimiter is a character you use to group keys.
|
||||||
// ?start-after - Sets a marker to start listing lexically at this key onwards.
|
// ?start-after - Sets a marker to start listing lexically at this key onwards.
|
||||||
// ?max-keys - Sets the maximum number of keys returned in the response body.
|
// ?max-keys - Sets the maximum number of keys returned in the response body.
|
||||||
func (c *Client) listObjectsV2Query(ctx context.Context, bucketName, objectPrefix, continuationToken string, fetchOwner, metadata bool, delimiter string, startAfter string, maxkeys int, headers http.Header) (ListBucketV2Result, error) {
|
func (c *Client) listObjectsV2Query(ctx context.Context, bucketName, objectPrefix, continuationToken string, fetchOwner, metadata bool, delimiter, startAfter string, maxkeys int, headers http.Header) (ListBucketV2Result, error) {
|
||||||
// Validate bucket name.
|
// Validate bucket name.
|
||||||
if err := s3utils.CheckValidBucketName(bucketName); err != nil {
|
if err := s3utils.CheckValidBucketName(bucketName); err != nil {
|
||||||
return ListBucketV2Result{}, err
|
return ListBucketV2Result{}, err
|
||||||
|
|
|
@ -30,7 +30,7 @@ import (
|
||||||
|
|
||||||
// presignURL - Returns a presigned URL for an input 'method'.
|
// presignURL - Returns a presigned URL for an input 'method'.
|
||||||
// Expires maximum is 7days - ie. 604800 and minimum is 1.
|
// Expires maximum is 7days - ie. 604800 and minimum is 1.
|
||||||
func (c *Client) presignURL(ctx context.Context, method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values, extraHeaders http.Header) (u *url.URL, err error) {
|
func (c *Client) presignURL(ctx context.Context, method, bucketName, objectName string, expires time.Duration, reqParams url.Values, extraHeaders http.Header) (u *url.URL, err error) {
|
||||||
// Input validation.
|
// Input validation.
|
||||||
if method == "" {
|
if method == "" {
|
||||||
return nil, errInvalidArgument("method cannot be empty.")
|
return nil, errInvalidArgument("method cannot be empty.")
|
||||||
|
@ -66,7 +66,7 @@ func (c *Client) presignURL(ctx context.Context, method string, bucketName strin
|
||||||
// data without credentials. URL can have a maximum expiry of
|
// data without credentials. URL can have a maximum expiry of
|
||||||
// upto 7days or a minimum of 1sec. Additionally you can override
|
// upto 7days or a minimum of 1sec. Additionally you can override
|
||||||
// a set of response headers using the query parameters.
|
// a set of response headers using the query parameters.
|
||||||
func (c *Client) PresignedGetObject(ctx context.Context, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
func (c *Client) PresignedGetObject(ctx context.Context, bucketName, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
||||||
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@ func (c *Client) PresignedGetObject(ctx context.Context, bucketName string, obje
|
||||||
// object metadata without credentials. URL can have a maximum expiry
|
// object metadata without credentials. URL can have a maximum expiry
|
||||||
// of upto 7days or a minimum of 1sec. Additionally you can override
|
// of upto 7days or a minimum of 1sec. Additionally you can override
|
||||||
// a set of response headers using the query parameters.
|
// a set of response headers using the query parameters.
|
||||||
func (c *Client) PresignedHeadObject(ctx context.Context, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
func (c *Client) PresignedHeadObject(ctx context.Context, bucketName, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
||||||
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ func (c *Client) PresignedHeadObject(ctx context.Context, bucketName string, obj
|
||||||
// PresignedPutObject - Returns a presigned URL to upload an object
|
// PresignedPutObject - Returns a presigned URL to upload an object
|
||||||
// without credentials. URL can have a maximum expiry of upto 7days
|
// without credentials. URL can have a maximum expiry of upto 7days
|
||||||
// or a minimum of 1sec.
|
// or a minimum of 1sec.
|
||||||
func (c *Client) PresignedPutObject(ctx context.Context, bucketName string, objectName string, expires time.Duration) (u *url.URL, err error) {
|
func (c *Client) PresignedPutObject(ctx context.Context, bucketName, objectName string, expires time.Duration) (u *url.URL, err error) {
|
||||||
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
if err = s3utils.CheckValidObjectName(objectName); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -101,14 +101,14 @@ func (c *Client) PresignedPutObject(ctx context.Context, bucketName string, obje
|
||||||
//
|
//
|
||||||
// FIXME: The extra header parameter should be included in Presign() in the next
|
// FIXME: The extra header parameter should be included in Presign() in the next
|
||||||
// major version bump, and this function should then be deprecated.
|
// major version bump, and this function should then be deprecated.
|
||||||
func (c *Client) PresignHeader(ctx context.Context, method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values, extraHeaders http.Header) (u *url.URL, err error) {
|
func (c *Client) PresignHeader(ctx context.Context, method, bucketName, objectName string, expires time.Duration, reqParams url.Values, extraHeaders http.Header) (u *url.URL, err error) {
|
||||||
return c.presignURL(ctx, method, bucketName, objectName, expires, reqParams, extraHeaders)
|
return c.presignURL(ctx, method, bucketName, objectName, expires, reqParams, extraHeaders)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Presign - returns a presigned URL for any http method of your choice along
|
// Presign - returns a presigned URL for any http method of your choice along
|
||||||
// with custom request params and extra signed headers. URL can have a maximum
|
// with custom request params and extra signed headers. URL can have a maximum
|
||||||
// expiry of upto 7days or a minimum of 1sec.
|
// expiry of upto 7days or a minimum of 1sec.
|
||||||
func (c *Client) Presign(ctx context.Context, method string, bucketName string, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
func (c *Client) Presign(ctx context.Context, method, bucketName, objectName string, expires time.Duration, reqParams url.Values) (u *url.URL, err error) {
|
||||||
return c.presignURL(ctx, method, bucketName, objectName, expires, reqParams, nil)
|
return c.presignURL(ctx, method, bucketName, objectName, expires, reqParams, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ func (c *Client) makeBucket(ctx context.Context, bucketName string, opts MakeBuc
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) doMakeBucket(ctx context.Context, bucketName string, location string, objectLockEnabled bool) (err error) {
|
func (c *Client) doMakeBucket(ctx context.Context, bucketName, location string, objectLockEnabled bool) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
// Save the location into cache on a successful makeBucket response.
|
// Save the location into cache on a successful makeBucket response.
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
|
|
@ -68,7 +68,7 @@ func isReadAt(reader io.Reader) (ok bool) {
|
||||||
// maxPartsCount - 10000
|
// maxPartsCount - 10000
|
||||||
// minPartSize - 16MiB
|
// minPartSize - 16MiB
|
||||||
// maxMultipartPutObjectSize - 5TiB
|
// maxMultipartPutObjectSize - 5TiB
|
||||||
func OptimalPartInfo(objectSize int64, configuredPartSize uint64) (totalPartsCount int, partSize int64, lastPartSize int64, err error) {
|
func OptimalPartInfo(objectSize int64, configuredPartSize uint64) (totalPartsCount int, partSize, lastPartSize int64, err error) {
|
||||||
// object size is '-1' set it to 5TiB.
|
// object size is '-1' set it to 5TiB.
|
||||||
var unknownSize bool
|
var unknownSize bool
|
||||||
if objectSize == -1 {
|
if objectSize == -1 {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* MinIO Go Library for Amazon S3 Compatible Cloud Storage
|
* MinIO Go Library for Amazon S3 Compatible Cloud Storage
|
||||||
* Copyright 2015-2018 MinIO, Inc.
|
* Copyright 2015-2023 MinIO, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -29,6 +29,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/cookiejar"
|
"net/http/cookiejar"
|
||||||
|
"net/http/httptrace"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
@ -69,6 +70,7 @@ type Client struct {
|
||||||
|
|
||||||
// Needs allocation.
|
// Needs allocation.
|
||||||
httpClient *http.Client
|
httpClient *http.Client
|
||||||
|
httpTrace *httptrace.ClientTrace
|
||||||
bucketLocCache *bucketLocationCache
|
bucketLocCache *bucketLocationCache
|
||||||
|
|
||||||
// Advanced functionality.
|
// Advanced functionality.
|
||||||
|
@ -103,6 +105,7 @@ type Options struct {
|
||||||
Creds *credentials.Credentials
|
Creds *credentials.Credentials
|
||||||
Secure bool
|
Secure bool
|
||||||
Transport http.RoundTripper
|
Transport http.RoundTripper
|
||||||
|
Trace *httptrace.ClientTrace
|
||||||
Region string
|
Region string
|
||||||
BucketLookup BucketLookupType
|
BucketLookup BucketLookupType
|
||||||
|
|
||||||
|
@ -124,7 +127,7 @@ type Options struct {
|
||||||
// Global constants.
|
// Global constants.
|
||||||
const (
|
const (
|
||||||
libraryName = "minio-go"
|
libraryName = "minio-go"
|
||||||
libraryVersion = "v7.0.60"
|
libraryVersion = "v7.0.61"
|
||||||
)
|
)
|
||||||
|
|
||||||
// User Agent should always following the below style.
|
// User Agent should always following the below style.
|
||||||
|
@ -229,6 +232,8 @@ func privateNew(endpoint string, opts *Options) (*Client, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clnt.httpTrace = opts.Trace
|
||||||
|
|
||||||
// Instantiate http client and bucket location cache.
|
// Instantiate http client and bucket location cache.
|
||||||
clnt.httpClient = &http.Client{
|
clnt.httpClient = &http.Client{
|
||||||
Jar: jar,
|
Jar: jar,
|
||||||
|
@ -278,7 +283,7 @@ func privateNew(endpoint string, opts *Options) (*Client, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAppInfo - add application details to user agent.
|
// SetAppInfo - add application details to user agent.
|
||||||
func (c *Client) SetAppInfo(appName string, appVersion string) {
|
func (c *Client) SetAppInfo(appName, appVersion string) {
|
||||||
// if app name and version not set, we do not set a new user agent.
|
// if app name and version not set, we do not set a new user agent.
|
||||||
if appName != "" && appVersion != "" {
|
if appName != "" && appVersion != "" {
|
||||||
c.appInfo.appName = appName
|
c.appInfo.appName = appName
|
||||||
|
@ -771,6 +776,10 @@ func (c *Client) newRequest(ctx context.Context, method string, metadata request
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.httpTrace != nil {
|
||||||
|
ctx = httptrace.WithClientTrace(ctx, c.httpTrace)
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize a new HTTP request for the method.
|
// Initialize a new HTTP request for the method.
|
||||||
req, err = http.NewRequestWithContext(ctx, method, targetURL.String(), nil)
|
req, err = http.NewRequestWithContext(ctx, method, targetURL.String(), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -58,7 +58,7 @@ func (r *bucketLocationCache) Get(bucketName string) (location string, ok bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set - Will persist a value into cache.
|
// Set - Will persist a value into cache.
|
||||||
func (r *bucketLocationCache) Set(bucketName string, location string) {
|
func (r *bucketLocationCache) Set(bucketName, location string) {
|
||||||
r.Lock()
|
r.Lock()
|
||||||
defer r.Unlock()
|
defer r.Unlock()
|
||||||
r.items[bucketName] = location
|
r.items[bucketName] = location
|
||||||
|
|
|
@ -62,7 +62,7 @@ func (c Core) CopyObject(ctx context.Context, sourceBucket, sourceObject, destBu
|
||||||
|
|
||||||
// CopyObjectPart - creates a part in a multipart upload by copying (a
|
// CopyObjectPart - creates a part in a multipart upload by copying (a
|
||||||
// part of) an existing object.
|
// part of) an existing object.
|
||||||
func (c Core) CopyObjectPart(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, uploadID string,
|
func (c Core) CopyObjectPart(ctx context.Context, srcBucket, srcObject, destBucket, destObject, uploadID string,
|
||||||
partID int, startOffset, length int64, metadata map[string]string,
|
partID int, startOffset, length int64, metadata map[string]string,
|
||||||
) (p CompletePart, err error) {
|
) (p CompletePart, err error) {
|
||||||
return c.copyObjectPartDo(ctx, srcBucket, srcObject, destBucket, destObject, uploadID,
|
return c.copyObjectPartDo(ctx, srcBucket, srcObject, destBucket, destObject, uploadID,
|
||||||
|
@ -115,7 +115,7 @@ func (c Core) PutObjectPart(ctx context.Context, bucket, object, uploadID string
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListObjectParts - List uploaded parts of an incomplete upload.x
|
// ListObjectParts - List uploaded parts of an incomplete upload.x
|
||||||
func (c Core) ListObjectParts(ctx context.Context, bucket, object, uploadID string, partNumberMarker int, maxParts int) (result ListObjectPartsResult, err error) {
|
func (c Core) ListObjectParts(ctx context.Context, bucket, object, uploadID string, partNumberMarker, maxParts int) (result ListObjectPartsResult, err error) {
|
||||||
return c.listObjectPartsQuery(ctx, bucket, object, uploadID, partNumberMarker, maxParts)
|
return c.listObjectPartsQuery(ctx, bucket, object, uploadID, partNumberMarker, maxParts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -141,7 +141,7 @@ func cleanEmptyEntries(fields log.Fields) log.Fields {
|
||||||
}
|
}
|
||||||
|
|
||||||
// log successful test runs
|
// log successful test runs
|
||||||
func successLogger(testName string, function string, args map[string]interface{}, startTime time.Time) *log.Entry {
|
func successLogger(testName, function string, args map[string]interface{}, startTime time.Time) *log.Entry {
|
||||||
// calculate the test case duration
|
// calculate the test case duration
|
||||||
duration := time.Since(startTime)
|
duration := time.Since(startTime)
|
||||||
// log with the fields as per mint
|
// log with the fields as per mint
|
||||||
|
@ -151,7 +151,7 @@ func successLogger(testName string, function string, args map[string]interface{}
|
||||||
|
|
||||||
// As few of the features are not available in Gateway(s) currently, Check if err value is NotImplemented,
|
// As few of the features are not available in Gateway(s) currently, Check if err value is NotImplemented,
|
||||||
// and log as NA in that case and continue execution. Otherwise log as failure and return
|
// and log as NA in that case and continue execution. Otherwise log as failure and return
|
||||||
func logError(testName string, function string, args map[string]interface{}, startTime time.Time, alert string, message string, err error) {
|
func logError(testName, function string, args map[string]interface{}, startTime time.Time, alert, message string, err error) {
|
||||||
// If server returns NotImplemented we assume it is gateway mode and hence log it as info and move on to next tests
|
// If server returns NotImplemented we assume it is gateway mode and hence log it as info and move on to next tests
|
||||||
// Special case for ComposeObject API as it is implemented on client side and adds specific error details like `Error in upload-part-copy` in
|
// Special case for ComposeObject API as it is implemented on client side and adds specific error details like `Error in upload-part-copy` in
|
||||||
// addition to NotImplemented error returned from server
|
// addition to NotImplemented error returned from server
|
||||||
|
@ -165,7 +165,7 @@ func logError(testName string, function string, args map[string]interface{}, sta
|
||||||
}
|
}
|
||||||
|
|
||||||
// log failed test runs
|
// log failed test runs
|
||||||
func failureLog(testName string, function string, args map[string]interface{}, startTime time.Time, alert string, message string, err error) *log.Entry {
|
func failureLog(testName, function string, args map[string]interface{}, startTime time.Time, alert, message string, err error) *log.Entry {
|
||||||
// calculate the test case duration
|
// calculate the test case duration
|
||||||
duration := time.Since(startTime)
|
duration := time.Since(startTime)
|
||||||
var fields log.Fields
|
var fields log.Fields
|
||||||
|
@ -185,7 +185,7 @@ func failureLog(testName string, function string, args map[string]interface{}, s
|
||||||
}
|
}
|
||||||
|
|
||||||
// log not applicable test runs
|
// log not applicable test runs
|
||||||
func ignoredLog(testName string, function string, args map[string]interface{}, startTime time.Time, alert string) *log.Entry {
|
func ignoredLog(testName, function string, args map[string]interface{}, startTime time.Time, alert string) *log.Entry {
|
||||||
// calculate the test case duration
|
// calculate the test case duration
|
||||||
duration := time.Since(startTime)
|
duration := time.Since(startTime)
|
||||||
// log with the fields as per mint
|
// log with the fields as per mint
|
||||||
|
|
|
@ -64,7 +64,7 @@ type FileAWSCredentials struct {
|
||||||
|
|
||||||
// NewFileAWSCredentials returns a pointer to a new Credentials object
|
// NewFileAWSCredentials returns a pointer to a new Credentials object
|
||||||
// wrapping the Profile file provider.
|
// wrapping the Profile file provider.
|
||||||
func NewFileAWSCredentials(filename string, profile string) *Credentials {
|
func NewFileAWSCredentials(filename, profile string) *Credentials {
|
||||||
return New(&FileAWSCredentials{
|
return New(&FileAWSCredentials{
|
||||||
Filename: filename,
|
Filename: filename,
|
||||||
Profile: profile,
|
Profile: profile,
|
||||||
|
|
|
@ -49,7 +49,7 @@ type FileMinioClient struct {
|
||||||
|
|
||||||
// NewFileMinioClient returns a pointer to a new Credentials object
|
// NewFileMinioClient returns a pointer to a new Credentials object
|
||||||
// wrapping the Alias file provider.
|
// wrapping the Alias file provider.
|
||||||
func NewFileMinioClient(filename string, alias string) *Credentials {
|
func NewFileMinioClient(filename, alias string) *Credentials {
|
||||||
return New(&FileMinioClient{
|
return New(&FileMinioClient{
|
||||||
Filename: filename,
|
Filename: filename,
|
||||||
Alias: alias,
|
Alias: alias,
|
||||||
|
|
|
@ -227,7 +227,7 @@ func listRoleNames(client *http.Client, u *url.URL, token string) ([]string, err
|
||||||
return credsList, nil
|
return credsList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getEcsTaskCredentials(client *http.Client, endpoint string, token string) (ec2RoleCredRespBody, error) {
|
func getEcsTaskCredentials(client *http.Client, endpoint, token string) (ec2RoleCredRespBody, error) {
|
||||||
req, err := http.NewRequest(http.MethodGet, endpoint, nil)
|
req, err := http.NewRequest(http.MethodGet, endpoint, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ec2RoleCredRespBody{}, err
|
return ec2RoleCredRespBody{}, err
|
||||||
|
|
|
@ -35,7 +35,7 @@ func sum256(data []byte) []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
// sumHMAC calculate hmac between two input byte array.
|
// sumHMAC calculate hmac between two input byte array.
|
||||||
func sumHMAC(key []byte, data []byte) []byte {
|
func sumHMAC(key, data []byte) []byte {
|
||||||
hash := hmac.New(sha256.New, key)
|
hash := hmac.New(sha256.New, key)
|
||||||
hash.Write(data)
|
hash.Write(data)
|
||||||
return hash.Sum(nil)
|
return hash.Sum(nil)
|
||||||
|
|
|
@ -241,7 +241,7 @@ func (p *PostPolicy) SetSuccessStatusAction(status string) error {
|
||||||
|
|
||||||
// SetUserMetadata - Set user metadata as a key/value couple.
|
// SetUserMetadata - Set user metadata as a key/value couple.
|
||||||
// Can be retrieved through a HEAD request or an event.
|
// Can be retrieved through a HEAD request or an event.
|
||||||
func (p *PostPolicy) SetUserMetadata(key string, value string) error {
|
func (p *PostPolicy) SetUserMetadata(key, value string) error {
|
||||||
if strings.TrimSpace(key) == "" || key == "" {
|
if strings.TrimSpace(key) == "" || key == "" {
|
||||||
return errInvalidArgument("Key is empty")
|
return errInvalidArgument("Key is empty")
|
||||||
}
|
}
|
||||||
|
@ -283,7 +283,7 @@ func (p *PostPolicy) SetEncryption(sse encrypt.ServerSide) {
|
||||||
|
|
||||||
// SetUserData - Set user data as a key/value couple.
|
// SetUserData - Set user data as a key/value couple.
|
||||||
// Can be retrieved through a HEAD request or an event.
|
// Can be retrieved through a HEAD request or an event.
|
||||||
func (p *PostPolicy) SetUserData(key string, value string) error {
|
func (p *PostPolicy) SetUserData(key, value string) error {
|
||||||
if key == "" {
|
if key == "" {
|
||||||
return errInvalidArgument("Key is empty")
|
return errInvalidArgument("Key is empty")
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ package minio
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
// newRetryTimerContinous creates a timer with exponentially increasing delays forever.
|
// newRetryTimerContinous creates a timer with exponentially increasing delays forever.
|
||||||
func (c *Client) newRetryTimerContinous(unit time.Duration, cap time.Duration, jitter float64, doneCh chan struct{}) <-chan int {
|
func (c *Client) newRetryTimerContinous(unit, cap time.Duration, jitter float64, doneCh chan struct{}) <-chan int {
|
||||||
attemptCh := make(chan int)
|
attemptCh := make(chan int)
|
||||||
|
|
||||||
// normalize jitter to the range [0, 1.0]
|
// normalize jitter to the range [0, 1.0]
|
||||||
|
|
|
@ -45,7 +45,7 @@ var DefaultRetryCap = time.Second
|
||||||
|
|
||||||
// newRetryTimer creates a timer with exponentially increasing
|
// newRetryTimer creates a timer with exponentially increasing
|
||||||
// delays until the maximum retry attempts are reached.
|
// delays until the maximum retry attempts are reached.
|
||||||
func (c *Client) newRetryTimer(ctx context.Context, maxRetry int, unit time.Duration, cap time.Duration, jitter float64) <-chan int {
|
func (c *Client) newRetryTimer(ctx context.Context, maxRetry int, unit, cap time.Duration, jitter float64) <-chan int {
|
||||||
attemptCh := make(chan int)
|
attemptCh := make(chan int)
|
||||||
|
|
||||||
// computes the exponential backoff duration according to
|
// computes the exponential backoff duration according to
|
||||||
|
|
|
@ -255,7 +255,7 @@ func parseRFC7231Time(lastModified string) (time.Time, error) {
|
||||||
|
|
||||||
// ToObjectInfo converts http header values into ObjectInfo type,
|
// ToObjectInfo converts http header values into ObjectInfo type,
|
||||||
// extracts metadata and fills in all the necessary fields in ObjectInfo.
|
// extracts metadata and fills in all the necessary fields in ObjectInfo.
|
||||||
func ToObjectInfo(bucketName string, objectName string, h http.Header) (ObjectInfo, error) {
|
func ToObjectInfo(bucketName, objectName string, h http.Header) (ObjectInfo, error) {
|
||||||
var err error
|
var err error
|
||||||
// Trim off the odd double quotes from ETag in the beginning and end.
|
// Trim off the odd double quotes from ETag in the beginning and end.
|
||||||
etag := trimEtag(h.Get("ETag"))
|
etag := trimEtag(h.Get("ETag"))
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"io"
|
"io"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Writer at INFO level. See WriterLevel for details.
|
// Writer at INFO level. See WriterLevel for details.
|
||||||
|
@ -20,15 +21,18 @@ func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
|
||||||
return NewEntry(logger).WriterLevel(level)
|
return NewEntry(logger).WriterLevel(level)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Writer returns an io.Writer that writes to the logger at the info log level
|
||||||
func (entry *Entry) Writer() *io.PipeWriter {
|
func (entry *Entry) Writer() *io.PipeWriter {
|
||||||
return entry.WriterLevel(InfoLevel)
|
return entry.WriterLevel(InfoLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriterLevel returns an io.Writer that writes to the logger at the given log level
|
||||||
func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
|
func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
|
||||||
reader, writer := io.Pipe()
|
reader, writer := io.Pipe()
|
||||||
|
|
||||||
var printFunc func(args ...interface{})
|
var printFunc func(args ...interface{})
|
||||||
|
|
||||||
|
// Determine which log function to use based on the specified log level
|
||||||
switch level {
|
switch level {
|
||||||
case TraceLevel:
|
case TraceLevel:
|
||||||
printFunc = entry.Trace
|
printFunc = entry.Trace
|
||||||
|
@ -48,23 +52,51 @@ func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
|
||||||
printFunc = entry.Print
|
printFunc = entry.Print
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start a new goroutine to scan the input and write it to the logger using the specified print function.
|
||||||
|
// It splits the input into chunks of up to 64KB to avoid buffer overflows.
|
||||||
go entry.writerScanner(reader, printFunc)
|
go entry.writerScanner(reader, printFunc)
|
||||||
|
|
||||||
|
// Set a finalizer function to close the writer when it is garbage collected
|
||||||
runtime.SetFinalizer(writer, writerFinalizer)
|
runtime.SetFinalizer(writer, writerFinalizer)
|
||||||
|
|
||||||
return writer
|
return writer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// writerScanner scans the input from the reader and writes it to the logger
|
||||||
func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
|
func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
|
||||||
scanner := bufio.NewScanner(reader)
|
scanner := bufio.NewScanner(reader)
|
||||||
for scanner.Scan() {
|
|
||||||
printFunc(scanner.Text())
|
// Set the buffer size to the maximum token size to avoid buffer overflows
|
||||||
|
scanner.Buffer(make([]byte, bufio.MaxScanTokenSize), bufio.MaxScanTokenSize)
|
||||||
|
|
||||||
|
// Define a split function to split the input into chunks of up to 64KB
|
||||||
|
chunkSize := bufio.MaxScanTokenSize // 64KB
|
||||||
|
splitFunc := func(data []byte, atEOF bool) (int, []byte, error) {
|
||||||
|
if len(data) >= chunkSize {
|
||||||
|
return chunkSize, data[:chunkSize], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufio.ScanLines(data, atEOF)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use the custom split function to split the input
|
||||||
|
scanner.Split(splitFunc)
|
||||||
|
|
||||||
|
// Scan the input and write it to the logger using the specified print function
|
||||||
|
for scanner.Scan() {
|
||||||
|
printFunc(strings.TrimRight(scanner.Text(), "\r\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there was an error while scanning the input, log an error
|
||||||
if err := scanner.Err(); err != nil {
|
if err := scanner.Err(); err != nil {
|
||||||
entry.Errorf("Error while reading from Writer: %s", err)
|
entry.Errorf("Error while reading from Writer: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the reader when we are done
|
||||||
reader.Close()
|
reader.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriterFinalizer is a finalizer function that closes then given writer when it is garbage collected
|
||||||
func writerFinalizer(writer *io.PipeWriter) {
|
func writerFinalizer(writer *io.PipeWriter) {
|
||||||
writer.Close()
|
writer.Close()
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,14 +357,14 @@ github.com/json-iterator/go
|
||||||
# github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
# github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||||
## explicit
|
## explicit
|
||||||
github.com/kballard/go-shellquote
|
github.com/kballard/go-shellquote
|
||||||
# github.com/klauspost/compress v1.16.5
|
# github.com/klauspost/compress v1.16.7
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
github.com/klauspost/compress/flate
|
github.com/klauspost/compress/flate
|
||||||
github.com/klauspost/compress/gzip
|
github.com/klauspost/compress/gzip
|
||||||
github.com/klauspost/compress/s2
|
github.com/klauspost/compress/s2
|
||||||
github.com/klauspost/compress/snappy
|
github.com/klauspost/compress/snappy
|
||||||
github.com/klauspost/compress/zlib
|
github.com/klauspost/compress/zlib
|
||||||
# github.com/klauspost/cpuid/v2 v2.2.4
|
# github.com/klauspost/cpuid/v2 v2.2.5
|
||||||
## explicit; go 1.15
|
## explicit; go 1.15
|
||||||
github.com/klauspost/cpuid/v2
|
github.com/klauspost/cpuid/v2
|
||||||
# github.com/leodido/go-urn v1.2.4
|
# github.com/leodido/go-urn v1.2.4
|
||||||
|
@ -386,7 +386,7 @@ github.com/miekg/dns
|
||||||
# github.com/minio/md5-simd v1.1.2
|
# github.com/minio/md5-simd v1.1.2
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/minio/md5-simd
|
github.com/minio/md5-simd
|
||||||
# github.com/minio/minio-go/v7 v7.0.60
|
# github.com/minio/minio-go/v7 v7.0.61
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/minio/minio-go/v7
|
github.com/minio/minio-go/v7
|
||||||
github.com/minio/minio-go/v7/pkg/credentials
|
github.com/minio/minio-go/v7/pkg/credentials
|
||||||
|
@ -439,7 +439,7 @@ github.com/remyoudompheng/bigfft
|
||||||
# github.com/rs/xid v1.5.0
|
# github.com/rs/xid v1.5.0
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/rs/xid
|
github.com/rs/xid
|
||||||
# github.com/sirupsen/logrus v1.9.2
|
# github.com/sirupsen/logrus v1.9.3
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/sirupsen/logrus
|
github.com/sirupsen/logrus
|
||||||
# github.com/spf13/afero v1.9.5
|
# github.com/spf13/afero v1.9.5
|
||||||
|
|
Loading…
Reference in New Issue