forked from pingcap/tidb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
glide:update kvproto & pd (pingcap#2787)
- Loading branch information
1 parent
e617e04
commit fc93cd5
Showing
24 changed files
with
1,476 additions
and
235 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
Copyright (c) 2005-2008 Dustin Sallings <[email protected]> | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in | ||
all copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. | ||
|
||
<http://www.opensource.org/licenses/mit-license.php> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package humanize | ||
|
||
import ( | ||
"math/big" | ||
) | ||
|
||
// order of magnitude (to a max order) | ||
func oomm(n, b *big.Int, maxmag int) (float64, int) { | ||
mag := 0 | ||
m := &big.Int{} | ||
for n.Cmp(b) >= 0 { | ||
n.DivMod(n, b, m) | ||
mag++ | ||
if mag == maxmag && maxmag >= 0 { | ||
break | ||
} | ||
} | ||
return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag | ||
} | ||
|
||
// total order of magnitude | ||
// (same as above, but with no upper limit) | ||
func oom(n, b *big.Int) (float64, int) { | ||
mag := 0 | ||
m := &big.Int{} | ||
for n.Cmp(b) >= 0 { | ||
n.DivMod(n, b, m) | ||
mag++ | ||
} | ||
return float64(n.Int64()) + (float64(m.Int64()) / float64(b.Int64())), mag | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
package humanize | ||
|
||
import ( | ||
"fmt" | ||
"math/big" | ||
"strings" | ||
"unicode" | ||
) | ||
|
||
var ( | ||
bigIECExp = big.NewInt(1024) | ||
|
||
// BigByte is one byte in bit.Ints | ||
BigByte = big.NewInt(1) | ||
// BigKiByte is 1,024 bytes in bit.Ints | ||
BigKiByte = (&big.Int{}).Mul(BigByte, bigIECExp) | ||
// BigMiByte is 1,024 k bytes in bit.Ints | ||
BigMiByte = (&big.Int{}).Mul(BigKiByte, bigIECExp) | ||
// BigGiByte is 1,024 m bytes in bit.Ints | ||
BigGiByte = (&big.Int{}).Mul(BigMiByte, bigIECExp) | ||
// BigTiByte is 1,024 g bytes in bit.Ints | ||
BigTiByte = (&big.Int{}).Mul(BigGiByte, bigIECExp) | ||
// BigPiByte is 1,024 t bytes in bit.Ints | ||
BigPiByte = (&big.Int{}).Mul(BigTiByte, bigIECExp) | ||
// BigEiByte is 1,024 p bytes in bit.Ints | ||
BigEiByte = (&big.Int{}).Mul(BigPiByte, bigIECExp) | ||
// BigZiByte is 1,024 e bytes in bit.Ints | ||
BigZiByte = (&big.Int{}).Mul(BigEiByte, bigIECExp) | ||
// BigYiByte is 1,024 z bytes in bit.Ints | ||
BigYiByte = (&big.Int{}).Mul(BigZiByte, bigIECExp) | ||
) | ||
|
||
var ( | ||
bigSIExp = big.NewInt(1000) | ||
|
||
// BigSIByte is one SI byte in big.Ints | ||
BigSIByte = big.NewInt(1) | ||
// BigKByte is 1,000 SI bytes in big.Ints | ||
BigKByte = (&big.Int{}).Mul(BigSIByte, bigSIExp) | ||
// BigMByte is 1,000 SI k bytes in big.Ints | ||
BigMByte = (&big.Int{}).Mul(BigKByte, bigSIExp) | ||
// BigGByte is 1,000 SI m bytes in big.Ints | ||
BigGByte = (&big.Int{}).Mul(BigMByte, bigSIExp) | ||
// BigTByte is 1,000 SI g bytes in big.Ints | ||
BigTByte = (&big.Int{}).Mul(BigGByte, bigSIExp) | ||
// BigPByte is 1,000 SI t bytes in big.Ints | ||
BigPByte = (&big.Int{}).Mul(BigTByte, bigSIExp) | ||
// BigEByte is 1,000 SI p bytes in big.Ints | ||
BigEByte = (&big.Int{}).Mul(BigPByte, bigSIExp) | ||
// BigZByte is 1,000 SI e bytes in big.Ints | ||
BigZByte = (&big.Int{}).Mul(BigEByte, bigSIExp) | ||
// BigYByte is 1,000 SI z bytes in big.Ints | ||
BigYByte = (&big.Int{}).Mul(BigZByte, bigSIExp) | ||
) | ||
|
||
var bigBytesSizeTable = map[string]*big.Int{ | ||
"b": BigByte, | ||
"kib": BigKiByte, | ||
"kb": BigKByte, | ||
"mib": BigMiByte, | ||
"mb": BigMByte, | ||
"gib": BigGiByte, | ||
"gb": BigGByte, | ||
"tib": BigTiByte, | ||
"tb": BigTByte, | ||
"pib": BigPiByte, | ||
"pb": BigPByte, | ||
"eib": BigEiByte, | ||
"eb": BigEByte, | ||
"zib": BigZiByte, | ||
"zb": BigZByte, | ||
"yib": BigYiByte, | ||
"yb": BigYByte, | ||
// Without suffix | ||
"": BigByte, | ||
"ki": BigKiByte, | ||
"k": BigKByte, | ||
"mi": BigMiByte, | ||
"m": BigMByte, | ||
"gi": BigGiByte, | ||
"g": BigGByte, | ||
"ti": BigTiByte, | ||
"t": BigTByte, | ||
"pi": BigPiByte, | ||
"p": BigPByte, | ||
"ei": BigEiByte, | ||
"e": BigEByte, | ||
"z": BigZByte, | ||
"zi": BigZiByte, | ||
"y": BigYByte, | ||
"yi": BigYiByte, | ||
} | ||
|
||
var ten = big.NewInt(10) | ||
|
||
func humanateBigBytes(s, base *big.Int, sizes []string) string { | ||
if s.Cmp(ten) < 0 { | ||
return fmt.Sprintf("%d B", s) | ||
} | ||
c := (&big.Int{}).Set(s) | ||
val, mag := oomm(c, base, len(sizes)-1) | ||
suffix := sizes[mag] | ||
f := "%.0f %s" | ||
if val < 10 { | ||
f = "%.1f %s" | ||
} | ||
|
||
return fmt.Sprintf(f, val, suffix) | ||
|
||
} | ||
|
||
// BigBytes produces a human readable representation of an SI size. | ||
// | ||
// See also: ParseBigBytes. | ||
// | ||
// BigBytes(82854982) -> 83MB | ||
func BigBytes(s *big.Int) string { | ||
sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"} | ||
return humanateBigBytes(s, bigSIExp, sizes) | ||
} | ||
|
||
// BigIBytes produces a human readable representation of an IEC size. | ||
// | ||
// See also: ParseBigBytes. | ||
// | ||
// BigIBytes(82854982) -> 79MiB | ||
func BigIBytes(s *big.Int) string { | ||
sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"} | ||
return humanateBigBytes(s, bigIECExp, sizes) | ||
} | ||
|
||
// ParseBigBytes parses a string representation of bytes into the number | ||
// of bytes it represents. | ||
// | ||
// See also: BigBytes, BigIBytes. | ||
// | ||
// ParseBigBytes("42MB") -> 42000000, nil | ||
// ParseBigBytes("42mib") -> 44040192, nil | ||
func ParseBigBytes(s string) (*big.Int, error) { | ||
lastDigit := 0 | ||
for _, r := range s { | ||
if !(unicode.IsDigit(r) || r == '.') { | ||
break | ||
} | ||
lastDigit++ | ||
} | ||
|
||
val := &big.Rat{} | ||
_, err := fmt.Sscanf(s[:lastDigit], "%f", val) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) | ||
if m, ok := bigBytesSizeTable[extra]; ok { | ||
mv := (&big.Rat{}).SetInt(m) | ||
val.Mul(val, mv) | ||
rv := &big.Int{} | ||
rv.Div(val.Num(), val.Denom()) | ||
return rv, nil | ||
} | ||
|
||
return nil, fmt.Errorf("unhandled size name: %v", extra) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
package humanize | ||
|
||
import ( | ||
"fmt" | ||
"math" | ||
"strconv" | ||
"strings" | ||
"unicode" | ||
) | ||
|
||
// IEC Sizes. | ||
// kibis of bits | ||
const ( | ||
Byte = 1 << (iota * 10) | ||
KiByte | ||
MiByte | ||
GiByte | ||
TiByte | ||
PiByte | ||
EiByte | ||
) | ||
|
||
// SI Sizes. | ||
const ( | ||
IByte = 1 | ||
KByte = IByte * 1000 | ||
MByte = KByte * 1000 | ||
GByte = MByte * 1000 | ||
TByte = GByte * 1000 | ||
PByte = TByte * 1000 | ||
EByte = PByte * 1000 | ||
) | ||
|
||
var bytesSizeTable = map[string]uint64{ | ||
"b": Byte, | ||
"kib": KiByte, | ||
"kb": KByte, | ||
"mib": MiByte, | ||
"mb": MByte, | ||
"gib": GiByte, | ||
"gb": GByte, | ||
"tib": TiByte, | ||
"tb": TByte, | ||
"pib": PiByte, | ||
"pb": PByte, | ||
"eib": EiByte, | ||
"eb": EByte, | ||
// Without suffix | ||
"": Byte, | ||
"ki": KiByte, | ||
"k": KByte, | ||
"mi": MiByte, | ||
"m": MByte, | ||
"gi": GiByte, | ||
"g": GByte, | ||
"ti": TiByte, | ||
"t": TByte, | ||
"pi": PiByte, | ||
"p": PByte, | ||
"ei": EiByte, | ||
"e": EByte, | ||
} | ||
|
||
func logn(n, b float64) float64 { | ||
return math.Log(n) / math.Log(b) | ||
} | ||
|
||
func humanateBytes(s uint64, base float64, sizes []string) string { | ||
if s < 10 { | ||
return fmt.Sprintf("%d B", s) | ||
} | ||
e := math.Floor(logn(float64(s), base)) | ||
suffix := sizes[int(e)] | ||
val := math.Floor(float64(s)/math.Pow(base, e)*10+0.5) / 10 | ||
f := "%.0f %s" | ||
if val < 10 { | ||
f = "%.1f %s" | ||
} | ||
|
||
return fmt.Sprintf(f, val, suffix) | ||
} | ||
|
||
// Bytes produces a human readable representation of an SI size. | ||
// | ||
// See also: ParseBytes. | ||
// | ||
// Bytes(82854982) -> 83MB | ||
func Bytes(s uint64) string { | ||
sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"} | ||
return humanateBytes(s, 1000, sizes) | ||
} | ||
|
||
// IBytes produces a human readable representation of an IEC size. | ||
// | ||
// See also: ParseBytes. | ||
// | ||
// IBytes(82854982) -> 79MiB | ||
func IBytes(s uint64) string { | ||
sizes := []string{"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"} | ||
return humanateBytes(s, 1024, sizes) | ||
} | ||
|
||
// ParseBytes parses a string representation of bytes into the number | ||
// of bytes it represents. | ||
// | ||
// See Also: Bytes, IBytes. | ||
// | ||
// ParseBytes("42MB") -> 42000000, nil | ||
// ParseBytes("42mib") -> 44040192, nil | ||
func ParseBytes(s string) (uint64, error) { | ||
lastDigit := 0 | ||
for _, r := range s { | ||
if !(unicode.IsDigit(r) || r == '.') { | ||
break | ||
} | ||
lastDigit++ | ||
} | ||
|
||
f, err := strconv.ParseFloat(s[:lastDigit], 64) | ||
if err != nil { | ||
return 0, err | ||
} | ||
|
||
extra := strings.ToLower(strings.TrimSpace(s[lastDigit:])) | ||
if m, ok := bytesSizeTable[extra]; ok { | ||
f *= float64(m) | ||
if f >= math.MaxUint64 { | ||
return 0, fmt.Errorf("too large: %v", s) | ||
} | ||
return uint64(f), nil | ||
} | ||
|
||
return 0, fmt.Errorf("unhandled size name: %v", extra) | ||
} |
Oops, something went wrong.