You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

121 lines
2.1 KiB

  1. package worker
  2. import (
  3. "io"
  4. "net"
  5. )
  6. // The agent of job server.
  7. type agent struct {
  8. conn net.Conn
  9. worker *Worker
  10. in chan []byte
  11. net, addr string
  12. }
  13. // Create the agent of job server.
  14. func newAgent(net, addr string, worker *Worker) (a *agent, err error) {
  15. a = &agent{
  16. net: net,
  17. addr: addr,
  18. worker: worker,
  19. in: make(chan []byte, QUEUE_SIZE),
  20. }
  21. return
  22. }
  23. func (a *agent) Connect() (err error) {
  24. a.conn, err = net.Dial(a.net, a.addr)
  25. if err != nil {
  26. return
  27. }
  28. go a.work()
  29. return
  30. }
  31. func (a *agent) work() {
  32. var inpack *inPack
  33. var l int
  34. var err error
  35. var data, leftdata []byte
  36. for {
  37. if data, err = a.read(BUFFER_SIZE); err != nil {
  38. if err == ErrConnClosed {
  39. break
  40. }
  41. a.worker.err(err)
  42. continue
  43. }
  44. if len(leftdata) > 0 { // some data left for processing
  45. data = append(leftdata, data...)
  46. }
  47. if len(data) < MIN_PACKET_LEN { // not enough data
  48. leftdata = data
  49. continue
  50. }
  51. if inpack, l, err = decodeInPack(data); err != nil {
  52. a.worker.err(err)
  53. continue
  54. }
  55. leftdata = nil
  56. inpack.a = a
  57. a.worker.in <- inpack
  58. if len(data) > l {
  59. leftdata = data[l:]
  60. }
  61. }
  62. }
  63. func (a *agent) Close() {
  64. a.conn.Close()
  65. }
  66. func (a *agent) Grab() {
  67. outpack := getOutPack()
  68. outpack.dataType = GRAB_JOB_UNIQ
  69. a.write(outpack)
  70. }
  71. func (a *agent) PreSleep() {
  72. outpack := getOutPack()
  73. outpack.dataType = PRE_SLEEP
  74. a.write(outpack)
  75. }
  76. // read length bytes from the socket
  77. func (a *agent) read(length int) (data []byte, err error) {
  78. n := 0
  79. buf := getBuffer(BUFFER_SIZE)
  80. // read until data can be unpacked
  81. for i := length; i > 0 || len(data) < MIN_PACKET_LEN; i -= n {
  82. if n, err = a.conn.Read(buf); err != nil {
  83. if err == io.EOF && n == 0 {
  84. if data == nil {
  85. err = ErrConnection
  86. } else {
  87. err = ErrConnClosed
  88. }
  89. }
  90. return
  91. }
  92. data = append(data, buf[0:n]...)
  93. if n < BUFFER_SIZE {
  94. break
  95. }
  96. }
  97. return
  98. }
  99. // Internal write the encoded job.
  100. func (a *agent) write(outpack *outPack) (err error) {
  101. var n int
  102. buf := outpack.Encode()
  103. for i := 0; i < len(buf); i += n {
  104. n, err = a.conn.Write(buf[i:])
  105. if err != nil {
  106. return err
  107. }
  108. }
  109. return
  110. }