Integer type policy

Integers are for numbers, enabling arithmetic like subtractions and for
loops without getting shot in the foot. Unsigneds are for bitfields.

- "int" for numbers that will always be laughably smaller than four
  billion, and where we don't care about the serialization format.

- "int32" for numbers that will always be laughably smaller than four
  billion, and will be serialized to four bytes.

- "int64" for numbers that may approach four billion or will be
  serialized to eight bytes.

- "uint32" and "uint64" for bitfields, depending on required number of
  bits and serialization format. Likewise "uint8" and "uint16", although
  rare in this project since they don't exist in XDR.

- "int8", "int16" and plain "uint" are almost never useful.
This commit is contained in:
Jakob Borg 2015-01-18 02:12:06 +01:00
parent 221e3eddd5
commit 2c8b627008
30 changed files with 181 additions and 151 deletions

12
Godeps/Godeps.json generated
View File

@ -27,7 +27,7 @@
}, },
{ {
"ImportPath": "github.com/calmh/xdr", "ImportPath": "github.com/calmh/xdr",
"Rev": "214788d8fedfc310c18eca9ed12be408a5054cd5" "Rev": "ff948d7666c5e0fd18d398f6278881724d36a90b"
}, },
{ {
"ImportPath": "github.com/juju/ratelimit", "ImportPath": "github.com/juju/ratelimit",
@ -35,7 +35,7 @@
}, },
{ {
"ImportPath": "github.com/syncthing/protocol", "ImportPath": "github.com/syncthing/protocol",
"Rev": "f76b5d800208131015b14cfc1cfd3e6dd1d5e979" "Rev": "15bf5f583a88b7aaf0a5b810fcf5fb21da0a3b3f"
}, },
{ {
"ImportPath": "github.com/syndtr/goleveldb/leveldb", "ImportPath": "github.com/syndtr/goleveldb/leveldb",
@ -59,19 +59,19 @@
}, },
{ {
"ImportPath": "golang.org/x/crypto/bcrypt", "ImportPath": "golang.org/x/crypto/bcrypt",
"Rev": "731db29863ea7213d9556d0170afb38987f401d4" "Rev": "4ed45ec682102c643324fae5dff8dab085b6c300"
}, },
{ {
"ImportPath": "golang.org/x/crypto/blowfish", "ImportPath": "golang.org/x/crypto/blowfish",
"Rev": "731db29863ea7213d9556d0170afb38987f401d4" "Rev": "4ed45ec682102c643324fae5dff8dab085b6c300"
}, },
{ {
"ImportPath": "golang.org/x/text/transform", "ImportPath": "golang.org/x/text/transform",
"Rev": "985ee5acfaf1ff6712c7c99438752f8e09416ccb" "Rev": "c980adc4a823548817b9c47d38c6ca6b7d7d8b6a"
}, },
{ {
"ImportPath": "golang.org/x/text/unicode/norm", "ImportPath": "golang.org/x/text/unicode/norm",
"Rev": "985ee5acfaf1ff6712c7c99438752f8e09416ccb" "Rev": "c980adc4a823548817b9c47d38c6ca6b7d7d8b6a"
} }
] ]
} }

View File

