store routerInfos in memory

This commit is contained in:
Matt Drollette
2014-09-13 15:31:22 -05:00
parent 969c0b56b2
commit 2707991b57

View File

@@ -15,6 +15,7 @@ package main
// https://geti2p.net/en/docs/spec/updates // https://geti2p.net/en/docs/spec/updates
import ( import (
"bytes"
"fmt" "fmt"
"github.com/PuerkitoBio/throttled" "github.com/PuerkitoBio/throttled"
"github.com/PuerkitoBio/throttled/store" "github.com/PuerkitoBio/throttled/store"
@@ -32,7 +33,7 @@ import (
) )
const ( const (
LIST_TEMPLATE = `<html><head><title>NetDB</title></head><body><ul>{{ range . }}<li><a href="{{ . }}">{{ . }}</a></li>{{ end }}</ul></body></html>` LIST_TEMPLATE = `<html><head><title>NetDB</title></head><body><ul>{{ range $index, $_ := . }}<li><a href="{{ $index }}">{{ $index }}</a></li>{{ end }}</ul></body></html>`
) )
func proxiedHandler(h http.Handler) http.Handler { func proxiedHandler(h http.Handler) http.Handler {
@@ -106,7 +107,7 @@ func Run(config *Config) {
} }
func NewLegacyReseeder(netdbDir string) *LegacyReseeder { func NewLegacyReseeder(netdbDir string) *LegacyReseeder {
return &LegacyReseeder{netdbDir: netdbDir, nextMap: make(chan []string)} return &LegacyReseeder{netdbDir: netdbDir, nextMap: make(chan map[string][]byte)}
} }
func NewSu3Reseeder(netdbDir string) *Su3Reseeder { func NewSu3Reseeder(netdbDir string) *Su3Reseeder {
@@ -126,14 +127,14 @@ func (rs *Su3Reseeder) Su3Handler(w http.ResponseWriter, r *http.Request) {
} }
type LegacyReseeder struct { type LegacyReseeder struct {
nextMap chan []string nextMap chan map[string][]byte
netdbDir string netdbDir string
listTemplate *template.Template listTemplate *template.Template
} }
func (r *LegacyReseeder) Start(refreshInterval time.Duration) { func (r *LegacyReseeder) Start(refreshInterval time.Duration) {
go func() { go func() {
var m []string var m map[string][]byte
for { for {
select { select {
case m = <-r.nextMap: case m = <-r.nextMap:
@@ -145,7 +146,7 @@ func (r *LegacyReseeder) Start(refreshInterval time.Duration) {
go func() { go func() {
for { for {
log.Println("Updating routerInfos") log.Println("Updating routerInfos")
r.Refresh() r.Refresh(r.netdbDir)
time.Sleep(refreshInterval) time.Sleep(refreshInterval)
} }
}() }()
@@ -159,10 +160,10 @@ func (r *LegacyReseeder) Start(refreshInterval time.Duration) {
} }
} }
func (r *LegacyReseeder) Refresh() { func (r *LegacyReseeder) Refresh(netdbDir string) {
var m []string m := make(map[string][]byte)
src, err := ioutil.ReadDir(r.netdbDir) src, err := ioutil.ReadDir(netdbDir)
if nil != err { if nil != err {
log.Fatalln("error reading netdb dir", err) log.Fatalln("error reading netdb dir", err)
return return
@@ -178,7 +179,19 @@ func (r *LegacyReseeder) Refresh() {
added := 0 added := 0
for _, file := range files { for _, file := range files {
if match, _ := regexp.MatchString("^routerInfo-[A-Za-z0-9-=~]+.dat$", file.Name()); match { if match, _ := regexp.MatchString("^routerInfo-[A-Za-z0-9-=~]+.dat$", file.Name()); match {
m = append(m, file.Name()) fi, err := os.Open(netdbDir + "/" + file.Name())
if err != nil {
log.Println("Error reading routerInfo file", err)
continue
}
fileData, err := ioutil.ReadAll(fi)
if nil != err {
log.Println("Error reading routerInfo file", err)
continue
}
fi.Close()
m[file.Name()] = fileData
added++ added++
} }
if added >= 50 { if added >= 50 {
@@ -199,11 +212,13 @@ func (lr *LegacyReseeder) ListHandler(w http.ResponseWriter, r *http.Request) {
func (rs *LegacyReseeder) RouterInfoHandler(w http.ResponseWriter, r *http.Request) { func (rs *LegacyReseeder) RouterInfoHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r) vars := mux.Vars(r)
fileName := "routerInfo-" + vars["hash"] + ".dat" fileName := "routerInfo-" + vars["hash"] + ".dat"
f, err := os.Open(rs.netdbDir + "/" + fileName)
if nil != err { m := <-rs.nextMap
http.NotFound(w, r) if b, ok := m[fileName]; ok {
log.Println("error sending file", err) io.Copy(w, bytes.NewReader(b))
return return
} }
io.Copy(w, f)
http.NotFound(w, r)
log.Println("error sending file", fileName)
} }