aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2017-06-12 10:33:02 +0000
committerFelix Hanley <felix@userspace.com.au>2017-06-12 10:33:02 +0000
commit6bd6035f8356e8c374385ea8ec02e042ec46cda5 (patch)
tree501c7e836e406fabc7c72018b2bd92d79364bc52
parent0d8fb6ef4e85dc113c89e9b137465a1033fa414e (diff)
downloaddhtsearch-6bd6035f8356e8c374385ea8ec02e042ec46cda5.tar.gz
dhtsearch-6bd6035f8356e8c374385ea8ec02e042ec46cda5.tar.bz2
Make kTable thread safe
-rwxr-xr-xdht.go16
-rw-r--r--filter.go3
-rw-r--r--ktable.go40
3 files changed, 41 insertions, 18 deletions
diff --git a/dht.go b/dht.go
index bf498bd..1494027 100755
--- a/dht.go
+++ b/dht.go
@@ -45,7 +45,7 @@ func newDHTNode(address string, port int, p chan<- peer) (node *DHTNode) {
// Get random id for this node
node.id = genInfoHash()
- node.kTable = kTable{make([]*remoteNode, 0)}
+ node.kTable.refresh()
return
}
@@ -142,23 +142,17 @@ func (d *DHTNode) bootstrap() {
func (d *DHTNode) makeNeighbours() {
// TODO configurable
- if len(d.kTable.nodes) < 500 {
+ if !d.kTable.isFull() {
if d.debug {
- fmt.Println("Nodes < 500, making neighbours")
+ fmt.Println("Making neighbours")
}
- if len(d.kTable.nodes) == 0 {
+ if d.kTable.isEmpty() {
d.bootstrap()
} else {
- for _, rn := range d.kTable.nodes {
+ for _, rn := range d.kTable.getNodes() {
d.findNode(rn, rn.id)
}
}
- } else {
- // Refresh the routing table
- if d.debug {
- fmt.Println("Nodes > 500, refreshing kTable")
- }
- d.kTable.refresh()
}
}
diff --git a/filter.go b/filter.go
index 3354132..698a494 100644
--- a/filter.go
+++ b/filter.go
@@ -11,7 +11,7 @@ var tags = map[string]string{
"720": "720",
"hd": "hd|720|1080",
"bdrip": "bdrip",
- "adult": "(xxx|f.ck|p(orn|ussy)|censor|sex|urbat|a(ss|nal)|(di|co)ck|esbian|milf|lust|gay)",
+ "adult": `(xxx|f.ck|p(orn|ussy)|censor|sex|urbat|a(ss|nal)\s|(di|co)ck|esbian|milf|lust|gay)`,
"dvdrip": "dvdrip",
"ebook": "epub",
"application": `\.(apk|exe|msi|dmg)$`,
@@ -22,6 +22,7 @@ var tags = map[string]string{
"video": `\.(3g2|3gp|amv|asf|avi|drc|f4a|f4b|f4p|f4v|flv|gif|gifv|m2v|m4p|m4v|mkv|mng|mov|mp2|mp4|mpe|mpeg|mpg|mpv|mxf|net|nsv|ogv|qt|rm|rmvb|roq|svi|vob|webm|wmv|yuv)$`,
"audio": `\.(aa|aac|aax|act|aiff|amr|ape|au|awb|dct|dss|dvf|flac|gsm|iklax|ivs|m4a|m4b|mmf|mp3|mpc|msv|ogg|opus|ra|raw|sln|tta|vox|wav|wma|wv)$`,
"document": `\.(cbr|cbz|cb7|cbt|cba|epub|djvu|fb2|ibook|azw.|lit|prc|mobi|pdb|pdb|oxps|xps)$`,
+ "font": `(font|\.(ttf|fon)$)`,
}
var tagREs map[string]*regexp.Regexp
diff --git a/ktable.go b/ktable.go
index b559648..b009d92 100644
--- a/ktable.go
+++ b/ktable.go
@@ -1,30 +1,58 @@
package main
-import "fmt"
+import (
+ "fmt"
+ "sync"
+)
-const kTableLimit = 5000
+const kTableLimit = 1000
// Keep it simple for now
type kTable struct {
+ sync.Mutex
nodes []*remoteNode
}
func newKTable() kTable {
- return kTable{make([]*remoteNode, 0)}
+ k := kTable{}
+ k.refresh()
+ return k
}
func (k *kTable) add(rn *remoteNode) {
- if len(k.nodes) >= kTableLimit {
- return
- }
+ k.Lock()
+ defer k.Unlock()
if rn == nil || rn.id == "" {
fmt.Println("Trying to add invalid rn")
return
}
+ if k.isFull() {
+ k.refresh()
+ }
k.nodes = append(k.nodes, rn)
}
+func (k *kTable) getNodes() []*remoteNode {
+ k.Lock()
+ defer k.Unlock()
+ return k.nodes
+}
+
+func (k *kTable) isEmpty() bool {
+ k.Lock()
+ defer k.Unlock()
+ return len(k.nodes) == 0
+}
+
+func (k *kTable) isFull() bool {
+ k.Lock()
+ defer k.Unlock()
+ return len(k.nodes) >= kTableLimit
+}
+
// For now
func (k *kTable) refresh() {
+ k.Lock()
+ defer k.Unlock()
k.nodes = make([]*remoteNode, 0)
}