@ -10,25 +10,25 @@ import (
type countingReader struct { type countingReader struct {
io.Reader io.Reader
tot uint64 // bytes tot int64 // bytes
last int64 // unix nanos last int64 // unix nanos
} }
var ( var (
totalIncoming uint64 totalIncoming int64
totalOutgoing uint64 totalOutgoing int64
) )
func (c *countingReader) Read(bs []byte) (int, error) { func (c *countingReader) Read(bs []byte) (int, error) {
n, err := c.Reader.Read(bs) n, err := c.Reader.Read(bs)
atomic.AddUint64(&c.tot, uint64(n)) atomic.AddInt64(&c.tot, int64(n))
atomic.AddUint64(&totalIncoming, uint64(n)) atomic.AddInt64(&totalIncoming, int64(n))
atomic.StoreInt64(&c.last, time.Now().UnixNano()) atomic.StoreInt64(&c.last, time.Now().UnixNano())
return n, err return n, err
} }
func (c *countingReader) Tot() uint64 { func (c *countingReader) Tot() int64 {
return atomic.LoadUint64(&c.tot) return atomic.LoadInt64(&c.tot)
} }
func (c *countingReader) Last() time.Time { func (c *countingReader) Last() time.Time {
@ -37,26 +37,26 @@ func (c *countingReader) Last() time.Time {
type countingWriter struct { type countingWriter struct {
io.Writer io.Writer
tot uint64 // bytes tot int64 // bytes
last int64 // unix nanos last int64 // unix nanos
} }
func (c *countingWriter) Write(bs []byte) (int, error) { func (c *countingWriter) Write(bs []byte) (int, error) {
n, err := c.Writer.Write(bs) n, err := c.Writer.Write(bs)
atomic.AddUint64(&c.tot, uint64(n)) atomic.AddInt64(&c.tot, int64(n))
atomic.AddUint64(&totalOutgoing, uint64(n)) atomic.AddInt64(&totalOutgoing, int64(n))
atomic.StoreInt64(&c.last, time.Now().UnixNano()) atomic.StoreInt64(&c.last, time.Now().UnixNano())
return n, err return n, err
} }
func (c *countingWriter) Tot() uint64 { func (c *countingWriter) Tot() int64 {
return atomic.LoadUint64(&c.tot) return atomic.LoadInt64(&c.tot)
} }
func (c *countingWriter) Last() time.Time { func (c *countingWriter) Last() time.Time {
return time.Unix(0, atomic.LoadInt64(&c.last)) return time.Unix(0, atomic.LoadInt64(&c.last))
} }
func TotalInOut() (uint64, uint64) { func TotalInOut() (int64, int64) {
return atomic.LoadUint64(&totalIncoming), atomic.LoadUint64(&totalOutgoing) return atomic.LoadInt64(&totalIncoming), atomic.LoadInt64(&totalOutgoing)
} }

View File

@ -1,6 +1,5 @@
// Copyright (C) 2014 The Protocol Authors. // Copyright (C) 2014 The Protocol Authors.
//go:generate -command genxdr go run ../../Godeps/_workspace/src/github.com/calmh/xdr/cmd/genxdr/main.go
//go:generate genxdr -o message_xdr.go message.go //go:generate genxdr -o message_xdr.go message.go
package protocol package protocol
@ -18,8 +17,8 @@ type FileInfo struct {
Name string // max:8192 Name string // max:8192
Flags uint32 Flags uint32
Modified int64 Modified int64
Version uint64 Version int64
LocalVersion uint64 LocalVersion int64
Blocks []BlockInfo Blocks []BlockInfo
} }
@ -60,7 +59,7 @@ func (f FileInfo) HasPermissionBits() bool {
type BlockInfo struct { type BlockInfo struct {
Offset int64 // noencode (cache only) Offset int64 // noencode (cache only)
Size uint32 Size int32
Hash []byte // max:64 Hash []byte // max:64
} }
@ -71,8 +70,8 @@ func (b BlockInfo) String() string {
type RequestMessage struct { type RequestMessage struct {
Folder string // max:64 Folder string // max:64
Name string // max:8192 Name string // max:8192
Offset uint64 Offset int64
Size uint32 Size int32
Hash []byte // max:64 Hash []byte // max:64
Flags uint32 Flags uint32
Options []Option // max:64 Options []Option // max:64
@ -80,7 +79,7 @@ type RequestMessage struct {
type ResponseMessage struct { type ResponseMessage struct {
Data []byte Data []byte
Error uint32 Error int32
} }
type ClusterConfigMessage struct { type ClusterConfigMessage struct {
@ -107,7 +106,7 @@ type Folder struct {
type Device struct { type Device struct {
ID []byte // max:32 ID []byte // max:32
Flags uint32 Flags uint32
MaxLocalVersion uint64 MaxLocalVersion int64
} }
type Option struct { type Option struct {
@ -117,7 +116,7 @@ type Option struct {
type CloseMessage struct { type CloseMessage struct {
Reason string // max:1024 Reason string // max:1024
Code uint32 Code int32
} }
type EmptyMessage struct{} type EmptyMessage struct{}

View File

@ -168,8 +168,8 @@ struct FileInfo {
string Name<8192>; string Name<8192>;
unsigned int Flags; unsigned int Flags;
hyper Modified; hyper Modified;
unsigned hyper Version; hyper Version;
unsigned hyper LocalVersion; hyper LocalVersion;
BlockInfo Blocks<>; BlockInfo Blocks<>;
} }
@ -206,8 +206,8 @@ func (o FileInfo) encodeXDR(xw *xdr.Writer) (int, error) {
xw.WriteString(o.Name) xw.WriteString(o.Name)
xw.WriteUint32(o.Flags) xw.WriteUint32(o.Flags)
xw.WriteUint64(uint64(o.Modified)) xw.WriteUint64(uint64(o.Modified))
xw.WriteUint64(o.Version) xw.WriteUint64(uint64(o.Version))
xw.WriteUint64(o.LocalVersion) xw.WriteUint64(uint64(o.LocalVersion))
xw.WriteUint32(uint32(len(o.Blocks))) xw.WriteUint32(uint32(len(o.Blocks)))
for i := range o.Blocks { for i := range o.Blocks {
_, err := o.Blocks[i].encodeXDR(xw) _, err := o.Blocks[i].encodeXDR(xw)
@ -233,8 +233,8 @@ func (o *FileInfo) decodeXDR(xr *xdr.Reader) error {
o.Name = xr.ReadStringMax(8192) o.Name = xr.ReadStringMax(8192)
o.Flags = xr.ReadUint32() o.Flags = xr.ReadUint32()
o.Modified = int64(xr.ReadUint64()) o.Modified = int64(xr.ReadUint64())
o.Version = xr.ReadUint64() o.Version = int64(xr.ReadUint64())
o.LocalVersion = xr.ReadUint64() o.LocalVersion = int64(xr.ReadUint64())
_BlocksSize := int(xr.ReadUint32()) _BlocksSize := int(xr.ReadUint32())
o.Blocks = make([]BlockInfo, _BlocksSize) o.Blocks = make([]BlockInfo, _BlocksSize)
for i := range o.Blocks { for i := range o.Blocks {
@ -261,7 +261,7 @@ BlockInfo Structure:
struct BlockInfo { struct BlockInfo {
unsigned int Size; int Size;
opaque Hash<64>; opaque Hash<64>;
} }
@ -292,7 +292,7 @@ func (o BlockInfo) AppendXDR(bs []byte) ([]byte, error) {
} }
func (o BlockInfo) encodeXDR(xw *xdr.Writer) (int, error) { func (o BlockInfo) encodeXDR(xw *xdr.Writer) (int, error) {
xw.WriteUint32(o.Size) xw.WriteUint32(uint32(o.Size))
if l := len(o.Hash); l > 64 { if l := len(o.Hash); l > 64 {
return xw.Tot(), xdr.ElementSizeExceeded("Hash", l, 64) return xw.Tot(), xdr.ElementSizeExceeded("Hash", l, 64)
} }
@ -312,7 +312,7 @@ func (o *BlockInfo) UnmarshalXDR(bs []byte) error {
} }
func (o *BlockInfo) decodeXDR(xr *xdr.Reader) error { func (o *BlockInfo) decodeXDR(xr *xdr.Reader) error {
o.Size = xr.ReadUint32() o.Size = int32(xr.ReadUint32())
o.Hash = xr.ReadBytesMax(64) o.Hash = xr.ReadBytesMax(64)
return xr.Error() return xr.Error()
} }
@ -361,8 +361,8 @@ RequestMessage Structure:
struct RequestMessage { struct RequestMessage {
string Folder<64>; string Folder<64>;
string Name<8192>; string Name<8192>;
unsigned hyper Offset; hyper Offset;
unsigned int Size; int Size;
opaque Hash<64>; opaque Hash<64>;
unsigned int Flags; unsigned int Flags;
Option Options<64>; Option Options<64>;
@ -403,8 +403,8 @@ func (o RequestMessage) encodeXDR(xw *xdr.Writer) (int, error) {
return xw.Tot(), xdr.ElementSizeExceeded("Name", l, 8192) return xw.Tot(), xdr.ElementSizeExceeded("Name", l, 8192)
} }
xw.WriteString(o.Name) xw.WriteString(o.Name)
xw.WriteUint64(o.Offset) xw.WriteUint64(uint64(o.Offset))
xw.WriteUint32(o.Size) xw.WriteUint32(uint32(o.Size))
if l := len(o.Hash); l > 64 { if l := len(o.Hash); l > 64 {
return xw.Tot(), xdr.ElementSizeExceeded("Hash", l, 64) return xw.Tot(), xdr.ElementSizeExceeded("Hash", l, 64)
} }
@ -437,8 +437,8 @@ func (o *RequestMessage) UnmarshalXDR(bs []byte) error {
func (o *RequestMessage) decodeXDR(xr *xdr.Reader) error { func (o *RequestMessage) decodeXDR(xr *xdr.Reader) error {
o.Folder = xr.ReadStringMax(64) o.Folder = xr.ReadStringMax(64)
o.Name = xr.ReadStringMax(8192) o.Name = xr.ReadStringMax(8192)
o.Offset = xr.ReadUint64() o.Offset = int64(xr.ReadUint64())
o.Size = xr.ReadUint32() o.Size = int32(xr.ReadUint32())
o.Hash = xr.ReadBytesMax(64) o.Hash = xr.ReadBytesMax(64)
o.Flags = xr.ReadUint32() o.Flags = xr.ReadUint32()
_OptionsSize := int(xr.ReadUint32()) _OptionsSize := int(xr.ReadUint32())
@ -471,7 +471,7 @@ ResponseMessage Structure:
struct ResponseMessage { struct ResponseMessage {
opaque Data<>; opaque Data<>;
unsigned int Error; int Error;
} }
*/ */
@ -502,7 +502,7 @@ func (o ResponseMessage) AppendXDR(bs []byte) ([]byte, error) {
func (o ResponseMessage) encodeXDR(xw *xdr.Writer) (int, error) { func (o ResponseMessage) encodeXDR(xw *xdr.Writer) (int, error) {
xw.WriteBytes(o.Data) xw.WriteBytes(o.Data)
xw.WriteUint32(o.Error) xw.WriteUint32(uint32(o.Error))
return xw.Tot(), xw.Error() return xw.Tot(), xw.Error()
} }
@ -519,7 +519,7 @@ func (o *ResponseMessage) UnmarshalXDR(bs []byte) error {
func (o *ResponseMessage) decodeXDR(xr *xdr.Reader) error { func (o *ResponseMessage) decodeXDR(xr *xdr.Reader) error {
o.Data = xr.ReadBytes() o.Data = xr.ReadBytes()
o.Error = xr.ReadUint32() o.Error = int32(xr.ReadUint32())
return xr.Error() return xr.Error()
} }
@ -766,7 +766,7 @@ Device Structure:
struct Device { struct Device {
opaque ID<32>; opaque ID<32>;
unsigned int Flags; unsigned int Flags;
unsigned hyper MaxLocalVersion; hyper MaxLocalVersion;
} }
*/ */
@ -801,7 +801,7 @@ func (o Device) encodeXDR(xw *xdr.Writer) (int, error) {
} }
xw.WriteBytes(o.ID) xw.WriteBytes(o.ID)
xw.WriteUint32(o.Flags) xw.WriteUint32(o.Flags)
xw.WriteUint64(o.MaxLocalVersion) xw.WriteUint64(uint64(o.MaxLocalVersion))
return xw.Tot(), xw.Error() return xw.Tot(), xw.Error()
} }
@ -819,7 +819,7 @@ func (o *Device) UnmarshalXDR(bs []byte) error {
func (o *Device) decodeXDR(xr *xdr.Reader) error { func (o *Device) decodeXDR(xr *xdr.Reader) error {
o.ID = xr.ReadBytesMax(32) o.ID = xr.ReadBytesMax(32)
o.Flags = xr.ReadUint32() o.Flags = xr.ReadUint32()
o.MaxLocalVersion = xr.ReadUint64() o.MaxLocalVersion = int64(xr.ReadUint64())
return xr.Error() return xr.Error()
} }
@ -923,7 +923,7 @@ CloseMessage Structure:
struct CloseMessage { struct CloseMessage {
string Reason<1024>; string Reason<1024>;
unsigned int Code; int Code;
} }
*/ */
@ -957,7 +957,7 @@ func (o CloseMessage) encodeXDR(xw *xdr.Writer) (int, error) {
return xw.Tot(), xdr.ElementSizeExceeded("Reason", l, 1024) return xw.Tot(), xdr.ElementSizeExceeded("Reason", l, 1024)
} }
xw.WriteString(o.Reason) xw.WriteString(o.Reason)
xw.WriteUint32(o.Code) xw.WriteUint32(uint32(o.Code))
return xw.Tot(), xw.Error() return xw.Tot(), xw.Error()
} }
@ -974,7 +974,7 @@ func (o *CloseMessage) UnmarshalXDR(bs []byte) error {
func (o *CloseMessage) decodeXDR(xr *xdr.Reader) error { func (o *CloseMessage) decodeXDR(xr *xdr.Reader) error {
o.Reason = xr.ReadStringMax(1024) o.Reason = xr.ReadStringMax(1024)
o.Code = xr.ReadUint32() o.Code = int32(xr.ReadUint32())
return xr.Error() return xr.Error()
} }

View File

@ -222,8 +222,8 @@ func (c *rawConnection) Request(folder string, name string, offset int64, size i
ok := c.send(id, messageTypeRequest, RequestMessage{ ok := c.send(id, messageTypeRequest, RequestMessage{
Folder: folder, Folder: folder,
Name: name, Name: name,
Offset: uint64(offset), Offset: offset,
Size: uint32(size), Size: int32(size),
}) })
if !ok { if !ok {
return nil, ErrClosed return nil, ErrClosed
@ -706,8 +706,8 @@ func (c *rawConnection) pingerLoop() {
type Statistics struct { type Statistics struct {
At time.Time At time.Time
InBytesTotal uint64 InBytesTotal int64
OutBytesTotal uint64 OutBytesTotal int64
} }
func (c *rawConnection) Statistics() Statistics { func (c *rawConnection) Statistics() Statistics {

View File

@ -301,7 +301,7 @@ func assets() {
} }
func xdr() { func xdr() {
runPrint("go", "generate", "./internal/discover", "./internal/db", "./internal/protocol") runPrint("go", "generate", "./internal/discover", "./internal/db")
} }
func translate() { func translate() {

View File

@ -794,7 +794,7 @@ func toNeedSlice(fs []db.FileInfoTruncated) []map[string]interface{} {
"Version": file.Version, "Version": file.Version,
"LocalVersion": file.LocalVersion, "LocalVersion": file.LocalVersion,
"NumBlocks": file.NumBlocks, "NumBlocks": file.NumBlocks,
"Size": db.BlocksToSize(file.NumBlocks), "Size": db.BlocksToSize(int(file.NumBlocks)),
} }
} }
return output return output

View File

@ -22,7 +22,7 @@ import (
"strings" "strings"
) )
func memorySize() (uint64, error) { func memorySize() (int64, error) {
cmd := exec.Command("sysctl", "hw.memsize") cmd := exec.Command("sysctl", "hw.memsize")
out, err := cmd.Output() out, err := cmd.Output()
if err != nil { if err != nil {
@ -32,7 +32,7 @@ func memorySize() (uint64, error) {
if len(fs) != 2 { if len(fs) != 2 {
return 0, errors.New("sysctl parse error") return 0, errors.New("sysctl parse error")
} }
bytes, err := strconv.ParseUint(fs[1], 10, 64) bytes, err := strconv.ParseInt(fs[1], 10, 64)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@ -23,7 +23,7 @@ import (
"strings" "strings"
) )
func memorySize() (uint64, error) { func memorySize() (int64, error) {
f, err := os.Open("/proc/meminfo") f, err := os.Open("/proc/meminfo")
if err != nil { if err != nil {
return 0, err return 0, err
@ -40,7 +40,7 @@ func memorySize() (uint64, error) {
return 0, errors.New("/proc/meminfo parse error 2") return 0, errors.New("/proc/meminfo parse error 2")
} }
kb, err := strconv.ParseUint(fs[1], 10, 64) kb, err := strconv.ParseInt(fs[1], 10, 64)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@ -22,14 +22,14 @@ import (
"strconv" "strconv"
) )
func memorySize() (uint64, error) { func memorySize() (int64, error) {
cmd := exec.Command("prtconf", "-m") cmd := exec.Command("prtconf", "-m")
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if err != nil { if err != nil {
return 0, err return 0, err
} }
mb, err := strconv.ParseUint(string(out), 10, 64) mb, err := strconv.ParseInt(string(out), 10, 64)
if err != nil { if err != nil {
return 0, err return 0, err
} }

View File

@ -19,6 +19,6 @@ package main
import "errors" import "errors"
func memorySize() (uint64, error) { func memorySize() (int64, error) {
return 0, errors.New("not implemented") return 0, errors.New("not implemented")
} }

View File

@ -26,7 +26,7 @@ var (
globalMemoryStatusEx, _ = syscall.GetProcAddress(kernel32, "GlobalMemoryStatusEx") globalMemoryStatusEx, _ = syscall.GetProcAddress(kernel32, "GlobalMemoryStatusEx")
) )
func memorySize() (uint64, error) { func memorySize() (int64, error) {
var memoryStatusEx [64]byte var memoryStatusEx [64]byte
binary.LittleEndian.PutUint32(memoryStatusEx[:], 64) binary.LittleEndian.PutUint32(memoryStatusEx[:], 64)
p := uintptr(unsafe.Pointer(&memoryStatusEx[0])) p := uintptr(unsafe.Pointer(&memoryStatusEx[0]))
@ -36,5 +36,5 @@ func memorySize() (uint64, error) {
return 0, callErr return 0, callErr
} }
return binary.LittleEndian.Uint64(memoryStatusEx[8:]), nil return int64(binary.LittleEndian.Uint64(memoryStatusEx[8:])), nil
} }

View File

@ -43,7 +43,7 @@ func savePerfStats(file string) {
var prevTime int64 var prevTime int64
var rusage syscall.Rusage var rusage syscall.Rusage
var memstats runtime.MemStats var memstats runtime.MemStats
var prevIn, prevOut uint64 var prevIn, prevOut int64
t0 := time.Now() t0 := time.Now()
for t := range time.NewTicker(250 * time.Millisecond).C { for t := range time.NewTicker(250 * time.Millisecond).C {

View File

@ -160,7 +160,7 @@ func (f *BlockFinder) Changed(cfg config.Configuration) error {
// the block) or false to continue iterating for whatever reason. // the block) or false to continue iterating for whatever reason.
// The iterator finally returns the result, whether or not a satisfying block // The iterator finally returns the result, whether or not a satisfying block
// was eventually found. // was eventually found.
func (f *BlockFinder) Iterate(hash []byte, iterFn func(string, string, uint32) bool) bool { func (f *BlockFinder) Iterate(hash []byte, iterFn func(string, string, int32) bool) bool {
f.mut.RLock() f.mut.RLock()
folders := f.folders folders := f.folders
f.mut.RUnlock() f.mut.RUnlock()
@ -171,7 +171,7 @@ func (f *BlockFinder) Iterate(hash []byte, iterFn func(string, string, uint32) b
for iter.Next() && iter.Error() == nil { for iter.Next() && iter.Error() == nil {
folder, file := fromBlockKey(iter.Key()) folder, file := fromBlockKey(iter.Key())
index := binary.BigEndian.Uint32(iter.Value()) index := int32(binary.BigEndian.Uint32(iter.Value()))
if iterFn(folder, osutil.NativeFilename(file), index) { if iterFn(folder, osutil.NativeFilename(file), index) {
return true return true
} }
@ -182,7 +182,7 @@ func (f *BlockFinder) Iterate(hash []byte, iterFn func(string, string, uint32) b
// A method for repairing incorrect blockmap entries, removes the old entry // A method for repairing incorrect blockmap entries, removes the old entry
// and replaces it with a new entry for the given block // and replaces it with a new entry for the given block
func (f *BlockFinder) Fix(folder, file string, index uint32, oldHash, newHash []byte) error { func (f *BlockFinder) Fix(folder, file string, index int32, oldHash, newHash []byte) error {
buf := make([]byte, 4) buf := make([]byte, 4)
binary.BigEndian.PutUint32(buf, uint32(index)) binary.BigEndian.PutUint32(buf, uint32(index))

View File

@ -32,7 +32,7 @@ func genBlocks(n int) []protocol.BlockInfo {
for j := range h { for j := range h {
h[j] = byte(i + j) h[j] = byte(i + j)
} }
b[i].Size = uint32(i) b[i].Size = int32(i)
b[i].Hash = h b[i].Hash = h
} }
return b return b
@ -103,21 +103,21 @@ func TestBlockMapAddUpdateWipe(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index int32) bool {
if folder != "folder1" || file != "f1" || index != 0 { if folder != "folder1" || file != "f1" || index != 0 {
t.Fatal("Mismatch") t.Fatal("Mismatch")
} }
return true return true
}) })
f.Iterate(f2.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f2.Blocks[0].Hash, func(folder, file string, index int32) bool {
if folder != "folder1" || file != "f2" || index != 0 { if folder != "folder1" || file != "f2" || index != 0 {
t.Fatal("Mismatch") t.Fatal("Mismatch")
} }
return true return true
}) })
f.Iterate(f3.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f3.Blocks[0].Hash, func(folder, file string, index int32) bool {
t.Fatal("Unexpected block") t.Fatal("Unexpected block")
return true return true
}) })
@ -132,17 +132,17 @@ func TestBlockMapAddUpdateWipe(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index int32) bool {
t.Fatal("Unexpected block") t.Fatal("Unexpected block")
return false return false
}) })
f.Iterate(f2.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f2.Blocks[0].Hash, func(folder, file string, index int32) bool {
t.Fatal("Unexpected block") t.Fatal("Unexpected block")
return false return false
}) })
f.Iterate(f3.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f3.Blocks[0].Hash, func(folder, file string, index int32) bool {
if folder != "folder1" || file != "f3" || index != 0 { if folder != "folder1" || file != "f3" || index != 0 {
t.Fatal("Mismatch") t.Fatal("Mismatch")
} }
@ -189,7 +189,7 @@ func TestBlockFinderLookup(t *testing.T) {
} }
counter := 0 counter := 0
f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index int32) bool {
counter++ counter++
switch counter { switch counter {
case 1: case 1:
@ -217,7 +217,7 @@ func TestBlockFinderLookup(t *testing.T) {
} }
counter = 0 counter = 0
f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index uint32) bool { f.Iterate(f1.Blocks[0].Hash, func(folder, file string, index int32) bool {
counter++ counter++
switch counter { switch counter {
case 1: case 1:
@ -239,7 +239,7 @@ func TestBlockFinderLookup(t *testing.T) {
func TestBlockFinderFix(t *testing.T) { func TestBlockFinderFix(t *testing.T) {
db, f := setup() db, f := setup()
iterFn := func(folder, file string, index uint32) bool { iterFn := func(folder, file string, index int32) bool {
return true return true
} }

View File

@ -34,11 +34,11 @@ import (
) )
var ( var (
clockTick uint64 clockTick int64
clockMut sync.Mutex clockMut sync.Mutex
) )
func clock(v uint64) uint64 { func clock(v int64) int64 {
clockMut.Lock() clockMut.Lock()
defer clockMut.Unlock() defer clockMut.Unlock()
if v > clockTick { if v > clockTick {
@ -56,7 +56,7 @@ const (
) )
type fileVersion struct { type fileVersion struct {
version uint64 version int64
device []byte device []byte
} }
@ -164,9 +164,9 @@ func globalKeyFolder(key []byte) []byte {
return folder[:izero] return folder[:izero]
} }
type deletionHandler func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) uint64 type deletionHandler func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) int64
func ldbGenericReplace(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo, deleteFn deletionHandler) uint64 { func ldbGenericReplace(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo, deleteFn deletionHandler) int64 {
runtime.GC() runtime.GC()
sort.Sort(fileList(fs)) // sort list on name, same as in the database sort.Sort(fileList(fs)) // sort list on name, same as in the database
@ -197,7 +197,7 @@ func ldbGenericReplace(db *leveldb.DB, folder, device []byte, fs []protocol.File
moreDb := dbi.Next() moreDb := dbi.Next()
fsi := 0 fsi := 0
var maxLocalVer uint64 var maxLocalVer int64
for { for {
var newName, oldName []byte var newName, oldName []byte
@ -288,9 +288,9 @@ func ldbGenericReplace(db *leveldb.DB, folder, device []byte, fs []protocol.File
return maxLocalVer return maxLocalVer
} }
func ldbReplace(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) uint64 { func ldbReplace(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) int64 {
// TODO: Return the remaining maxLocalVer? // TODO: Return the remaining maxLocalVer?
return ldbGenericReplace(db, folder, device, fs, func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) uint64 { return ldbGenericReplace(db, folder, device, fs, func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) int64 {
// Database has a file that we are missing. Remove it. // Database has a file that we are missing. Remove it.
if debugDB { if debugDB {
l.Debugf("delete; folder=%q device=%v name=%q", folder, protocol.DeviceIDFromBytes(device), name) l.Debugf("delete; folder=%q device=%v name=%q", folder, protocol.DeviceIDFromBytes(device), name)
@ -304,8 +304,8 @@ func ldbReplace(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) u
}) })
} }
func ldbReplaceWithDelete(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) uint64 { func ldbReplaceWithDelete(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) int64 {
return ldbGenericReplace(db, folder, device, fs, func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) uint64 { return ldbGenericReplace(db, folder, device, fs, func(db dbReader, batch dbWriter, folder, device, name []byte, dbi iterator.Iterator) int64 {
var tf FileInfoTruncated var tf FileInfoTruncated
err := tf.UnmarshalXDR(dbi.Value()) err := tf.UnmarshalXDR(dbi.Value())
if err != nil { if err != nil {
@ -335,7 +335,7 @@ func ldbReplaceWithDelete(db *leveldb.DB, folder, device []byte, fs []protocol.F
}) })
} }
func ldbUpdate(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) uint64 { func ldbUpdate(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) int64 {
runtime.GC() runtime.GC()
batch := new(leveldb.Batch) batch := new(leveldb.Batch)
@ -356,7 +356,7 @@ func ldbUpdate(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) ui
snap.Release() snap.Release()
}() }()
var maxLocalVer uint64 var maxLocalVer int64
for _, f := range fs { for _, f := range fs {
name := []byte(f.Name) name := []byte(f.Name)
fk := deviceKey(folder, device, name) fk := deviceKey(folder, device, name)
@ -406,7 +406,7 @@ func ldbUpdate(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) ui
return maxLocalVer return maxLocalVer
} }
func ldbInsert(batch dbWriter, folder, device []byte, file protocol.FileInfo) uint64 { func ldbInsert(batch dbWriter, folder, device []byte, file protocol.FileInfo) int64 {
if debugDB { if debugDB {
l.Debugf("insert; folder=%q device=%v %v", folder, protocol.DeviceIDFromBytes(device), file) l.Debugf("insert; folder=%q device=%v %v", folder, protocol.DeviceIDFromBytes(device), file)
} }
@ -428,7 +428,7 @@ func ldbInsert(batch dbWriter, folder, device []byte, file protocol.FileInfo) ui
// ldbUpdateGlobal adds this device+version to the version list for the given // ldbUpdateGlobal adds this device+version to the version list for the given
// file. If the device is already present in the list, the version is updated. // file. If the device is already present in the list, the version is updated.
// If the file does not have an entry in the global list, it is created. // If the file does not have an entry in the global list, it is created.
func ldbUpdateGlobal(db dbReader, batch dbWriter, folder, device, file []byte, version uint64) bool { func ldbUpdateGlobal(db dbReader, batch dbWriter, folder, device, file []byte, version int64) bool {
if debugDB { if debugDB {
l.Debugf("update global; folder=%q device=%v file=%q version=%d", folder, protocol.DeviceIDFromBytes(device), file, version) l.Debugf("update global; folder=%q device=%v file=%q version=%d", folder, protocol.DeviceIDFromBytes(device), file, version)
} }
@ -798,7 +798,7 @@ outer:
have := false // If we have the file, any version have := false // If we have the file, any version
need := false // If we have a lower version of the file need := false // If we have a lower version of the file
var haveVersion uint64 var haveVersion int64
for _, v := range vl.versions { for _, v := range vl.versions {
if bytes.Compare(v.device, device) == 0 { if bytes.Compare(v.device, device) == 0 {
have = true have = true

View File

@ -31,7 +31,7 @@ fileVersion Structure:
struct fileVersion { struct fileVersion {
unsigned hyper version; hyper version;
opaque device<>; opaque device<>;
} }
@ -62,7 +62,7 @@ func (o fileVersion) AppendXDR(bs []byte) ([]byte, error) {
} }
func (o fileVersion) encodeXDR(xw *xdr.Writer) (int, error) { func (o fileVersion) encodeXDR(xw *xdr.Writer) (int, error) {
xw.WriteUint64(o.version) xw.WriteUint64(uint64(o.version))
xw.WriteBytes(o.device) xw.WriteBytes(o.device)
return xw.Tot(), xw.Error() return xw.Tot(), xw.Error()
} }
@ -79,7 +79,7 @@ func (o *fileVersion) UnmarshalXDR(bs []byte) error {
} }
func (o *fileVersion) decodeXDR(xr *xdr.Reader) error { func (o *fileVersion) decodeXDR(xr *xdr.Reader) error {
o.version = xr.ReadUint64() o.version = int64(xr.ReadUint64())
o.device = xr.ReadBytes() o.device = xr.ReadBytes()
return xr.Error() return xr.Error()
} }

View File

@ -31,7 +31,7 @@ import (
) )
type FileSet struct { type FileSet struct {
localVersion map[protocol.DeviceID]uint64 localVersion map[protocol.DeviceID]int64
mutex sync.Mutex mutex sync.Mutex
folder string folder string
db *leveldb.DB db *leveldb.DB
@ -56,7 +56,7 @@ type Iterator func(f FileIntf) bool
func NewFileSet(folder string, db *leveldb.DB) *FileSet { func NewFileSet(folder string, db *leveldb.DB) *FileSet {
var s = FileSet{ var s = FileSet{
localVersion: make(map[protocol.DeviceID]uint64), localVersion: make(map[protocol.DeviceID]int64),
folder: folder, folder: folder,
db: db, db: db,
blockmap: NewBlockMap(db, folder), blockmap: NewBlockMap(db, folder),
@ -212,7 +212,7 @@ func (s *FileSet) Availability(file string) []protocol.DeviceID {
return ldbAvailability(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file))) return ldbAvailability(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)))
} }
func (s *FileSet) LocalVersion(device protocol.DeviceID) uint64 { func (s *FileSet) LocalVersion(device protocol.DeviceID) int64 {
s.mutex.Lock() s.mutex.Lock()
defer s.mutex.Unlock() defer s.mutex.Unlock()
return s.localVersion[device] return s.localVersion[device]

View File

@ -43,7 +43,7 @@ func genBlocks(n int) []protocol.BlockInfo {
for j := range h { for j := range h {
h[j] = byte(i + j) h[j] = byte(i + j)
} }
b[i].Size = uint32(i) b[i].Size = int32(i)
b[i].Hash = h b[i].Hash = h
} }
return b return b

View File

@ -29,9 +29,9 @@ type FileInfoTruncated struct {
Name string // max:8192 Name string // max:8192
Flags uint32 Flags uint32
Modified int64 Modified int64
Version uint64 Version int64
LocalVersion uint64 LocalVersion int64
NumBlocks uint32 NumBlocks int32
} }
func (f FileInfoTruncated) String() string { func (f FileInfoTruncated) String() string {
@ -44,7 +44,7 @@ func (f FileInfoTruncated) Size() int64 {
if f.IsDeleted() || f.IsDirectory() { if f.IsDeleted() || f.IsDirectory() {
return 128 return 128
} }
return BlocksToSize(f.NumBlocks) return BlocksToSize(int(f.NumBlocks))
} }
func (f FileInfoTruncated) IsDeleted() bool { func (f FileInfoTruncated) IsDeleted() bool {
@ -67,7 +67,7 @@ func (f FileInfoTruncated) HasPermissionBits() bool {
return f.Flags&protocol.FlagNoPermBits == 0 return f.Flags&protocol.FlagNoPermBits == 0
} }
func BlocksToSize(num uint32) int64 { func BlocksToSize(num int) int64 {
if num < 2 { if num < 2 {
return protocol.BlockSize / 2 return protocol.BlockSize / 2
} }

View File

@ -46,9 +46,9 @@ struct FileInfoTruncated {
string Name<8192>; string Name<8192>;
unsigned int Flags; unsigned int Flags;
hyper Modified; hyper Modified;
unsigned hyper Version; hyper Version;
unsigned hyper LocalVersion; hyper LocalVersion;
unsigned int NumBlocks; int NumBlocks;
} }
*/ */
@ -84,9 +84,9 @@ func (o FileInfoTruncated) encodeXDR(xw *xdr.Writer) (int, error) {
xw.WriteString(o.Name) xw.WriteString(o.Name)
xw.WriteUint32(o.Flags) xw.WriteUint32(o.Flags)
xw.WriteUint64(uint64(o.Modified)) xw.WriteUint64(uint64(o.Modified))
xw.WriteUint64(o.Version) xw.WriteUint64(uint64(o.Version))
xw.WriteUint64(o.LocalVersion) xw.WriteUint64(uint64(o.LocalVersion))
xw.WriteUint32(o.NumBlocks) xw.WriteUint32(uint32(o.NumBlocks))
return xw.Tot(), xw.Error() return xw.Tot(), xw.Error()
} }
@ -105,8 +105,8 @@ func (o *FileInfoTruncated) decodeXDR(xr *xdr.Reader) error {
o.Name = xr.ReadStringMax(8192) o.Name = xr.ReadStringMax(8192)
o.Flags = xr.ReadUint32() o.Flags = xr.ReadUint32()
o.Modified = int64(xr.ReadUint64()) o.Modified = int64(xr.ReadUint64())
o.Version = xr.ReadUint64() o.Version = int64(xr.ReadUint64())
o.LocalVersion = xr.ReadUint64() o.LocalVersion = int64(xr.ReadUint64())
o.NumBlocks = xr.ReadUint32() o.NumBlocks = int32(xr.ReadUint32())
return xr.Error() return xr.Error()
} }

View File

@ -22,7 +22,7 @@ import (
"time" "time"
) )
type EventType uint64 type EventType int
const ( const (
Ping EventType = 1 << iota Ping EventType = 1 << iota

View File

@ -21,11 +21,11 @@ import "sync"
var Default = Clock{} var Default = Clock{}
type Clock struct { type Clock struct {
val uint64 val int64
mut sync.Mutex mut sync.Mutex
} }
func (c *Clock) Tick(v uint64) uint64 { func (c *Clock) Tick(v int64) int64 {
c.mut.Lock() c.mut.Lock()
if v > c.val { if v > c.val {
c.val = v + 1 c.val = v + 1

View File

@ -17,12 +17,12 @@ package lamport
import "testing" import "testing"
var inputs = []uint64{0, 42, 2, 3, 4, 8, 9, 33, 44, 112, 100} var inputs = []int64{0, 42, 2, 3, 4, 8, 9, 33, 44, 112, 100}
func TestClock(t *testing.T) { func TestClock(t *testing.T) {
c := Clock{} c := Clock{}
var prev uint64 var prev int64
for _, input := range inputs { for _, input := range inputs {
cur := c.Tick(input) cur := c.Tick(input)
if cur <= prev || cur <= input { if cur <= prev || cur <= input {

View File

@ -701,6 +701,10 @@ func (m *Model) Close(device protocol.DeviceID, err error) {
// Request returns the specified data segment by reading it from local disk. // Request returns the specified data segment by reading it from local disk.
// Implements the protocol.Model interface. // Implements the protocol.Model interface.
func (m *Model) Request(deviceID protocol.DeviceID, folder, name string, offset int64, size int) ([]byte, error) { func (m *Model) Request(deviceID protocol.DeviceID, folder, name string, offset int64, size int) ([]byte, error) {
if offset < 0 || size < 0 {
return nil, ErrNoSuchFile
}
if !m.folderSharedWith(folder, deviceID) { if !m.folderSharedWith(folder, deviceID) {
l.Warnf("Request from %s for file %s in unshared folder %q", deviceID, name, folder) l.Warnf("Request from %s for file %s in unshared folder %q", deviceID, name, folder)
return nil, ErrNoSuchFile return nil, ErrNoSuchFile
@ -970,12 +974,12 @@ func sendIndexes(conn protocol.Connection, folder string, fs *db.FileSet, ignore
} }
} }
func sendIndexTo(initial bool, minLocalVer uint64, conn protocol.Connection, folder string, fs *db.FileSet, ignores *ignore.Matcher) (uint64, error) { func sendIndexTo(initial bool, minLocalVer int64, conn protocol.Connection, folder string, fs *db.FileSet, ignores *ignore.Matcher) (int64, error) {
deviceID := conn.ID() deviceID := conn.ID()
name := conn.Name() name := conn.Name()
batch := make([]protocol.FileInfo, 0, indexBatchSize) batch := make([]protocol.FileInfo, 0, indexBatchSize)
currentBatchSize := 0 currentBatchSize := 0
maxLocalVer := uint64(0) maxLocalVer := int64(0)
var err error var err error
fs.WithHave(protocol.LocalDeviceID, func(fi db.FileIntf) bool { fs.WithHave(protocol.LocalDeviceID, func(fi db.FileIntf) bool {
@ -1349,7 +1353,7 @@ func (m *Model) Override(folder string) {
// CurrentLocalVersion returns the change version for the given folder. // CurrentLocalVersion returns the change version for the given folder.
// This is guaranteed to increment if the contents of the local folder has // This is guaranteed to increment if the contents of the local folder has
// changed. // changed.
func (m *Model) CurrentLocalVersion(folder string) uint64 { func (m *Model) CurrentLocalVersion(folder string) int64 {
m.fmut.RLock() m.fmut.RLock()
fs, ok := m.folderFiles[folder] fs, ok := m.folderFiles[folder]
m.fmut.RUnlock() m.fmut.RUnlock()
@ -1365,7 +1369,7 @@ func (m *Model) CurrentLocalVersion(folder string) uint64 {
// RemoteLocalVersion returns the change version for the given folder, as // RemoteLocalVersion returns the change version for the given folder, as
// sent by remote peers. This is guaranteed to increment if the contents of // sent by remote peers. This is guaranteed to increment if the contents of
// the remote or global folder has changed. // the remote or global folder has changed.
func (m *Model) RemoteLocalVersion(folder string) uint64 { func (m *Model) RemoteLocalVersion(folder string) int64 {
m.fmut.RLock() m.fmut.RLock()
defer m.fmut.RUnlock() defer m.fmut.RUnlock()
@ -1376,7 +1380,7 @@ func (m *Model) RemoteLocalVersion(folder string) uint64 {
return 0 return 0
} }
var ver uint64 var ver int64
for _, n := range m.folderDevices[folder] { for _, n := range m.folderDevices[folder] {
ver += fs.LocalVersion(n) ver += fs.LocalVersion(n)
} }

View File

@ -110,6 +110,33 @@ func TestRequest(t *testing.T) {
if bs != nil { if bs != nil {
t.Errorf("Unexpected non nil data on insecure file read: %q", string(bs)) t.Errorf("Unexpected non nil data on insecure file read: %q", string(bs))
} }
// Larger block than available
bs, err = m.Request(device1, "default", "foo", 0, 42)
if err == nil {
t.Error("Unexpected nil error on insecure file read")
}
if bs != nil {
t.Errorf("Unexpected non nil data on insecure file read: %q", string(bs))
}
// Negative offset
bs, err = m.Request(device1, "default", "foo", -4, 6)
if err == nil {
t.Error("Unexpected nil error on insecure file read")
}
if bs != nil {
t.Errorf("Unexpected non nil data on insecure file read: %q", string(bs))
}
// Negative size
bs, err = m.Request(device1, "default", "foo", 4, -4)
if err == nil {
t.Error("Unexpected nil error on insecure file read")
}
if bs != nil {
t.Errorf("Unexpected non nil data on insecure file read: %q", string(bs))
}
} }
func genFiles(n int) []protocol.FileInfo { func genFiles(n int) []protocol.FileInfo {

View File

@ -100,7 +100,7 @@ func (p *Puller) Serve() {
p.model.setState(p.folder, FolderIdle) p.model.setState(p.folder, FolderIdle)
}() }()
var prevVer uint64 var prevVer int64
var prevIgnoreHash string var prevIgnoreHash string
// We don't start pulling files until a scan has been completed. // We don't start pulling files until a scan has been completed.
@ -623,9 +623,9 @@ func (p *Puller) handleFile(file protocol.FileInfo, copyChan chan<- copyBlocksSt
folder: p.folder, folder: p.folder,
tempName: tempName, tempName: tempName,
realName: realName, realName: realName,
copyTotal: uint32(len(blocks)), copyTotal: len(blocks),
copyNeeded: uint32(len(blocks)), copyNeeded: len(blocks),
reused: uint32(reused), reused: reused,
} }
if debug { if debug {
@ -720,7 +720,7 @@ func (p *Puller) copierRoutine(in <-chan copyBlocksState, pullChan chan<- pullBl
for _, block := range state.blocks { for _, block := range state.blocks {
buf = buf[:int(block.Size)] buf = buf[:int(block.Size)]
found := p.model.finder.Iterate(block.Hash, func(folder, file string, index uint32) bool { found := p.model.finder.Iterate(block.Hash, func(folder, file string, index int32) bool {
path := filepath.Join(folderRoots[folder], file) path := filepath.Join(folderRoots[folder], file)
var fd *os.File var fd *os.File

View File

@ -199,7 +199,7 @@ func TestCopierFinder(t *testing.T) {
// Update index // Update index
m.updateLocal("default", existingFile) m.updateLocal("default", existingFile)
iterFn := func(folder, file string, index uint32) bool { iterFn := func(folder, file string, index int32) bool {
return true return true
} }
@ -264,7 +264,7 @@ func TestCopierFinder(t *testing.T) {
// Test that updating a file removes it's old blocks from the blockmap // Test that updating a file removes it's old blocks from the blockmap
func TestCopierCleanup(t *testing.T) { func TestCopierCleanup(t *testing.T) {
iterFn := func(folder, file string, index uint32) bool { iterFn := func(folder, file string, index int32) bool {
return true return true
} }
@ -341,7 +341,7 @@ func TestLastResortPulling(t *testing.T) {
// with a different name (causing to copy that particular block) // with a different name (causing to copy that particular block)
file.Name = "newfile" file.Name = "newfile"
iterFn := func(folder, file string, index uint32) bool { iterFn := func(folder, file string, index int32) bool {
return true return true
} }

View File

@ -33,27 +33,27 @@ type sharedPullerState struct {
folder string folder string
tempName string tempName string
realName string realName string
reused uint32 // Number of blocks reused from temporary file reused int // Number of blocks reused from temporary file
// Mutable, must be locked for access // Mutable, must be locked for access
err error // The first error we hit err error // The first error we hit
fd *os.File // The fd of the temp file fd *os.File // The fd of the temp file
copyTotal uint32 // Total number of copy actions for the whole job copyTotal int // Total number of copy actions for the whole job
pullTotal uint32 // Total number of pull actions for the whole job pullTotal int // Total number of pull actions for the whole job
copyOrigin uint32 // Number of blocks copied from the original file copyOrigin int // Number of blocks copied from the original file
copyNeeded uint32 // Number of copy actions still pending copyNeeded int // Number of copy actions still pending
pullNeeded uint32 // Number of block pulls still pending pullNeeded int // Number of block pulls still pending
mut sync.Mutex // Protects the above mut sync.Mutex // Protects the above
} }
// A momentary state representing the progress of the puller // A momentary state representing the progress of the puller
type pullerProgress struct { type pullerProgress struct {
Total uint32 Total int
Reused uint32 Reused int
CopiedFromOrigin uint32 CopiedFromOrigin int
CopiedFromElsewhere uint32 CopiedFromElsewhere int
Pulled uint32 Pulled int
Pulling uint32 Pulling int
BytesDone int64 BytesDone int64
BytesTotal int64 BytesTotal int64
} }

View File

@ -46,7 +46,7 @@ func Blocks(r io.Reader, blocksize int, sizehint int64) ([]protocol.BlockInfo, e
} }
b := protocol.BlockInfo{ b := protocol.BlockInfo{
Size: uint32(n), Size: int32(n),
Offset: offset, Offset: offset,
Hash: hf.Sum(nil), Hash: hf.Sum(nil),
} }