github.com/qiniu/go-sdk/v7@v7.27.0/internal/uplog/uplog_upload.go (about) 1 package uplog 2 3 import ( 4 "context" 5 "io" 6 "net/http" 7 "os" 8 "path/filepath" 9 "sort" 10 "sync" 11 12 clientv1 "github.com/qiniu/go-sdk/v7/client" 13 ) 14 15 const ( 16 X_LOG_CLIENT_ID = "X-Log-Client-Id" 17 originUplogUrl = "https://uplog.qbox.me" 18 ) 19 20 var ( 21 uplogUrl = originUplogUrl 22 uplogUrlMutex sync.Mutex 23 lastUpToken, xLogClientId string 24 ) 25 26 func uploadUplogLog(archivedPaths []string) error { 27 if getUpToken == nil { 28 return nil 29 } else if newUpToken, err := getUpToken(); err == nil { 30 lastUpToken = newUpToken 31 } 32 33 headers := make(http.Header, 2) 34 headers.Set("Authorization", "UpToken "+lastUpToken) 35 if xLogClientId != "" { 36 headers.Set(X_LOG_CLIENT_ID, xLogClientId) 37 } 38 mfr, err := newMultipleFileReader(archivedPaths) 39 if err != nil { 40 return err 41 } 42 resp, err := clientv1.DefaultClient.DoRequestWithBodyGetter( 43 context.Background(), 44 http.MethodPost, 45 GetUplogUrl()+"/log/4?compressed=gzip", 46 headers, 47 mfr, 48 func() (io.ReadCloser, error) { 49 return newMultipleFileReader(archivedPaths) 50 }, 51 -1, 52 ) 53 if err != nil { 54 return err 55 } 56 if curXLogClientId := resp.Header.Get(X_LOG_CLIENT_ID); curXLogClientId != "" { 57 xLogClientId = curXLogClientId 58 } 59 return clientv1.CallRet(context.Background(), nil, resp) 60 } 61 62 func uploadAllClosedFileBuffers() { 63 fileLock := getUplogFileDirectoryLock() 64 65 if err := fileLock.Lock(); err != nil { 66 return 67 } 68 defer fileLock.Close() 69 70 archivedPaths, err := getArchivedUplogFileBufferPaths(filepath.Dir(fileLock.Path())) 71 if err != nil || len(archivedPaths) == 0 { 72 return 73 } 74 75 if err = uploadUplogLog(archivedPaths); err == nil { 76 for _, archivedPath := range archivedPaths { 77 os.Remove(archivedPath) 78 } 79 } else { 80 sort.Strings(archivedPaths) 81 var ( 82 archivedPathsLen = len(archivedPaths) 83 totalSize uint64 = 0 84 deleteAllRest bool = false 85 ) 86 for i := range archivedPaths { 87 archivedPath := archivedPaths[archivedPathsLen-i-1] 88 if !deleteAllRest { 89 fileInfo, err := os.Stat(archivedPath) 90 if err != nil { 91 return 92 } 93 if totalSize+uint64(fileInfo.Size()) > GetUplogMaxStorageBytes() { 94 deleteAllRest = true 95 } else { 96 totalSize += uint64(fileInfo.Size()) 97 } 98 } 99 if deleteAllRest { 100 os.Remove(archivedPath) 101 } 102 } 103 } 104 } 105 106 func GetUplogUrl() string { 107 uplogUrlMutex.Lock() 108 defer uplogUrlMutex.Unlock() 109 110 return uplogUrl 111 } 112 113 func SetUplogUrl(url string) { 114 uplogUrlMutex.Lock() 115 defer uplogUrlMutex.Unlock() 116 117 if url == "" { 118 url = originUplogUrl 119 } 120 121 uplogUrl = url 122 }