Add "cluster introducer" functionality to nodes (ref #120)

This commit is contained in:
Jakob Borg committed 2014-09-23 16:04:20 +02:00
1 parent 24e5000c37
commit e596a45e9f
9 files changed
+133 -17

No files matched your search

+3 -3
View File
@@ -27,7 +27,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["angular/angular.min.js"] = bs
bs, _ = base64.StdEncoding.DecodeString("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 truncated
bs, _ = base64.StdEncoding.DecodeString("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 truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["app.js"] = bs
@@ -92,7 +92,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["img/logo-text-64.png"] = bs
bs, _ = base64.StdEncoding.DecodeString("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 truncated
bs, _ = base64.StdEncoding.DecodeString("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 truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["index.html"] = bs
@@ -132,7 +132,7 @@ func Assets() map[string][]byte {
bs, _ = ioutil.ReadAll(gr)
assets["lang/lang-el.json"] = bs
bs, _ = base64.StdEncoding.DecodeString("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")
bs, _ = base64.StdEncoding.DecodeString("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")
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
assets["lang/lang-en.json"] = bs
+12 -2
View File
@@ -101,6 +101,7 @@ type NodeConfiguration struct {
Addresses []string `xml:"address,omitempty"`
Compression bool `xml:"compression,attr"`
CertName string `xml:"certName,attr,omitempty"`
Introducer bool `xml:"introducer,attr"`
}
type RepositoryNodeConfiguration struct {
@@ -153,15 +154,24 @@ func (cfg *Configuration) NodeMap() map[protocol.NodeID]NodeConfiguration {
return m
}
func (cfg *Configuration) GetNodeConfiguration(nodeid protocol.NodeID) *NodeConfiguration {
func (cfg *Configuration) GetNodeConfiguration(nodeID protocol.NodeID) *NodeConfiguration {
for i, node := range cfg.Nodes {
if node.NodeID == nodeid {
if node.NodeID == nodeID {
return &cfg.Nodes[i]
}
}
return nil
}
func (cfg *Configuration) GetRepoConfiguration(repoID string) *RepositoryConfiguration {
for i, repo := range cfg.Repositories {
if repo.ID == repoID {
return &cfg.Repositories[i]
}
}
return nil
}
func (cfg *Configuration) RepoMap() map[string]RepositoryConfiguration {
m := make(map[string]RepositoryConfiguration, len(cfg.Repositories))
for _, r := range cfg.Repositories {
+2 -1
View File
@@ -666,7 +666,8 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http, $translate, $loca
$scope.addNode = function () {
$scope.currentNode = {
AddressesStr: 'dynamic',
Compression: true
Compression: true,
Introducer: true
};
$scope.editingExisting = false;
$scope.editingSelf = false;
+14
View File
@@ -260,6 +260,11 @@
<td translate ng-if="nodeCfg.Compression" class="text-right">Yes</td>
<td translate ng-if="!nodeCfg.Compression" class="text-right">No</td>
</tr>
<tr>
<th><span class="glyphicon glyphicon-thumbs-up"></span>&emsp;<span translate>Introducer</span></th>
<td translate ng-if="nodeCfg.Introducer" class="text-right">Yes</td>
<td translate ng-if="!nodeCfg.Introducer" class="text-right">No</td>
</tr>
<tr ng-if="connections[nodeCfg.NodeID]">
<th><span class="glyphicon glyphicon-tag"></span>&emsp;<span translate>Version</span></th>
<td class="text-right">{{connections[nodeCfg.NodeID].ClientVersion}}</td>
@@ -388,6 +393,15 @@
<label>
<input type="checkbox" ng-model="currentNode.Compression"> <span translate>Use Compression</span>
</label>
<p translate class="help-block">Compression is recommended in most setups.</p>
</div>
</div>
<div ng-if="!editingSelf" class="form-group">
<div class="checkbox">
<label>
<input type="checkbox" ng-model="currentNode.Introducer"> <span translate>Introducer</span>
</label>
<p translate class="help-block">Any nodes configured on an introducer node will be added to this node as well.</p>
</div>
</div>
</form>
+3
View File
@@ -8,10 +8,12 @@
"Allow Anonymous Usage Reporting?": "Allow Anonymous Usage Reporting?",
"Announce Server": "Announce Server",
"Anonymous Usage Reporting": "Anonymous Usage Reporting",
"Any nodes configured on an introducer node will be added to this node as well.": "Any nodes configured on an introducer node will be added to this node as well.",
"Bugs": "Bugs",
"CPU Utilization": "CPU Utilization",
"Close": "Close",
"Comment, when used at the start of a line": "Comment, when used at the start of a line",
"Compression is recommended in most setups.": "Compression is recommended in most setups.",
"Connection Error": "Connection Error",
"Copyright © 2014 Jakob Borg and the following Contributors:": "Copyright © 2014 Jakob Borg and the following Contributors:",
"Delete": "Delete",
@@ -42,6 +44,7 @@
"Ignore Patterns": "Ignore Patterns",
"Ignore Permissions": "Ignore Permissions",
"Incoming Rate Limit (KiB/s)": "Incoming Rate Limit (KiB/s)",
"Introducer": "Introducer",
"Inversion of the given condition (i.e. do not exclude)": "Inversion of the given condition (i.e. do not exclude)",
"Keep Versions": "Keep Versions",
"Last seen": "Last seen",
+79 -8
View File
@@ -437,18 +437,18 @@ func (m *Model) repoSharedWith(repo string, nodeID protocol.NodeID) bool {
return false
}
func (m *Model) ClusterConfig(nodeID protocol.NodeID, config protocol.ClusterConfigMessage) {
func (m *Model) ClusterConfig(nodeID protocol.NodeID, cm protocol.ClusterConfigMessage) {
m.pmut.Lock()
if config.ClientName == "syncthing" {
m.nodeVer[nodeID] = config.ClientVersion
if cm.ClientName == "syncthing" {
m.nodeVer[nodeID] = cm.ClientVersion
} else {
m.nodeVer[nodeID] = config.ClientName + " " + config.ClientVersion
m.nodeVer[nodeID] = cm.ClientName + " " + cm.ClientVersion
}
m.pmut.Unlock()
l.Infof(`Node %s client is "%s %s"`, nodeID, config.ClientName, config.ClientVersion)
l.Infof(`Node %s client is "%s %s"`, nodeID, cm.ClientName, cm.ClientVersion)
if name := config.GetOption("name"); name != "" {
if name := cm.GetOption("name"); name != "" {
l.Infof("Node %s hostname is %q", nodeID, name)
node := m.cfg.GetNodeConfiguration(nodeID)
if node != nil && node.Name == "" {
@@ -456,6 +456,73 @@ func (m *Model) ClusterConfig(nodeID protocol.NodeID, config protocol.ClusterCon
m.cfg.Save()
}
}
if m.cfg.GetNodeConfiguration(nodeID).Introducer {
// This node is an introducer. Go through the announced lists of repos
// and nodes and add what we are missing.
var changed bool
for _, repo := range cm.Repositories {
// If we don't have this repository yet, skip it. Ideally, we'd
// offer up something in the GUI to create the repo, but for the
// moment we only handle repos that we already have.
if _, ok := m.repoNodes[repo.ID]; !ok {
continue
}
nextNode:
for _, node := range repo.Nodes {
var id protocol.NodeID
copy(id[:], node.ID)
if _, ok := m.nodeRepos[id]; !ok {
// The node is currently unknown. Add it to the config.
l.Infof("Adding node %v to config (vouched for by introducer %v)", id, nodeID)
newNodeCfg := config.NodeConfiguration{
NodeID: id,
}
// The introducers' introducers are also our introducers.
if node.Flags&protocol.FlagIntroducer != 0 {
l.Infof("Node %v is now also an introducer", id)
newNodeCfg.Introducer = true
}
m.cfg.Nodes = append(m.cfg.Nodes, newNodeCfg)
changed = true
}
for _, er := range m.nodeRepos[id] {
if er == repo.ID {
// We already share the repo with this node, so
// nothing to do.
continue nextNode
}
}
// We don't yet share this repo with this node. Add the node
// to sharing list of the repo.
l.Infof("Adding node %v to share %q (vouched for by introducer %v)", id, repo.ID, nodeID)
m.nodeRepos[id] = append(m.nodeRepos[id], repo.ID)
m.repoNodes[repo.ID] = append(m.repoNodes[repo.ID], id)
repoCfg := m.cfg.GetRepoConfiguration(repo.ID)
repoCfg.Nodes = append(repoCfg.Nodes, config.RepositoryNodeConfiguration{
NodeID: id,
})
changed = true
}
}
if changed {
m.cfg.Save()
}
}
}
// Close removes the peer from the model and closes the underlying connection if possible.
@@ -1030,10 +1097,14 @@ func (m *Model) clusterConfig(node protocol.NodeID) protocol.ClusterConfigMessag
// so we don't grab aliases to the same array later on in node[:]
node := node
// TODO: Set read only bit when relevant
cr.Nodes = append(cr.Nodes, protocol.Node{
cn := protocol.Node{
ID: node[:],
Flags: protocol.FlagShareTrusted,
})
}
if nodeCfg := m.cfg.GetNodeConfiguration(node); nodeCfg.Introducer {
cn.Flags |= protocol.FlagIntroducer
}
cr.Nodes = append(cr.Nodes, cn)
}
cm.Repositories = append(cm.Repositories, cr)
}
+14 -1
View File
@@ -306,7 +306,8 @@ func TestClusterConfig(t *testing.T) {
cfg := config.New("/tmp/test", node1)
cfg.Nodes = []config.NodeConfiguration{
{
NodeID: node1,
NodeID: node1,
Introducer: true,
},
{
NodeID: node2,
@@ -351,9 +352,15 @@ func TestClusterConfig(t *testing.T) {
if id := r.Nodes[0].ID; bytes.Compare(id, node1[:]) != 0 {
t.Errorf("Incorrect node ID %x != %x", id, node1)
}
if r.Nodes[0].Flags&protocol.FlagIntroducer == 0 {
t.Error("Node1 should be flagged as Introducer")
}
if id := r.Nodes[1].ID; bytes.Compare(id, node2[:]) != 0 {
t.Errorf("Incorrect node ID %x != %x", id, node2)
}
if r.Nodes[1].Flags&protocol.FlagIntroducer != 0 {
t.Error("Node2 should not be flagged as Introducer")
}
r = cm.Repositories[1]
if r.ID != "repo2" {
@@ -365,9 +372,15 @@ func TestClusterConfig(t *testing.T) {
if id := r.Nodes[0].ID; bytes.Compare(id, node1[:]) != 0 {
t.Errorf("Incorrect node ID %x != %x", id, node1)
}
if r.Nodes[0].Flags&protocol.FlagIntroducer == 0 {
t.Error("Node1 should be flagged as Introducer")
}
if id := r.Nodes[1].ID; bytes.Compare(id, node2[:]) != 0 {
t.Errorf("Incorrect node ID %x != %x", id, node2)
}
if r.Nodes[1].Flags&protocol.FlagIntroducer != 0 {
t.Error("Node2 should not be flagged as Introducer")
}
}
func TestIgnores(t *testing.T) {
+5 -2
View File
@@ -249,7 +249,7 @@ The Node Flags field contains the following single bit flags:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |Pri| Reserved |R|T|
| Reserved |Pri| Reserved |I|R|T|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Bit 31 ("T", Trusted) is set for nodes that participate in trusted
@@ -258,6 +258,9 @@ The Node Flags field contains the following single bit flags:
- Bit 30 ("R", Read Only) is set for nodes that participate in read
only mode.
- Bit 29 ("I", Introducer) is set for nodes that are trusted as cluster
introducers.
- Bits 16 through 28 are reserved and MUST be set to zero.
- Bits 14-15 ("Pri) indicate the node's upload priority for this
@@ -276,7 +279,7 @@ The Node Flags field contains the following single bit flags:
- Bits 0 through 14 are reserved and MUST be set to zero.
Exactly one of the T, R or S bits MUST be set.
Exactly one of the T and R bits MUST be set.
The per node Max Local Version field contains the highest local file
version number of the files already known to be in the index sent by
+1
View File
@@ -47,6 +47,7 @@ const (
const (
FlagShareTrusted uint32 = 1 << 0
FlagShareReadOnly = 1 << 1
FlagIntroducer = 1 << 2
FlagShareBits = 0x000000ff
)