diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 8bee6263f..3a0aeedca 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -31,7 +31,7 @@ }, { "ImportPath": "github.com/syncthing/protocol", - "Rev": "cd0cce4195105cefab80fce84664188b614032e8" + "Rev": "108b4e2e104610bdf416f2f156f35ee769276caf" }, { "ImportPath": "github.com/syndtr/goleveldb/leveldb", diff --git a/Godeps/_workspace/src/github.com/syncthing/protocol/compression.go b/Godeps/_workspace/src/github.com/syncthing/protocol/compression.go new file mode 100644 index 000000000..9e17213b6 --- /dev/null +++ b/Godeps/_workspace/src/github.com/syncthing/protocol/compression.go @@ -0,0 +1,53 @@ +// Copyright (C) 2015 The Protocol Authors. + +package protocol + +import "fmt" + +type Compression int + +const ( + CompressMetadata Compression = iota // zero value is the default, default should be "metadata" + CompressNever + CompressAlways + + compressionThreshold = 128 // don't bother compressing messages smaller than this many bytes +) + +var compressionMarshal = map[Compression]string{ + CompressNever: "never", + CompressMetadata: "metadata", + CompressAlways: "always", +} + +var compressionUnmarshal = map[string]Compression{ + // Legacy + "false": CompressNever, + "true": CompressMetadata, + + // Current + "never": CompressNever, + "metadata": CompressMetadata, + "always": CompressAlways, +} + +func (c Compression) String() string { + s, ok := compressionMarshal[c] + if !ok { + return fmt.Sprintf("unknown:%d", c) + } + return s +} + +func (c Compression) GoString() string { + return fmt.Sprintf("%q", c.String()) +} + +func (c Compression) MarshalText() ([]byte, error) { + return []byte(compressionMarshal[c]), nil +} + +func (c *Compression) UnmarshalText(bs []byte) error { + *c = compressionUnmarshal[string(bs)] + return nil +} diff --git a/Godeps/_workspace/src/github.com/syncthing/protocol/compression_test.go b/Godeps/_workspace/src/github.com/syncthing/protocol/compression_test.go new file mode 100644 index 000000000..932297c32 --- /dev/null +++ b/Godeps/_workspace/src/github.com/syncthing/protocol/compression_test.go @@ -0,0 +1,51 @@ +// Copyright (C) 2015 The Protocol Authors. + +package protocol + +import "testing" + +func TestCompressionMarshal(t *testing.T) { + uTestcases := []struct { + s string + c Compression + }{ + {"true", CompressMetadata}, + {"false", CompressNever}, + {"never", CompressNever}, + {"metadata", CompressMetadata}, + {"filedata", CompressFiledata}, + {"always", CompressAlways}, + {"whatever", CompressNever}, + } + + mTestcases := []struct { + s string + c Compression + }{ + {"never", CompressNever}, + {"metadata", CompressMetadata}, + {"filedata", CompressFiledata}, + {"always", CompressAlways}, + } + + var c Compression + for _, tc := range uTestcases { + err := c.UnmarshalText([]byte(tc.s)) + if err != nil { + t.Error(err) + } + if c != tc.c { + t.Errorf("%s unmarshalled to %d, not %d", tc.s, c, tc.c) + } + } + + for _, tc := range mTestcases { + bs, err := tc.c.MarshalText() + if err != nil { + t.Error(err) + } + if s := string(bs); s != tc.s { + t.Errorf("%d marshalled to %q, not %q", tc.c, s, tc.s) + } + } +} diff --git a/Godeps/_workspace/src/github.com/syncthing/protocol/protocol.go b/Godeps/_workspace/src/github.com/syncthing/protocol/protocol.go index f5c34dbff..e7b6fe275 100644 --- a/Godeps/_workspace/src/github.com/syncthing/protocol/protocol.go +++ b/Godeps/_workspace/src/github.com/syncthing/protocol/protocol.go @@ -106,7 +106,7 @@ type rawConnection struct { closed chan struct{} once sync.Once - compressionThreshold int // compress messages larger than this many bytes + compression Compression rdbuf0 []byte // used & reused by readMessage rdbuf1 []byte // used & reused by readMessage @@ -135,25 +135,21 @@ const ( pingIdleTime = 60 * time.Second ) -func NewConnection(deviceID DeviceID, reader io.Reader, writer io.Writer, receiver Model, name string, compress bool) Connection { +func NewConnection(deviceID DeviceID, reader io.Reader, writer io.Writer, receiver Model, name string, compress Compression) Connection { cr := &countingReader{Reader: reader} cw := &countingWriter{Writer: writer} - compThres := 1<<31 - 1 // compression disabled - if compress { - compThres = 128 // compress messages that are 128 bytes long or larger - } c := rawConnection{ - id: deviceID, - name: name, - receiver: nativeModel{receiver}, - state: stateInitial, - cr: cr, - cw: cw, - outbox: make(chan hdrMsg), - nextID: make(chan int), - closed: make(chan struct{}), - compressionThreshold: compThres, + id: deviceID, + name: name, + receiver: nativeModel{receiver}, + state: stateInitial, + cr: cr, + cw: cw, + outbox: make(chan hdrMsg), + nextID: make(chan int), + closed: make(chan struct{}), + compression: compress, } go c.readerLoop() @@ -571,7 +567,15 @@ func (c *rawConnection) writerLoop() { return } - if len(uncBuf) >= c.compressionThreshold { + compress := false + switch c.compression { + case CompressAlways: + compress = true + case CompressMetadata: + compress = hm.hdr.msgType != messageTypeResponse + } + + if compress && len(uncBuf) >= compressionThreshold { // Use compression for large messages hm.hdr.compression = true diff --git a/Godeps/_workspace/src/github.com/syncthing/protocol/protocol_test.go b/Godeps/_workspace/src/github.com/syncthing/protocol/protocol_test.go index 1ccb4525f..c1048cdcf 100644 --- a/Godeps/_workspace/src/github.com/syncthing/protocol/protocol_test.go +++ b/Godeps/_workspace/src/github.com/syncthing/protocol/protocol_test.go @@ -67,8 +67,8 @@ func TestPing(t *testing.T) { ar, aw := io.Pipe() br, bw := io.Pipe() - c0 := NewConnection(c0ID, ar, bw, nil, "name", true).(wireFormatConnection).next.(*rawConnection) - c1 := NewConnection(c1ID, br, aw, nil, "name", true).(wireFormatConnection).next.(*rawConnection) + c0 := NewConnection(c0ID, ar, bw, nil, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) + c1 := NewConnection(c1ID, br, aw, nil, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) if ok := c0.ping(); !ok { t.Error("c0 ping failed") @@ -91,8 +91,8 @@ func TestPingErr(t *testing.T) { eaw := &ErrPipe{PipeWriter: *aw, max: i, err: e} ebw := &ErrPipe{PipeWriter: *bw, max: j, err: e} - c0 := NewConnection(c0ID, ar, ebw, m0, "name", true).(wireFormatConnection).next.(*rawConnection) - NewConnection(c1ID, br, eaw, m1, "name", true) + c0 := NewConnection(c0ID, ar, ebw, m0, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) + NewConnection(c1ID, br, eaw, m1, "name", CompressAlways) res := c0.ping() if (i < 8 || j < 8) && res { @@ -167,8 +167,8 @@ func TestVersionErr(t *testing.T) { ar, aw := io.Pipe() br, bw := io.Pipe() - c0 := NewConnection(c0ID, ar, bw, m0, "name", true).(wireFormatConnection).next.(*rawConnection) - NewConnection(c1ID, br, aw, m1, "name", true) + c0 := NewConnection(c0ID, ar, bw, m0, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) + NewConnection(c1ID, br, aw, m1, "name", CompressAlways) w := xdr.NewWriter(c0.cw) w.WriteUint32(encodeHeader(header{ @@ -190,8 +190,8 @@ func TestTypeErr(t *testing.T) { ar, aw := io.Pipe() br, bw := io.Pipe() - c0 := NewConnection(c0ID, ar, bw, m0, "name", true).(wireFormatConnection).next.(*rawConnection) - NewConnection(c1ID, br, aw, m1, "name", true) + c0 := NewConnection(c0ID, ar, bw, m0, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) + NewConnection(c1ID, br, aw, m1, "name", CompressAlways) w := xdr.NewWriter(c0.cw) w.WriteUint32(encodeHeader(header{ @@ -213,8 +213,8 @@ func TestClose(t *testing.T) { ar, aw := io.Pipe() br, bw := io.Pipe() - c0 := NewConnection(c0ID, ar, bw, m0, "name", true).(wireFormatConnection).next.(*rawConnection) - NewConnection(c1ID, br, aw, m1, "name", true) + c0 := NewConnection(c0ID, ar, bw, m0, "name", CompressAlways).(wireFormatConnection).next.(*rawConnection) + NewConnection(c1ID, br, aw, m1, "name", CompressAlways) c0.close(nil) diff --git a/gui/assets/lang/lang-en.json b/gui/assets/lang/lang-en.json index 4964d6f30..d3e76379b 100644 --- a/gui/assets/lang/lang-en.json +++ b/gui/assets/lang/lang-en.json @@ -7,6 +7,7 @@ "Add new folder?": "Add new folder?", "Address": "Address", "Addresses": "Addresses", + "All Data": "All Data", "Allow Anonymous Usage Reporting?": "Allow Anonymous Usage Reporting?", "Anonymous Usage Reporting": "Anonymous Usage Reporting", "Any devices configured on an introducer device will be added to this device as well.": "Any devices configured on an introducer device will be added to this device as well.", @@ -16,6 +17,7 @@ "Changelog": "Changelog", "Close": "Close", "Comment, when used at the start of a line": "Comment, when used at the start of a line", + "Compression": "Compression", "Compression is recommended in most setups.": "Compression is recommended in most setups.", "Connection Error": "Connection Error", "Copied from elsewhere": "Copied from elsewhere", @@ -71,6 +73,7 @@ "Local Discovery": "Local Discovery", "Local State": "Local State", "Maximum Age": "Maximum Age", + "Metadata Only": "Metadata Only", "Move to top of queue": "Move to top of queue", "Multi level wildcard (matches multiple directory levels)": "Multi level wildcard (matches multiple directory levels)", "Never": "Never", @@ -80,6 +83,7 @@ "No File Versioning": "No File Versioning", "Notice": "Notice", "OK": "OK", + "Off": "Off", "Offline": "Offline", "Online": "Online", "Out Of Sync": "Out Of Sync", diff --git a/gui/index.html b/gui/index.html index a7d450304..b76086681 100644 --- a/gui/index.html +++ b/gui/index.html @@ -370,9 +370,12 @@ Address {{deviceAddr(deviceCfg)}} - - Use Compression - No + + Compression + + All Data + Off + Introducer @@ -502,12 +505,12 @@

Enter comma separated "ip:port" addresses or "dynamic" to perform automatic discovery of the address.

-
- -

Compression is recommended in most setups.

-
+ +
diff --git a/gui/scripts/syncthing/core/controllers/syncthingController.js b/gui/scripts/syncthing/core/controllers/syncthingController.js index f8de3f4e4..2a6e75207 100644 --- a/gui/scripts/syncthing/core/controllers/syncthingController.js +++ b/gui/scripts/syncthing/core/controllers/syncthingController.js @@ -713,7 +713,7 @@ angular.module('syncthing.core') .then(function () { $scope.currentDevice = { AddressesStr: 'dynamic', - Compression: true, + Compression: 'metadata', Introducer: false, selectedFolders: {} }; @@ -758,7 +758,7 @@ angular.module('syncthing.core') var deviceCfg = { DeviceID: device, AddressesStr: 'dynamic', - Compression: true, + Compression: 'metadata', Introducer: false, selectedFolders: {} }; diff --git a/internal/auto/gui.files.go b/internal/auto/gui.files.go index c6b37bb55..fec08c24e 100644 --- a/internal/auto/gui.files.go +++ b/internal/auto/gui.files.go @@ -177,7 +177,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["assets/lang/valid-langs.js"] = bs - bs, _ = base64.StdEncoding.DecodeString("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") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewReader(bs)) bs, _ = ioutil.ReadAll(gr) assets["index.html"] = bs @@ -197,7 +197,7 @@ func Assets() map[string][]byte { bs, _ = ioutil.ReadAll(gr) assets["scripts/syncthing/core/controllers/eventController.js"] = bs - bs, _ = base64.StdEncoding.DecodeString("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") + bs, _ = base64.StdEncoding.DecodeString("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") gr, _ = gzip.NewReader(bytes.NewReader(bs)) bs, _ = ioutil.ReadAll(gr) assets["scripts/syncthing/core/controllers/syncthingController.js"] = bs diff --git a/internal/config/config.go b/internal/config/config.go index 9d163e8ad..f36b51d98 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -36,7 +36,7 @@ import ( var l = logger.DefaultLogger -const CurrentVersion = 8 +const CurrentVersion = 9 type Configuration struct { Version int `xml:"version,attr"` @@ -146,12 +146,12 @@ func (c *VersioningConfiguration) UnmarshalXML(d *xml.Decoder, start xml.StartEl } type DeviceConfiguration struct { - DeviceID protocol.DeviceID `xml:"id,attr"` - Name string `xml:"name,attr,omitempty"` - Addresses []string `xml:"address,omitempty"` - Compression bool `xml:"compression,attr"` - CertName string `xml:"certName,attr,omitempty"` - Introducer bool `xml:"introducer,attr"` + DeviceID protocol.DeviceID `xml:"id,attr"` + Name string `xml:"name,attr,omitempty"` + Addresses []string `xml:"address,omitempty"` + Compression protocol.Compression `xml:"compression,attr"` + CertName string `xml:"certName,attr,omitempty"` + Introducer bool `xml:"introducer,attr"` } type FolderDeviceConfiguration struct { @@ -320,6 +320,9 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) { if cfg.Version == 7 { convertV7V8(cfg) } + if cfg.Version == 8 { + convertV8V9(cfg) + } // Hash old cleartext passwords if len(cfg.GUI.Password) > 0 && cfg.GUI.Password[0] != '$' { @@ -411,6 +414,13 @@ func ChangeRequiresRestart(from, to Configuration) bool { return false } +func convertV8V9(cfg *Configuration) { + // Compression is interpreted and serialized differently, but no enforced + // changes. Still need a new version number since the compression stuff + // isn't understandable by earlier versions. + cfg.Version = 9 +} + func convertV7V8(cfg *Configuration) { // Add IPv6 announce server if len(cfg.Options.GlobalAnnServers) == 1 && cfg.Options.GlobalAnnServers[0] == "udp4://announce.syncthing.net:22026" { @@ -498,7 +508,7 @@ func convertV2V3(cfg *Configuration) { // compression on all existing new. New devices will get compression on by // default by the GUI. for i := range cfg.Deprecated_Nodes { - cfg.Deprecated_Nodes[i].Compression = true + cfg.Deprecated_Nodes[i].Compression = protocol.CompressMetadata } // The global discovery format and port number changed in v0.9. Having the diff --git a/internal/config/config_test.go b/internal/config/config_test.go index a5bc68eaa..1e2443515 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -99,13 +99,13 @@ func TestDeviceConfig(t *testing.T) { DeviceID: device1, Name: "node one", Addresses: []string{"a"}, - Compression: true, + Compression: protocol.CompressMetadata, }, { DeviceID: device4, Name: "node two", Addresses: []string{"b"}, - Compression: true, + Compression: protocol.CompressMetadata, }, } expectedDeviceIDs := []protocol.DeviceID{device1, device4} @@ -176,24 +176,22 @@ func TestDeviceAddressesDynamic(t *testing.T) { name, _ := os.Hostname() expected := map[protocol.DeviceID]DeviceConfiguration{ device1: { - DeviceID: device1, - Addresses: []string{"dynamic"}, - Compression: true, + DeviceID: device1, + Addresses: []string{"dynamic"}, }, device2: { - DeviceID: device2, - Addresses: []string{"dynamic"}, - Compression: true, + DeviceID: device2, + Addresses: []string{"dynamic"}, }, device3: { - DeviceID: device3, - Addresses: []string{"dynamic"}, - Compression: true, + DeviceID: device3, + Addresses: []string{"dynamic"}, }, device4: { - DeviceID: device4, - Name: name, // Set when auto created - Addresses: []string{"dynamic"}, + DeviceID: device4, + Name: name, // Set when auto created + Addresses: []string{"dynamic"}, + Compression: protocol.CompressMetadata, }, } @@ -208,6 +206,43 @@ func TestDeviceAddressesDynamic(t *testing.T) { } } +func TestDeviceCompression(t *testing.T) { + name, _ := os.Hostname() + expected := map[protocol.DeviceID]DeviceConfiguration{ + device1: { + DeviceID: device1, + Addresses: []string{"dynamic"}, + Compression: protocol.CompressMetadata, + }, + device2: { + DeviceID: device2, + Addresses: []string{"dynamic"}, + Compression: protocol.CompressMetadata, + }, + device3: { + DeviceID: device3, + Addresses: []string{"dynamic"}, + Compression: protocol.CompressNever, + }, + device4: { + DeviceID: device4, + Name: name, // Set when auto created + Addresses: []string{"dynamic"}, + Compression: protocol.CompressMetadata, + }, + } + + cfg, err := Load("testdata/devicecompression.xml", device4) + if err != nil { + t.Error(err) + } + + actual := cfg.Devices() + if !reflect.DeepEqual(actual, expected) { + t.Errorf("Devices differ;\n E: %#v\n A: %#v", expected, actual) + } +} + func TestDeviceAddressesStatic(t *testing.T) { name, _ := os.Hostname() expected := map[protocol.DeviceID]DeviceConfiguration{ @@ -224,9 +259,10 @@ func TestDeviceAddressesStatic(t *testing.T) { Addresses: []string{"[2001:db8::44]:4444", "192.0.2.4:6090"}, }, device4: { - DeviceID: device4, - Name: name, // Set when auto created - Addresses: []string{"dynamic"}, + DeviceID: device4, + Name: name, // Set when auto created + Addresses: []string{"dynamic"}, + Compression: protocol.CompressMetadata, }, } diff --git a/internal/config/testdata/devicecompression.xml b/internal/config/testdata/devicecompression.xml new file mode 100644 index 000000000..f0a6d7ea1 --- /dev/null +++ b/internal/config/testdata/devicecompression.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/internal/config/testdata/v9.xml b/internal/config/testdata/v9.xml new file mode 100644 index 000000000..f8ff9a565 --- /dev/null +++ b/internal/config/testdata/v9.xml @@ -0,0 +1,12 @@ + + + + + + +
a
+
+ +
b
+
+