1818package loader
1919
2020import (
21+ "doris-streamloader/report"
2122 "encoding/json"
2223 "fmt"
2324 "io"
2425 "io/ioutil"
2526 "net/http"
27+ "strconv"
2628 "strings"
2729 "sync"
2830 "sync/atomic"
@@ -31,7 +33,6 @@ import (
3133
3234 "github.com/pierrec/lz4/v4"
3335 log "github.com/sirupsen/logrus"
34- "doris-streamloader/report"
3536)
3637
3738type StreamLoadOption struct {
@@ -143,7 +144,7 @@ func (s *StreamLoad) createUrl() string {
143144}
144145
145146// stream load create http request with string data
146- func (s * StreamLoad ) createRequest (url string , reader io.Reader ) (req * http.Request , err error ) {
147+ func (s * StreamLoad ) createRequest (url string , reader io.Reader , workerIndex int , taskIndex int ) (req * http.Request , err error ) {
147148 req , err = http .NewRequest ("PUT" , url , reader )
148149 if err != nil {
149150 return
@@ -155,6 +156,19 @@ func (s *StreamLoad) createRequest(url string, reader io.Reader) (req *http.Requ
155156 req .Header .Set ("Content-Type" , "text/plain" )
156157 for k , v := range s .headers {
157158 req .Header .Set (k , v )
159+ // If a label has already been set in the headers, to prevent conflicts,
160+ //generate a unique label by combining the original label, worker index, and task index.
161+ if k == "label" {
162+ var builder strings.Builder
163+ builder .WriteString (v )
164+ builder .WriteString ("_" )
165+ builder .WriteString (strconv .Itoa (workerIndex ))
166+ builder .WriteString ("_" )
167+ builder .WriteString (strconv .Itoa (taskIndex ))
168+
169+ req .Header .Set ("label" , builder .String ())
170+ }
171+
158172 }
159173
160174 if s .Compress {
@@ -228,10 +242,10 @@ func (s *StreamLoad) readData(isEOS *atomic.Bool, rawWriter *io.PipeWriter, read
228242 }
229243}
230244
231- func (s * StreamLoad ) send (url string , reader io.Reader ) (* http.Response , error ) {
245+ func (s * StreamLoad ) send (url string , reader io.Reader , workerIndex int , taskIndex int ) (* http.Response , error ) {
232246 realUrl := url
233247 for {
234- req , err := s .createRequest (realUrl , reader )
248+ req , err := s .createRequest (realUrl , reader , workerIndex , taskIndex )
235249 if err != nil {
236250 if req == nil {
237251 return nil , err
@@ -347,7 +361,7 @@ func (s *StreamLoad) executeGetAndSend(maxRowsPerTask int, maxBytesPerTask int,
347361 workerIndex : workerIndex ,
348362 taskIndex : taskIndex ,
349363 })
350- if resp , err := s .send (url , NopCloser (pr )); err != nil {
364+ if resp , err := s .send (url , NopCloser (pr ), workerIndex , taskIndex ); err != nil {
351365 s .handleSendError (workerIndex , taskIndex )
352366 log .Errorf ("Send error, resp: %v error message: %v" , resp , err )
353367 return
0 commit comments