From 6bd6035f8356e8c374385ea8ec02e042ec46cda5 Mon Sep 17 00:00:00 2001 From: Felix Hanley Date: Mon, 12 Jun 2017 20:33:02 +1000 Subject: Make kTable thread safe --- dht.go | 16 +++++----------- filter.go | 3 ++- ktable.go | 40 ++++++++++++++++++++++++++++++++++------ 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) } -- cgit v1.2.3