diff --git a/README.md b/README.md index 604712cd2..c8f578fb8 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ This is just a simple prototype. To get to production would need: ## Testing for reals - start router.go on remote server (there's a test project on SD already). if logged in, go build ./src/router; sudo ./router -- iron_worker upload app_worker -- iron_worker queue app_worker +- iron_worker upload sinatra +- iron_worker queue sinatra - ruby client.rb - BOOM! diff --git a/app_worker.worker b/app_worker.worker deleted file mode 100644 index 296e0fe33..000000000 --- a/app_worker.worker +++ /dev/null @@ -1,6 +0,0 @@ -runtime "ruby" - -gem 'rest' -gem 'sinatra' - -exec 'worker.rb' diff --git a/src/router/router.go b/src/router/router.go index f721a87bd..1ce8e399e 100644 --- a/src/router/router.go +++ b/src/router/router.go @@ -32,6 +32,7 @@ func init() { type Route struct { // TODO: Change destinations to a simple cache so it can expire entries after 55 minutes (the one we use in common?) + Host string Destinations []string ProjectId string Token string // store this so we can queue up new workers on demand @@ -71,14 +72,15 @@ func ProxyFunc(w http.ResponseWriter, req *http.Request) { // 3) This host has no active workers so we queue one (or more) up and return a 503 or something with message that says "try again in a minute" route := routingTable[host] // choose random dest - if len(route.Destinations) == 0 { - fmt.Fprintln(w, "No matching routes!") + if route.Host == "" { + fmt.Fprintln(w, "Host not configured!") return } - destUrls := route.Destinations[rand.Intn(len(route.Destinations))] + destIndex := rand.Intn(len(route.Destinations)) + destUrlString := route.Destinations[destIndex] // todo: should check if http:// already exists. - destUrls = "http://" + destUrls - destUrl, err := url.Parse(destUrls) + destUrlString2 := "http://" + destUrlString + destUrl, err := url.Parse(destUrlString2) if err != nil { fmt.Println("error!", err) panic(err) @@ -93,7 +95,12 @@ func ProxyFunc(w http.ResponseWriter, req *http.Request) { w.WriteHeader(http.StatusInternalServerError) // can't figure out how to compare types so comparing strings.... lame. if strings.Contains(etype.String(), "net.OpError") { // == reflect.TypeOf(net.OpError{}) { // couldn't figure out a better way to do this - fmt.Println("It's a network error, so we're going to start new task.") + if len(route.Destinations) > 1 { + fmt.Println("It's a network error, removing this destination from routing table.") + route.Destinations = append(route.Destinations[:destIndex], route.Destinations[destIndex+1:]...) + } else { + fmt.Println("It's a network error and no other destinations available so we're going to start new task.") + } // start new worker payload := map[string]interface{}{ "token": route.Token, @@ -121,7 +128,6 @@ func ProxyFunc(w http.ResponseWriter, req *http.Request) { fmt.Println("Couldn't queue up worker!", err) return } - } // start new worker if it's a connection error return @@ -151,6 +157,7 @@ func AddWorker(w http.ResponseWriter, req *http.Request) { // todo: one cache entry per host domain route := routingTable[r2.Host] fmt.Println("ROUTE:", route) + route.Host = r2.Host route.Destinations = append(route.Destinations, r2.Dest) route.ProjectId = projectId route.Token = token diff --git a/worker.rb b/worker.rb index 2a94b3f0b..5d4ae840b 100644 --- a/worker.rb +++ b/worker.rb @@ -14,7 +14,7 @@ puts "port: #{port}" project_id = params[:project_id] || "4fd2729368a0197d1102056b" # // this is my Default project token = params[:token] || "MWx0VfngzsCu0W8NAYw7S2lNrgo" -code_name = params[:code_name] || "app_worker" +code_name = params[:code_name] || "sinatra" response = rest.post( # "http://localhost:8080/", @@ -23,12 +23,13 @@ response = rest.post( body: {"host"=>"routertest.irondns.info", "dest"=>"#{public_dns}:#{port}"}) puts "body:" puts response.body +puts "\n\n=======\n\n" STDOUT.flush # Now we start the actual worker ##################################################################3 - + ENV['PORT'] = port.to_s # for sinatra my_app = Sinatra.new do set :port, port