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.

agent.go 2.1 KiB

11 jaren geleden
10 jaren geleden
11 jaren geleden
10 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
12 jaren geleden
10 jaren geleden
12 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
10 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
11 jaren geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. }