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  }