-package sync
+package upload
import (
"strconv"
"time"
+ "github.com/aliyun/aliyun-oss-go-sdk/oss"
log "github.com/sirupsen/logrus"
"github.com/bytom/vapor/protocol/bc/types"
"github.com/bytom/vapor/toolbar/apinode"
- "github.com/bytom/vapor/toolbar/osssync/config"
+ "github.com/bytom/vapor/toolbar/osssync/util"
)
+const LOCALDIR = "./blocks/" // Local directory to store temp blocks files
+
+// Run synchronize upload blocks from vapor to OSS
+func Run() error {
+ uploadKeeper, err := NewUploadKeeper()
+ if err != nil {
+ return err
+ }
+
+ uploadKeeper.Run()
+ return nil
+}
+
+// AddInterval if "info.json" exists on OSS, add Interval to the end; if not exist, create "info.json" with Interval
+func AddInterval(end, gzSize uint64) error {
+ uploadKeeper, err := NewUploadKeeper()
+ if err != nil {
+ return err
+ }
+
+ return uploadKeeper.AddInterval(end, gzSize)
+}
+
// UploadKeeper the struct for upload
type UploadKeeper struct {
- Sync *Sync
- Node *apinode.Node
+ Node *apinode.Node
+ OssClient *oss.Client
+ OssBucket *oss.Bucket
+ FileUtil *util.FileUtil
}
// NewUploadKeeper return one new instance of UploadKeeper
func NewUploadKeeper() (*UploadKeeper, error) {
- cfg := &config.Config{}
- err := config.LoadConfig(&cfg)
+ cfg := &Config{}
+ err := LoadConfig(&cfg)
if err != nil {
return nil, err
}
node := apinode.NewNode(cfg.VaporURL)
- sync, err := NewSync()
+ ossClient, err := oss.New(cfg.OssConfig.Login.Endpoint, cfg.OssConfig.Login.AccessKeyID, cfg.OssConfig.Login.AccessKeySecret)
+ if err != nil {
+ return nil, err
+ }
+
+ ossBucket, err := ossClient.Bucket(cfg.OssConfig.Bucket)
if err != nil {
return nil, err
}
+ fileUtil := util.NewFileUtil(LOCALDIR)
+
return &UploadKeeper{
- Sync: sync,
- Node: node,
+ Node: node,
+ OssClient: ossClient,
+ OssBucket: ossBucket,
+ FileUtil: fileUtil,
}, nil
}
-// RunSyncUp run synchronize upload to OSS
-func (u *UploadKeeper) RunSyncUp() {
+// Run synchronize upload blocks from vapor to OSS
+func (u *UploadKeeper) Run() {
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
// Upload find and upload blocks
func (u *UploadKeeper) Upload() error {
- err := u.Sync.FileUtil.BlockDirInitial()
+ err := u.FileUtil.BlockDirInitial()
if err != nil {
return err
}
return err
}
- infoJson, err := u.Sync.GetInfoJson()
+ infoJson, err := u.GetInfoJson()
if err != nil {
return err
}
// Upload Whole Interval
for latestUp+1 < intervals[pos1].StartBlockHeight {
- if latestUp == 0 {
- err = u.UploadFiles(latestUp, intervals[pos2].EndBlockHeight, intervals[pos2].GzSize)
- } else {
- err = u.UploadFiles(latestUp+1, intervals[pos2].EndBlockHeight, intervals[pos2].GzSize)
- }
+ err = u.UploadFiles(latestUp+1, intervals[pos2].EndBlockHeight, intervals[pos2].GzSize)
if err != nil {
return err
}
// Upload the last Interval
newLatestUp := currBlockHeight - ((currBlockHeight - intervals[pos1].StartBlockHeight) % intervals[pos1].GzSize) - 1
if latestUp < newLatestUp {
- if latestUp == 0 {
- err = u.UploadFiles(latestUp, newLatestUp, intervals[pos1].GzSize)
- } else {
- err = u.UploadFiles(latestUp+1, newLatestUp, intervals[pos1].GzSize)
- }
+ err = u.UploadFiles(latestUp+1, newLatestUp, intervals[pos1].GzSize)
if err != nil {
return err
}
filenameJson := filename + ".json"
filenameGzip := filenameJson + ".gz"
- _, err = u.Sync.FileUtil.SaveBlockFile(filename, blocks)
+ _, err = u.FileUtil.SaveBlockFile(filename, blocks)
if err != nil {
return err
}
- err = u.Sync.FileUtil.GzipCompress(filename)
+ err = u.FileUtil.GzipCompress(filename)
if err != nil {
return err
}
- err = u.Sync.OssBucket.PutObjectFromFile(filenameGzip, u.Sync.FileUtil.LocalDir+"/"+filenameGzip)
+ err = u.OssBucket.PutObjectFromFile(filenameGzip, u.FileUtil.LocalDir+filenameGzip)
if err != nil {
return err
}
- err = u.Sync.SetLatestBlockHeight(start + size - 1)
+ err = u.SetLatestBlockHeight(start + size - 1)
if err != nil {
return err
}
- err = u.Sync.FileUtil.RemoveLocal(filenameJson)
+ err = u.FileUtil.RemoveLocal(filenameJson)
if err != nil {
return err
}
- err = u.Sync.FileUtil.RemoveLocal(filenameGzip)
+ err = u.FileUtil.RemoveLocal(filenameGzip)
if err != nil {
return err
}