diff --git a/fileserver/fileop.go b/fileserver/fileop.go index f3c7c7a..8083a18 100644 --- a/fileserver/fileop.go +++ b/fileserver/fileop.go @@ -299,6 +299,14 @@ func doFile(rsp http.ResponseWriter, r *http.Request, repo *repomgr.Repo, fileID } } + if operation != "view" { + oper := "web-file-download" + if operation == "download-link" { + oper = "link-file-download" + } + sendStatisticMsg(repo.StoreID, user, oper, file.FileSize) + } + return nil } @@ -446,6 +454,12 @@ func doFileRange(rsp http.ResponseWriter, r *http.Request, repo *repomgr.Repo, f } } + oper := "web-file-download" + if operation == "download-link" { + oper = "link-file-download" + } + sendStatisticMsg(repo.StoreID, user, oper, file.FileSize) + return nil } @@ -632,6 +646,8 @@ func doBlock(rsp http.ResponseWriter, r *http.Request, repo *repomgr.Repo, fileI log.Printf("fatild to write block %s to response: %v", blkID, err) } + sendStatisticMsg(repo.StoreID, user, "web-file-download", uint64(size)) + return nil } @@ -1670,7 +1686,7 @@ func genCommitNeedRetry(repo *repomgr.Repo, base *commitmgr.Commit, commit *comm mergedCommit = commit } - err = updateBranch(repoID, mergedCommit.CommitID, currentHead.CommitID) + err = updateBranch(repoID, mergedCommit.CommitID, currentHead.CommitID, commit.CommitID) if err != nil { return true, nil } @@ -1693,7 +1709,7 @@ func genMergeDesc(repo *repomgr.Repo, mergedRoot, p1Root, p2Root string) string return desc } -func updateBranch(repoID, newCommitID, oldCommitID string) error { +func updateBranch(repoID, newCommitID, oldCommitID, secondParentID string) error { var commitID string name := "master" var sqlStr string @@ -1730,6 +1746,34 @@ func updateBranch(repoID, newCommitID, oldCommitID string) error { trans.Commit() + if secondParentID != "" { + if err := onBranchUpdated(repoID, secondParentID, false); err != nil { + return err + } + } + + if err := onBranchUpdated(repoID, newCommitID, true); err != nil { + return err + } + + return nil +} + +func onBranchUpdated(repoID string, commitID string, updateRepoInfo bool) error { + if updateRepoInfo { + if err := repomgr.UpdateRepoInfo(repoID, commitID); err != nil { + return err + } + } + + isVirtual, err := repomgr.IsVirtualRepo(repoID) + if err != nil { + return err + } + if isVirtual { + return nil + } + publishUpdateEvent(repoID, commitID) return nil } diff --git a/fileserver/repomgr/repomgr.go b/fileserver/repomgr/repomgr.go index 05b67d1..93b0a48 100644 --- a/fileserver/repomgr/repomgr.go +++ b/fileserver/repomgr/repomgr.go @@ -427,8 +427,7 @@ func DelUploadTmpFile(repoID, filePath string) error { return nil } -// SetRepoCommitToDb updates the table of RepoInfo. -func SetRepoCommitToDb(repoID, repoName string, updateTime int64, version int, isEncrypted string, lastModifier string) error { +func setRepoCommitToDb(repoID, repoName string, updateTime int64, version int, isEncrypted string, lastModifier string) error { var exists int var encrypted int @@ -641,3 +640,15 @@ func GetRepoOwner(repoID string) (string, error) { return owner, nil } + +func UpdateRepoInfo(repoID, commitID string) error { + head, err := commitmgr.Load(repoID, commitID) + if err != nil { + err := fmt.Errorf("failed to get commit %s:%s", repoID, commitID) + return err + } + + setRepoCommitToDb(repoID, head.RepoName, head.Ctime, head.Version, head.Encrypted, head.CreatorName) + + return nil +} diff --git a/fileserver/sync_api.go b/fileserver/sync_api.go index 6c1c521..97ff8ed 100644 --- a/fileserver/sync_api.go +++ b/fileserver/sync_api.go @@ -42,6 +42,7 @@ const ( permExpireTime = 7200 virtualRepoExpireTime = 7200 syncAPICleaningIntervalSec = 300 + maxObjectPackSize = 1 << 20 // 1MB ) var ( @@ -473,6 +474,7 @@ func packFSCB(rsp http.ResponseWriter, r *http.Request) *appError { return &appError{nil, err.Error(), http.StatusBadRequest} } + var totalSize int var data bytes.Buffer for i := 0; i < len(fsIDList); i++ { if !isObjectIDValid(fsIDList[i]) { @@ -489,6 +491,11 @@ func packFSCB(rsp http.ResponseWriter, r *http.Request) *appError { binary.BigEndian.PutUint32(tmpLen, uint32(tmp.Len())) data.Write(tmpLen) data.Write(tmp.Bytes()) + + totalSize += tmp.Len() + if totalSize >= maxObjectPackSize { + break + } } rsp.Header().Set("Content-Length", strconv.Itoa(data.Len())) @@ -1128,6 +1135,13 @@ func publishRepoEvent(rData *repoEventData) { } } +func publishUpdateEvent(repoID string, commitID string) { + buf := fmt.Sprintf("repo-update\t%s\t%s", repoID, commitID) + if _, err := rpcclient.Call("publish_event", seafileServerChannelEvent, buf); err != nil { + log.Printf("Failed to publish event: %v", err) + } +} + func removeSyncAPIExpireCache() { deleteTokens := func(key interface{}, value interface{}) bool { if info, ok := value.(*tokenInfo); ok { diff --git a/fileserver/virtual_repo.go b/fileserver/virtual_repo.go index e4b54ff..4a7c4c2 100644 --- a/fileserver/virtual_repo.go +++ b/fileserver/virtual_repo.go @@ -321,24 +321,12 @@ func editRepoNeedRetry(repoID, name, desc, user string) (bool, error) { return false, err } - err = updateBranch(repoID, commit.CommitID, parent.CommitID) + err = updateBranch(repoID, commit.CommitID, parent.CommitID, "") if err != nil { return true, nil } - updateRepoInfo(repoID, commit.CommitID) + repomgr.UpdateRepoInfo(repoID, commit.CommitID) return true, nil } - -func updateRepoInfo(repoID, commitID string) error { - head, err := commitmgr.Load(repoID, commitID) - if err != nil { - err := fmt.Errorf("failed to get commit %s:%s", repoID, commitID) - return err - } - - repomgr.SetRepoCommitToDb(repoID, head.RepoName, head.Ctime, head.Version, head.Encrypted, head.CreatorName) - - return nil -}