| @@ -2,13 +2,13 @@ package models | |||||
| import ( | import ( | ||||
| "errors" | "errors" | ||||
| "fmt" | |||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | |||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | |||||
| "gorm.io/gorm" | |||||
| "log" | "log" | ||||
| "strconv" | "strconv" | ||||
| "time" | "time" | ||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | |||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | |||||
| "gorm.io/gorm" | |||||
| ) | ) | ||||
| type BlockDistribution struct { | type BlockDistribution struct { | ||||
| @@ -95,98 +95,93 @@ type BlockDistributionWatcher struct { | |||||
| } | } | ||||
| func (w *BlockDistributionWatcher) OnEvent(event sysevent.SysEvent) { | func (w *BlockDistributionWatcher) OnEvent(event sysevent.SysEvent) { | ||||
| body, ok := event.Body.(*stgmod.BodyBlockDistribution) | |||||
| if !ok { | |||||
| return | |||||
| } | |||||
| repoObject := NewObjectRepository(DB) | repoObject := NewObjectRepository(DB) | ||||
| repoBlock := NewBlockDistributionRepository(DB) | repoBlock := NewBlockDistributionRepository(DB) | ||||
| repoStorage := NewStorageTransferCountRepository(DB) | repoStorage := NewStorageTransferCountRepository(DB) | ||||
| if event.Category == "blockDistribution" { | |||||
| if blockDistribution, ok := event.Body.(*stgmod.BodyBlockDistribution); ok { | |||||
| //更新object表中的状态 | |||||
| object, err := repoObject.GetObjectByID(int64(blockDistribution.Object.ObjectID)) | |||||
| faultTolerance, _ := strconv.ParseFloat(blockDistribution.Object.FaultTolerance, 64) | |||||
| redundancy, _ := strconv.ParseFloat(blockDistribution.Object.Redundancy, 64) | |||||
| avgAccessCost, _ := strconv.ParseFloat(blockDistribution.Object.AvgAccessCost, 64) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err := repoObject.CreateObject(&Object{ | |||||
| ObjectID: blockDistribution.Object.ObjectID, | |||||
| PackageID: blockDistribution.Object.PackageID, | |||||
| Path: blockDistribution.Object.Path, | |||||
| Size: blockDistribution.Object.Size, | |||||
| FileHash: blockDistribution.Object.FileHash, | |||||
| Status: StatusYesterdayAfter, | |||||
| FaultTolerance: faultTolerance, | |||||
| Redundancy: redundancy, | |||||
| AvgAccessCost: avgAccessCost, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create object: %v", err) | |||||
| } | |||||
| } else { | |||||
| object.Status = StatusYesterdayAfter | |||||
| err = repoObject.UpdateObject(object) | |||||
| if err != nil { | |||||
| log.Printf("Error update object: %v", err) | |||||
| } | |||||
| } | |||||
| //更新object表中的状态 | |||||
| object, err := repoObject.GetObjectByID(int64(body.ObjectID)) | |||||
| faultTolerance, _ := strconv.ParseFloat(body.FaultTolerance, 64) | |||||
| redundancy, _ := strconv.ParseFloat(body.Redundancy, 64) | |||||
| avgAccessCost, _ := strconv.ParseFloat(body.AvgAccessCost, 64) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err := repoObject.CreateObject(&Object{ | |||||
| ObjectID: body.ObjectID, | |||||
| PackageID: body.PackageID, | |||||
| Path: body.Path, | |||||
| Size: body.Size, | |||||
| FileHash: body.FileHash, | |||||
| Status: StatusYesterdayAfter, | |||||
| FaultTolerance: faultTolerance, | |||||
| Redundancy: redundancy, | |||||
| AvgAccessCost: avgAccessCost, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create object: %v", err) | |||||
| } | |||||
| } else { | |||||
| object.Status = StatusYesterdayAfter | |||||
| err = repoObject.UpdateObject(object) | |||||
| if err != nil { | |||||
| log.Printf("Error update object: %v", err) | |||||
| } | |||||
| } | |||||
| //更新block表中的状态 | |||||
| for _, blockDist := range blockDistribution.Object.BlockDistribution { | |||||
| blockIndex, _ := strconv.ParseInt(blockDist.Index, 10, 64) | |||||
| blockStorageID, _ := strconv.ParseInt(blockDist.StorageID, 10, 64) | |||||
| blockDist, err := repoBlock.GetBlockDistributionByIndex(int64(blockDistribution.Object.ObjectID), blockIndex, blockStorageID) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err := repoBlock.CreateBlockDistribution(&BlockDistribution{ | |||||
| BlockID: blockDist.BlockID, | |||||
| ObjectID: blockDist.ObjectID, | |||||
| Type: blockDist.Type, | |||||
| Index: blockIndex, | |||||
| StorageID: blockStorageID, | |||||
| Status: StatusYesterdayAfter, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create BlockDistribution: %v", err) | |||||
| } | |||||
| } else { | |||||
| err := repoBlock.UpdateBlockDistribution(&BlockDistribution{ | |||||
| BlockID: blockDist.BlockID, | |||||
| ObjectID: blockDist.ObjectID, | |||||
| Type: blockDist.Type, | |||||
| Index: blockIndex, | |||||
| StorageID: blockStorageID, | |||||
| Status: StatusYesterdayAfter, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error update BlockDistribution: %v", err) | |||||
| } | |||||
| } | |||||
| } | |||||
| //在storageTransferCount表中添加记录 | |||||
| for _, dataTransfer := range blockDistribution.Object.DataTransfers { | |||||
| sourceStorageID, _ := strconv.ParseInt(string(dataTransfer.SourceStorageID), 10, 64) | |||||
| targetStorageID, _ := strconv.ParseInt(string(dataTransfer.TargetStorageID), 10, 64) | |||||
| dataTransferCount, _ := strconv.ParseInt(dataTransfer.DataTransferCount, 10, 64) | |||||
| err := repoStorage.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: int64(blockDistribution.Object.ObjectID), | |||||
| Status: StatusTodayBeforeYesterday, | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: dataTransferCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | |||||
| //更新block表中的状态 | |||||
| for _, blockDist := range body.BlockDistribution { | |||||
| blockIndex, _ := strconv.ParseInt(blockDist.Index, 10, 64) | |||||
| blockStorageID, _ := strconv.ParseInt(blockDist.StorageID, 10, 64) | |||||
| blockDist, err := repoBlock.GetBlockDistributionByIndex(int64(body.ObjectID), blockIndex, blockStorageID) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err := repoBlock.CreateBlockDistribution(&BlockDistribution{ | |||||
| BlockID: blockDist.BlockID, | |||||
| ObjectID: blockDist.ObjectID, | |||||
| Type: blockDist.Type, | |||||
| Index: blockIndex, | |||||
| StorageID: blockStorageID, | |||||
| Status: StatusYesterdayAfter, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create BlockDistribution: %v", err) | |||||
| } | } | ||||
| } else { | } else { | ||||
| fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body) | |||||
| err := repoBlock.UpdateBlockDistribution(&BlockDistribution{ | |||||
| BlockID: blockDist.BlockID, | |||||
| ObjectID: blockDist.ObjectID, | |||||
| Type: blockDist.Type, | |||||
| Index: blockIndex, | |||||
| StorageID: blockStorageID, | |||||
| Status: StatusYesterdayAfter, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error update BlockDistribution: %v", err) | |||||
| } | |||||
| } | |||||
| } | |||||
| //在storageTransferCount表中添加记录 | |||||
| for _, dataTransfer := range body.DataTransfers { | |||||
| sourceStorageID, _ := strconv.ParseInt(string(dataTransfer.SourceStorageID), 10, 64) | |||||
| targetStorageID, _ := strconv.ParseInt(string(dataTransfer.TargetStorageID), 10, 64) | |||||
| dataTransferCount, _ := strconv.ParseInt(dataTransfer.DataTransferCount, 10, 64) | |||||
| err := repoStorage.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: int64(body.ObjectID), | |||||
| Status: StatusTodayBeforeYesterday, | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: dataTransferCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | } | ||||
| } else { | |||||
| fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,14 +2,14 @@ package models | |||||
| import ( | import ( | ||||
| "errors" | "errors" | ||||
| "fmt" | |||||
| "log" | |||||
| "strconv" | |||||
| "time" | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | stgmod "gitlink.org.cn/cloudream/storage/common/models" | ||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | ||||
| "gorm.io/gorm" | "gorm.io/gorm" | ||||
| "log" | |||||
| "strconv" | |||||
| "time" | |||||
| ) | ) | ||||
| type StorageTransferCount struct { | type StorageTransferCount struct { | ||||
| @@ -75,165 +75,160 @@ type BlockTransferWatcher struct { | |||||
| } | } | ||||
| func (w *BlockTransferWatcher) OnEvent(event sysevent.SysEvent) { | func (w *BlockTransferWatcher) OnEvent(event sysevent.SysEvent) { | ||||
| body, ok := event.Body.(*stgmod.BodyBlockTransfer) | |||||
| if !ok { | |||||
| return | |||||
| } | |||||
| repoDist := NewBlockDistributionRepository(DB) | repoDist := NewBlockDistributionRepository(DB) | ||||
| repoStorage := NewStorageRepository(DB) | repoStorage := NewStorageRepository(DB) | ||||
| repoStorageTrans := NewStorageTransferCountRepository(DB) | repoStorageTrans := NewStorageTransferCountRepository(DB) | ||||
| repoObject := NewObjectRepository(DB) | repoObject := NewObjectRepository(DB) | ||||
| if event.Category == "blockTransfer" { | |||||
| if blockTransfer, ok := event.Body.(*stgmod.BodyBlockTransfer); ok { | |||||
| for _, change := range blockTransfer.BlockChanges { | |||||
| objectID, _ := strconv.ParseInt(string(blockTransfer.ObjectID), 10, 64) | |||||
| object, _ := repoObject.GetObjectByID(objectID) | |||||
| index, _ := strconv.ParseInt(change.Index, 10, 64) | |||||
| sourceStorageID, _ := strconv.ParseInt(string(change.SourceStorageID), 10, 64) | |||||
| targetStorageID, _ := strconv.ParseInt(string(change.TargetStorageID), 10, 64) | |||||
| newDataCount, _ := strconv.ParseInt(change.DataTransferCount, 10, 64) | |||||
| switch change.Type { | |||||
| case "0": //拷贝 | |||||
| //查询出存储在数据库中的BlockDistribution信息 | |||||
| blockSource, errSource := repoDist.GetBlockDistributionByIndex(objectID, index, sourceStorageID) | |||||
| //没有记录就将source和target的信息都保存到库中 | |||||
| if errors.Is(errSource, gorm.ErrRecordNotFound) { | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: objectID, | |||||
| Type: change.BlockType, | |||||
| Index: index, | |||||
| StorageID: sourceStorageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create source blockdistribution: %v", err) | |||||
| } | |||||
| } else { | |||||
| //有数据则新增一条storageID为targetStorageID的记录,同时更新状态 | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: blockSource.ObjectID, | |||||
| Type: change.BlockType, | |||||
| Index: index, | |||||
| StorageID: targetStorageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error update blockdistribution: %v", err) | |||||
| } | |||||
| //复制完成之后增加的dataCount要加到targetStorage的记录中 | |||||
| storageOld, err := repoStorage.GetStorageByID(targetStorageID) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err = repoStorage.CreateStorage(&Storage{ | |||||
| StorageID: cdssdk.StorageID(targetStorageID), | |||||
| DataCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error increase datacount in targetstorage: %v", err) | |||||
| } | |||||
| } else { | |||||
| err = repoStorage.UpdateStorage(&Storage{ | |||||
| StorageID: cdssdk.StorageID(targetStorageID), | |||||
| DataCount: storageOld.DataCount + newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error increase datacount in targetstorage: %v", err) | |||||
| } | |||||
| } | |||||
| } | |||||
| //新增记录到storageTransferCount表中 | |||||
| err := repoStorageTrans.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: objectID, | |||||
| Status: int64(blockSource.Status), | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| for _, change := range body.BlockChanges { | |||||
| objectID, _ := strconv.ParseInt(string(body.ObjectID), 10, 64) | |||||
| object, _ := repoObject.GetObjectByID(objectID) | |||||
| // index, _ := strconv.ParseInt(change.Index, 10, 64) | |||||
| // sourceStorageID, _ := strconv.ParseInt(string(change.SourceStorageID), 10, 64) | |||||
| // targetStorageID, _ := strconv.ParseInt(string(change.TargetStorageID), 10, 64) | |||||
| // newDataCount, _ := strconv.ParseInt(change.DataTransferCount, 10, 64) | |||||
| switch change := change.(type) { | |||||
| case *stgmod.BlockChangeClone: //拷贝 | |||||
| // TODO 从change中获取index, sourceStorageID, targetStorageID, newDataCount,下同 | |||||
| //查询出存储在数据库中的BlockDistribution信息 | |||||
| blockSource, errSource := repoDist.GetBlockDistributionByIndex(objectID, index, sourceStorageID) | |||||
| //没有记录就将source和target的信息都保存到库中 | |||||
| if errors.Is(errSource, gorm.ErrRecordNotFound) { | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: objectID, | |||||
| Type: change.BlockType, | |||||
| Index: index, | |||||
| StorageID: sourceStorageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create source blockdistribution: %v", err) | |||||
| } | |||||
| } else { | |||||
| //有数据则新增一条storageID为targetStorageID的记录,同时更新状态 | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: blockSource.ObjectID, | |||||
| Type: change.BlockType, | |||||
| Index: index, | |||||
| StorageID: targetStorageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error update blockdistribution: %v", err) | |||||
| } | |||||
| //复制完成之后增加的dataCount要加到targetStorage的记录中 | |||||
| storageOld, err := repoStorage.GetStorageByID(targetStorageID) | |||||
| if errors.Is(err, gorm.ErrRecordNotFound) { | |||||
| err = repoStorage.CreateStorage(&Storage{ | |||||
| StorageID: cdssdk.StorageID(targetStorageID), | |||||
| DataCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | |||||
| case "1": //编解码 | |||||
| //删除所有的sourceBlock | |||||
| for _, sourceBlock := range change.SourceBlocks { | |||||
| sourceBlockIndex, _ := strconv.ParseInt(sourceBlock.Index, 10, 64) | |||||
| err := repoDist.DeleteBlockDistribution(objectID, sourceBlockIndex, sourceStorageID) | |||||
| if err != nil { | |||||
| log.Printf("Error delete blockdistribution: %v", err) | |||||
| } | |||||
| } | |||||
| //插入所有的targetBlock | |||||
| for _, targetBlock := range change.TargetBlocks { | |||||
| storageID, _ := strconv.ParseInt(string(targetBlock.StorageID), 10, 64) | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: objectID, | |||||
| Type: targetBlock.BlockType, | |||||
| Index: index, | |||||
| //直接保存到目标中心 | |||||
| StorageID: storageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create blockdistribution: %v", err) | |||||
| } | |||||
| log.Printf("Error increase datacount in targetstorage: %v", err) | |||||
| } | } | ||||
| //新增记录到storageTransferCount表中 | |||||
| err := repoStorageTrans.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: objectID, | |||||
| Status: int64(object.Status), | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| } else { | |||||
| err = repoStorage.UpdateStorage(&Storage{ | |||||
| StorageID: cdssdk.StorageID(targetStorageID), | |||||
| DataCount: storageOld.DataCount + newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | }) | ||||
| if err != nil { | if err != nil { | ||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | |||||
| case "2": //删除 | |||||
| for _, block := range change.Blocks { | |||||
| storageID, _ := strconv.ParseInt(string(block.StorageID), 10, 64) | |||||
| changeIndex, _ := strconv.ParseInt(block.Index, 10, 64) | |||||
| err := repoDist.DeleteBlockDistribution(objectID, changeIndex, storageID) | |||||
| if err != nil { | |||||
| log.Printf("Error delete blockdistribution: %v", err) | |||||
| } | |||||
| } | |||||
| case "3": //更新 | |||||
| for _, blockUpdate := range change.Blocks { | |||||
| //查询出存储在数据库中的BlockDistribution信息 | |||||
| blockIndex, _ := strconv.ParseInt(blockUpdate.Index, 10, 64) | |||||
| blockOld, err := repoDist.GetBlockDistributionByIndex(objectID, blockIndex, sourceStorageID) | |||||
| newStorageID, _ := strconv.ParseInt(string(blockUpdate.StorageID), 10, 64) | |||||
| err = repoDist.UpdateBlockDistribution(&BlockDistribution{ | |||||
| BlockID: blockOld.BlockID, | |||||
| ObjectID: blockOld.ObjectID, | |||||
| Type: blockUpdate.BlockType, | |||||
| Index: blockIndex, | |||||
| StorageID: newStorageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error delete blockdistribution: %v", err) | |||||
| } | |||||
| log.Printf("Error increase datacount in targetstorage: %v", err) | |||||
| } | } | ||||
| } | |||||
| default: | |||||
| break | |||||
| } | |||||
| //新增记录到storageTransferCount表中 | |||||
| err := repoStorageTrans.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: objectID, | |||||
| Status: int64(blockSource.Status), | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | |||||
| case *stgmod.BlockChangeEnDecode: //编解码 | |||||
| //删除所有的sourceBlock | |||||
| for _, sourceBlock := range change.SourceBlocks { | |||||
| sourceBlockIndex, _ := strconv.ParseInt(sourceBlock.Index, 10, 64) | |||||
| err := repoDist.DeleteBlockDistribution(objectID, sourceBlockIndex, sourceStorageID) | |||||
| if err != nil { | |||||
| log.Printf("Error delete blockdistribution: %v", err) | |||||
| } | } | ||||
| } | } | ||||
| } else { | |||||
| fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body) | |||||
| //插入所有的targetBlock | |||||
| for _, targetBlock := range change.TargetBlocks { | |||||
| storageID, _ := strconv.ParseInt(string(targetBlock.StorageID), 10, 64) | |||||
| err := repoDist.CreateBlockDistribution(&BlockDistribution{ | |||||
| ObjectID: objectID, | |||||
| Type: targetBlock.BlockType, | |||||
| Index: index, | |||||
| //直接保存到目标中心 | |||||
| StorageID: storageID, | |||||
| Status: StatusNow, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create blockdistribution: %v", err) | |||||
| } | |||||
| } | |||||
| //新增记录到storageTransferCount表中 | |||||
| err := repoStorageTrans.CreateStorageTransferCount(&StorageTransferCount{ | |||||
| ObjectID: objectID, | |||||
| Status: int64(object.Status), | |||||
| SourceStorageID: sourceStorageID, | |||||
| TargetStorageID: targetStorageID, | |||||
| DataTransferCount: newDataCount, | |||||
| Timestamp: time.Now(), | |||||
| }) | |||||
| if err != nil { | |||||
| log.Printf("Error create StorageTransferCount : %v", err) | |||||
| } | |||||
| case *stgmod.BlockChangeDeleted: //删除 | |||||
| storageID, _ := strconv.ParseInt(string(change.StorageID), 10, 64) | |||||
| changeIndex, _ := strconv.ParseInt(change.Index, 10, 64) | |||||
| err := repoDist.DeleteBlockDistribution(objectID, changeIndex, storageID) | |||||
| if err != nil { | |||||
| log.Printf("Error delete blockdistribution: %v", err) | |||||
| } | |||||
| // case *stgmod.BlockChangeUpdated: //更新 | |||||
| // for _, blockUpdate := range change.Blocks { | |||||
| // //查询出存储在数据库中的BlockDistribution信息 | |||||
| // blockIndex, _ := strconv.ParseInt(blockUpdate.Index, 10, 64) | |||||
| // blockOld, err := repoDist.GetBlockDistributionByIndex(objectID, blockIndex, sourceStorageID) | |||||
| // newStorageID, _ := strconv.ParseInt(string(blockUpdate.StorageID), 10, 64) | |||||
| // err = repoDist.UpdateBlockDistribution(&BlockDistribution{ | |||||
| // BlockID: blockOld.BlockID, | |||||
| // ObjectID: blockOld.ObjectID, | |||||
| // Type: blockUpdate.BlockType, | |||||
| // Index: blockIndex, | |||||
| // StorageID: newStorageID, | |||||
| // Status: StatusNow, | |||||
| // Timestamp: time.Now(), | |||||
| // }) | |||||
| // if err != nil { | |||||
| // log.Printf("Error delete blockdistribution: %v", err) | |||||
| // } | |||||
| // } | |||||
| default: | |||||
| break | |||||
| } | } | ||||
| } else { | |||||
| fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,7 +2,7 @@ package models | |||||
| import ( | import ( | ||||
| "encoding/json" | "encoding/json" | ||||
| "fmt" | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | stgmod "gitlink.org.cn/cloudream/storage/common/models" | ||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | ||||
| @@ -50,42 +50,36 @@ type HubInfoWatcher struct { | |||||
| // 实现 OnEvent 方法 | // 实现 OnEvent 方法 | ||||
| func (w *HubInfoWatcher) OnEvent(event sysevent.SysEvent) { | func (w *HubInfoWatcher) OnEvent(event sysevent.SysEvent) { | ||||
| repo := NewHubRepository(DB) | repo := NewHubRepository(DB) | ||||
| if event.Category == "hubInfo" { | |||||
| if hubInfo, ok := event.Body.(*stgmod.BodyHubInfo); ok { | |||||
| switch body := event.Body.(type) { | |||||
| case *stgmod.BodyNewHub: | |||||
| err := repo.CreateHub(&Hub{ | |||||
| HubID: body.Info.HubID, | |||||
| Name: body.Info.Name, | |||||
| Address: body.Info.Address, | |||||
| }) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case *stgmod.BodyHubUpdated: | |||||
| err := repo.UpdateHub(&Hub{ | |||||
| HubID: body.Info.HubID, | |||||
| Name: body.Info.Name, | |||||
| Address: body.Info.Address, | |||||
| }) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| hub := &Hub{ | |||||
| HubID: hubInfo.HubID, | |||||
| Name: hubInfo.HubInfo.Name, | |||||
| Address: hubInfo.HubInfo.Address, | |||||
| } | |||||
| //先判断传输数据的类型 | |||||
| switch hubInfo.Type { | |||||
| case "add": | |||||
| err := repo.CreateHub(hub) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case "update": | |||||
| err := repo.UpdateHub(hub) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case "delete": | |||||
| err := repo.DeleteHub(hub) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| default: | |||||
| return | |||||
| } | |||||
| } else { | |||||
| // 如果 Body 不是我们期望的类型,打印错误信息 | |||||
| fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyHubInfo, got %T\n", w.Name, event.Body) | |||||
| case *stgmod.BodyHubDeleted: | |||||
| err := repo.DeleteHub(&Hub{ | |||||
| HubID: body.HubID, | |||||
| }) | |||||
| if err != nil { | |||||
| return | |||||
| } | } | ||||
| } else { | |||||
| // 如果事件的 Category 不是 hubInfo,打印默认信息 | |||||
| fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) | |||||
| } | } | ||||
| } | } | ||||
| @@ -2,11 +2,12 @@ package models | |||||
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "time" | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | stgmod "gitlink.org.cn/cloudream/storage/common/models" | ||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | ||||
| "gorm.io/gorm" | "gorm.io/gorm" | ||||
| "time" | |||||
| ) | ) | ||||
| type Object struct { | type Object struct { | ||||
| @@ -74,7 +75,7 @@ type ObjectWatcher struct { | |||||
| func (w *ObjectWatcher) OnEvent(event sysevent.SysEvent) { | func (w *ObjectWatcher) OnEvent(event sysevent.SysEvent) { | ||||
| if event.Category == "objectChange" { | if event.Category == "objectChange" { | ||||
| if _, ok := event.Body.(*stgmod.BodyObjectChange); ok { | |||||
| if _, ok := event.Body.(*stgmod.BodyNewObject); ok { | |||||
| } else { | } else { | ||||
| fmt.Printf("Watcher %s: Unexpected Body type, expected *ObjectInfo, got %T\n", w.Name, event.Body) | fmt.Printf("Watcher %s: Unexpected Body type, expected *ObjectInfo, got %T\n", w.Name, event.Body) | ||||
| @@ -1,12 +1,12 @@ | |||||
| package models | package models | ||||
| import ( | import ( | ||||
| "fmt" | |||||
| "time" | |||||
| cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" | ||||
| stgmod "gitlink.org.cn/cloudream/storage/common/models" | stgmod "gitlink.org.cn/cloudream/storage/common/models" | ||||
| "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | "gitlink.org.cn/cloudream/storage/common/pkgs/sysevent" | ||||
| "gorm.io/gorm" | "gorm.io/gorm" | ||||
| "time" | |||||
| ) | ) | ||||
| type Storage struct { | type Storage struct { | ||||
| @@ -74,38 +74,37 @@ type StorageInfoWatcher struct { | |||||
| func (w *StorageInfoWatcher) OnEvent(event sysevent.SysEvent) { | func (w *StorageInfoWatcher) OnEvent(event sysevent.SysEvent) { | ||||
| repo := NewStorageRepository(DB) | repo := NewStorageRepository(DB) | ||||
| if event.Category == "storageInfo" { | |||||
| if storageInfo, ok := event.Body.(*stgmod.BodyStorageInfo); ok { | |||||
| storage := &Storage{ | |||||
| StorageID: storageInfo.StorageID, | |||||
| StorageName: storageInfo.StorageInfo.Name, | |||||
| HubID: storageInfo.StorageInfo.MasterHub, | |||||
| Timestamp: time.Now(), | |||||
| } | |||||
| switch body := event.Body.(type) { | |||||
| case *stgmod.BodyNewStorage: | |||||
| storage := &Storage{ | |||||
| StorageID: body.Info.StorageID, | |||||
| StorageName: body.Info.Name, | |||||
| HubID: body.Info.MasterHub, | |||||
| Timestamp: time.Now(), | |||||
| } | |||||
| err := repo.CreateStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| switch storageInfo.Type { | |||||
| case "add": | |||||
| err := repo.CreateStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case "update": | |||||
| err := repo.UpdateStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case "delete": | |||||
| err := repo.DeleteStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| default: | |||||
| return | |||||
| } | |||||
| } else { | |||||
| fmt.Printf("Watcher %s: Unexpected Body type, expected *BodyStorageInfo, got %T\n", w.Name, event.Body) | |||||
| case *stgmod.BodyStorageUpdated: | |||||
| storage := &Storage{ | |||||
| StorageID: body.Info.StorageID, | |||||
| StorageName: body.Info.Name, | |||||
| HubID: body.Info.MasterHub, | |||||
| Timestamp: time.Now(), | |||||
| } | |||||
| err := repo.UpdateStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| case *stgmod.BodyStorageDeleted: | |||||
| storage := &Storage{ | |||||
| StorageID: body.StorageID, | |||||
| } | |||||
| err := repo.DeleteStorage(storage) | |||||
| if err != nil { | |||||
| return | |||||
| } | } | ||||
| } else { | |||||
| fmt.Printf("Watcher %s received an event with category %s\n", w.Name, event.Category) | |||||
| } | } | ||||
| } | } | ||||