Skip to content

Commit

Permalink
add experimental server scheduler
Browse files Browse the repository at this point in the history
  • Loading branch information
clowwindy committed Jul 2, 2012
1 parent 119af83 commit d5ade33
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 34 deletions.
38 changes: 20 additions & 18 deletions local.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions scheduler.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 15 additions & 14 deletions src/local.coffee
Expand Up @@ -34,6 +34,7 @@ inetAton = (ipStr) ->
buf

fs = require("fs")
scheduler = require('./scheduler')
configContent = fs.readFileSync("config.json")
config = JSON.parse(configContent)
SERVER = config.server
Expand All @@ -42,11 +43,9 @@ PORT = config.local_port
KEY = config.password
timeout = Math.floor(config.timeout * 1000)

myScheduler = new scheduler.Scheduler SERVER
getServer = ->
if SERVER instanceof Array
SERVER[Math.floor(Math.random() * SERVER.length)]
else
SERVER
myScheduler.getServer()

net = require("net")
encrypt = require("./encrypt")
Expand All @@ -56,7 +55,7 @@ encryptTable = tables[0]
decryptTable = tables[1]

server = net.createServer((connection) ->
console.log "server connected"
console.log "local connected"
console.log "concurrent connections: " + server.connections
stage = 0
headerLength = 0
Expand All @@ -66,6 +65,7 @@ server = net.createServer((connection) ->
remoteAddr = null
remotePort = null
addrToSend = ""
serverUsing = getServer()
connection.on "data", (data) ->
if stage is 5
# pipe sockets
Expand Down Expand Up @@ -118,9 +118,8 @@ server = net.createServer((connection) ->
buf.writeInt16BE remotePort, 8
connection.write buf
# connect remote server
aServer = getServer()
remote = net.connect(REMOTE_PORT, aServer, ->
console.log "connecting #{remoteAddr} via #{aServer}"
remote = net.connect(REMOTE_PORT, serverUsing, ->
console.log "connecting #{remoteAddr} via #{serverUsing}"
addrToSendBuf = new Buffer(addrToSend, "binary")
encrypt.encrypt encryptTable, addrToSendBuf
remote.write addrToSendBuf
Expand All @@ -144,12 +143,13 @@ server = net.createServer((connection) ->
console.log "concurrent connections: " + server.connections

remote.on "error", ->
myScheduler.serverFailed(serverUsing)
if stage is 4
console.warn "remote connection refused"
connection.destroy()
return
console.warn "remote error"
connection.end()
else
console.warn "remote error"
connection.end()
console.log "concurrent connections: " + server.connections

remote.on "drain", ->
Expand All @@ -176,12 +176,13 @@ server = net.createServer((connection) ->
# make sure no data is lost

connection.on "end", ->
console.log "server disconnected"
remote.destroy() if remote
myScheduler.serverSucceeded(serverUsing)
console.log "local disconnected"
remote.end() if remote
console.log "concurrent connections: " + server.connections

connection.on "error", ->
console.warn "server error"
console.warn "local error"
remote.destroy() if remote
console.log "concurrent connections: " + server.connections

Expand Down
40 changes: 40 additions & 0 deletions src/scheduler.coffee
@@ -0,0 +1,40 @@

class Scheduler
constructor: (servers) ->
if servers instanceof Array
this._servers = servers
else
this._servers = [servers]

_servers: []
_failureCount: {}
_successCount: {}
_ping: {}

toString: ->
"[" + this._servers.join(',') + "]"

_increaseCounter: (counter, key) ->
if key of counter
counter[key]++
else
counter[key] = 1

serverFailed: (server) ->
console.log "#{server} failed"
this._increaseCounter(this._failureCount, server)

serverSucceeded: (server) ->
console.log "#{server} succeeded"
this._increaseCounter(this._successCount, server)

updatePing: (server, ping)->
if server of _ping
_ping[server] = ping
else
_ping[server] = (_ping[server] * 0.8 + ping * 0.2)

getServer: ->
this._servers[Math.floor(Math.random() * this._servers.length)]

exports.Scheduler = Scheduler
2 changes: 1 addition & 1 deletion src/server.coffee
Expand Up @@ -136,7 +136,7 @@ server = net.createServer((connection) ->

connection.on "end", ->
console.log "server disconnected"
remote.destroy() if remote
remote.end() if remote
console.log "concurrent connections: " + server.connections

connection.on "error", ->
Expand Down

0 comments on commit d5ade33

Please sign in to comment.