GeezerVison is showing github.com — DHT.FindNeighbor add ServerRole filter · CovenantSQL/CovenantSQL@252876c
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: consistent/consistent.go +10-5Lines changed: 10 additions & 5 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -277,7 +277,7 @@ func (c *Consistent) GetTwoNeighbors(name string) (proto.Node, proto.Node, error | 277 | 277 | } | 278 | 278 |
| 279 | 279 | // GetNeighborsEx returns the N closest distinct nodes to the name input in the circle. | 280 | | -func (c *Consistent) GetNeighborsEx(name string, n int, roles []proto.ServerRole) ([]proto.Node, error) { | | 280 | +func (c *Consistent) GetNeighborsEx(name string, n int, roles proto.ServerRoles) ([]proto.Node, error) { | 281 | 281 | c.RLock() | 282 | 282 | defer c.RUnlock() | 283 | 283 |
| @@ -296,10 +296,13 @@ func (c *Consistent) GetNeighborsEx(name string, n int, roles []proto.ServerRole | 296 | 296 | res = make([]proto.Node, 0, n) | 297 | 297 | elem = *c.circle[c.sortedHashes[i]] | 298 | 298 | ) | | 299 | + var noFilter = roles == nil || len(roles) == 0 | 299 | 300 |
| 300 | | - res = append(res, elem) | | 301 | + if noFilter || roles.Contains(elem.Role) { | | 302 | + res = append(res, elem) | | 303 | + } | 301 | 304 |
| 302 | | - if len(res) == n { | | 305 | + if noFilter && len(res) == n { | 303 | 306 | return res, nil | 304 | 307 | } | 305 | 308 |
| @@ -308,8 +311,10 @@ func (c *Consistent) GetNeighborsEx(name string, n int, roles []proto.ServerRole | 308 | 311 | i = 0 | 309 | 312 | } | 310 | 313 | elem = *c.circle[c.sortedHashes[i]] | 311 | | - if !sliceContainsMember(res, elem) { | 312 | | - res = append(res, elem) | | 314 | + if noFilter || roles.Contains(elem.Role) { | | 315 | + if !sliceContainsMember(res, elem) { | | 316 | + res = append(res, elem) | | 317 | + } | 313 | 318 | } | 314 | 319 | if len(res) == n { | 315 | 320 | break | |
Collapse file Copy file name to clipboardExpand all lines: consistent/consistent_test.go +38Lines changed: 38 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -454,6 +454,44 @@ func TestGetN(t *testing.T) { | 454 | 454 | } | 455 | 455 | } | 456 | 456 |
| | 457 | +func TestGetNFilterRole(t *testing.T) { | | 458 | + kms.Unittest = true | | 459 | + os.Remove(testStorePath) | | 460 | + kms.ResetBucket() | | 461 | + | | 462 | + x, _ := InitConsistent(testStorePath, new(KMSStorage), false) | | 463 | + defer os.Remove(testStorePath) | | 464 | + n := NewNodeFromID("abcdefg") | | 465 | + n.Role = Leader | | 466 | + x.Add(n) | | 467 | + x.Add(NewNodeFromID("hijklmn")) | | 468 | + x.Add(NewNodeFromID("opqrstu")) | | 469 | + members, err := x.GetNeighborsEx("9999999", 3, ServerRoles{Unknown}) | | 470 | + if err != nil { | | 471 | + t.Fatal(err) | | 472 | + } | | 473 | + if len(members) != 2 { | | 474 | + t.Errorf("expected 3 members instead of %d", len(members)) | | 475 | + } | | 476 | + if members[0].ID != "opqrstu" { | | 477 | + t.Errorf("wrong members[0]: %v", members[0]) | | 478 | + } | | 479 | + if members[1].ID != "hijklmn" { | | 480 | + t.Errorf("wrong members[1]: %v", members[1]) | | 481 | + } | | 482 | + | | 483 | + members, err = x.GetNeighborsEx("9999999", 3, ServerRoles{Leader, Follower}) | | 484 | + if err != nil { | | 485 | + t.Fatal(err) | | 486 | + } | | 487 | + if len(members) != 1 { | | 488 | + t.Errorf("expected 3 members instead of %d", len(members)) | | 489 | + } | | 490 | + if members[0].ID != "abcdefg" { | | 491 | + t.Errorf("wrong members[0]: %v", members[0]) | | 492 | + } | | 493 | +} | | 494 | + | 457 | 495 | func TestGetNLess(t *testing.T) { | 458 | 496 | kms.Unittest = true | 459 | 497 | os.Remove(testStorePath) | |
Collapse file Copy file name to clipboardExpand all lines: proto/nodeinfo.go +12Lines changed: 12 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -199,3 +199,15 @@ func parseServerRole(roleStr string) (role ServerRole, err error) { | 199 | 199 |
| 200 | 200 | return Unknown, nil | 201 | 201 | } | | 202 | + | | 203 | +type ServerRoles []ServerRole | | 204 | + | | 205 | +// Contains returns if given role is in the ServerRoles | | 206 | +func (ss *ServerRoles) Contains(role ServerRole) bool { | | 207 | + for _, s := range *ss { | | 208 | + if s == role { | | 209 | + return true | | 210 | + } | | 211 | + } | | 212 | + return false | | 213 | +} |
Collapse file Copy file name to clipboardExpand all lines: proto/nodeinfo_test.go +12Lines changed: 12 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -66,6 +66,18 @@ func TestNodeKey_Less(t *testing.T) { | 66 | 66 | }) | 67 | 67 | } | 68 | 68 |
| | 69 | +func TestServerRoles_Contains(t *testing.T) { | | 70 | + Convey("ServerRoles Contains", t, func() { | | 71 | + ss := make(ServerRoles, 0) | | 72 | + | | 73 | + So(ss.Contains(Follower), ShouldBeFalse) | | 74 | + So(ss.Contains(Unknown), ShouldBeFalse) | | 75 | + ss = append(ss, Leader) | | 76 | + ss = append(ss, Follower) | | 77 | + So(ss.Contains(Leader), ShouldBeTrue) | | 78 | + }) | | 79 | +} | | 80 | + | 69 | 81 | func unmarshalAndMarshal(str string) string { | 70 | 82 | var role ServerRole | 71 | 83 | yaml.Unmarshal([]byte(str), &role) | |
Collapse file Copy file name to clipboardExpand all lines: route/service_test.go +22Lines changed: 22 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -97,6 +97,7 @@ func TestDHTService_FindNeighbor_FindNode(t *testing.T) { | 97 | 97 | node1 := NewNode() | 98 | 98 | node1.InitNodeCryptoInfo(100 * time.Millisecond) | 99 | 99 | node1.Addr = "node1 addr" | | 100 | + node1.Role = Miner | 100 | 101 |
| 101 | 102 | reqA := &PingReq{ | 102 | 103 | Node: *node1, | @@ -158,6 +159,27 @@ func TestDHTService_FindNeighbor_FindNode(t *testing.T) { | 158 | 159 | So(nodeIDList, ShouldContain, string(node2.ID)) | 159 | 160 | }) | 160 | 161 |
| | 162 | + req = &FindNeighborReq{ | | 163 | + NodeID: "123", | | 164 | + Count: 10, | | 165 | + Roles: ServerRoles{Miner}, | | 166 | + } | | 167 | + resp = new(FindNeighborResp) | | 168 | + err = client.Call("DHT.FindNeighbor", req, resp) | | 169 | + if err != nil { | | 170 | + log.Error(err) | | 171 | + } | | 172 | + log.Debugf("resp filter: %v", resp) | | 173 | + nodeIDList = make([]string, 0) | | 174 | + for _, n := range resp.Nodes[:] { | | 175 | + nodeIDList = append(nodeIDList, string(n.ID)) | | 176 | + } | | 177 | + log.Debugf("nodeIDList filter: %v", nodeIDList) | | 178 | + Convey("test FindNeighbor", t, func() { | | 179 | + So(nodeIDList, ShouldContain, string(node1.ID)) | | 180 | + So(nodeIDList, ShouldNotContain, string(node2.ID)) | | 181 | + }) | | 182 | + | 161 | 183 | reqFN3 := &FindNodeReq{ | 162 | 184 | NodeID: node2.ID, | 163 | 185 | } | |
|