aboutsummaryrefslogtreecommitdiff
path: root/weed/admin/topology/structs.go
blob: 103ee5abea23979d3aafa9e1ed96ec4705e9dd19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package topology

import (
	"sync"
	"time"

	"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
)

// TaskSource represents a single source in a multi-source task (for replicated volume cleanup)
type TaskSource struct {
	SourceServer  string            `json:"source_server"`
	SourceDisk    uint32            `json:"source_disk"`
	StorageChange StorageSlotChange `json:"storage_change"` // Storage impact on this source
	EstimatedSize int64             `json:"estimated_size"` // Estimated size for this source
}

// TaskDestination represents a single destination in a multi-destination task
type TaskDestination struct {
	TargetServer  string            `json:"target_server"`
	TargetDisk    uint32            `json:"target_disk"`
	StorageChange StorageSlotChange `json:"storage_change"` // Storage impact on this destination
	EstimatedSize int64             `json:"estimated_size"` // Estimated size for this destination
}

// taskState represents the current state of tasks affecting the topology (internal)
// Uses unified multi-source/multi-destination design:
// - Single-source tasks (balance, vacuum, replication): 1 source, 1 destination
// - Multi-source EC tasks (replicated volumes): N sources, M destinations
type taskState struct {
	VolumeID      uint32     `json:"volume_id"`
	TaskType      TaskType   `json:"task_type"`
	Status        TaskStatus `json:"status"`
	StartedAt     time.Time  `json:"started_at"`
	CompletedAt   time.Time  `json:"completed_at,omitempty"`
	EstimatedSize int64      `json:"estimated_size"` // Total estimated size of task

	// Unified source and destination arrays (always used)
	Sources      []TaskSource      `json:"sources"`      // Source locations (1+ for all task types)
	Destinations []TaskDestination `json:"destinations"` // Destination locations (1+ for all task types)
}

// DiskInfo represents a disk with its current state and ongoing tasks (public for external access)
type DiskInfo struct {
	NodeID     string              `json:"node_id"`
	DiskID     uint32              `json:"disk_id"`
	DiskType   string              `json:"disk_type"`
	DataCenter string              `json:"data_center"`
	Rack       string              `json:"rack"`
	DiskInfo   *master_pb.DiskInfo `json:"disk_info"`
	LoadCount  int                 `json:"load_count"` // Number of active tasks
}

// activeDisk represents internal disk state (private)
type activeDisk struct {
	*DiskInfo
	pendingTasks  []*taskState
	assignedTasks []*taskState
	recentTasks   []*taskState // Completed in last N seconds
}

// activeNode represents a node with its disks (private)
type activeNode struct {
	nodeID     string
	dataCenter string
	rack       string
	nodeInfo   *master_pb.DataNodeInfo
	disks      map[uint32]*activeDisk // DiskID -> activeDisk
}

// ActiveTopology provides a real-time view of cluster state with task awareness
type ActiveTopology struct {
	// Core topology from master
	topologyInfo *master_pb.TopologyInfo
	lastUpdated  time.Time

	// Structured topology for easy access (private)
	nodes map[string]*activeNode // NodeID -> activeNode
	disks map[string]*activeDisk // "NodeID:DiskID" -> activeDisk

	// Performance indexes for O(1) lookups (private)
	volumeIndex  map[uint32][]string // VolumeID -> list of "NodeID:DiskID" where volume replicas exist
	ecShardIndex map[uint32][]string // VolumeID -> list of "NodeID:DiskID" where EC shards exist

	// Task states affecting the topology (private)
	pendingTasks  map[string]*taskState
	assignedTasks map[string]*taskState
	recentTasks   map[string]*taskState

	// Configuration
	recentTaskWindowSeconds int

	// Synchronization
	mutex sync.RWMutex
}

// DestinationPlan represents a planned destination for a volume/shard operation
type DestinationPlan struct {
	TargetNode     string  `json:"target_node"`
	TargetDisk     uint32  `json:"target_disk"`
	TargetRack     string  `json:"target_rack"`
	TargetDC       string  `json:"target_dc"`
	ExpectedSize   uint64  `json:"expected_size"`
	PlacementScore float64 `json:"placement_score"`
}

// MultiDestinationPlan represents multiple planned destinations for operations like EC
type MultiDestinationPlan struct {
	Plans          []*DestinationPlan `json:"plans"`
	TotalShards    int                `json:"total_shards"`
	SuccessfulRack int                `json:"successful_racks"`
	SuccessfulDCs  int                `json:"successful_dcs"`
}

// VolumeReplica represents a replica location with server and disk information
type VolumeReplica struct {
	ServerID   string `json:"server_id"`
	DiskID     uint32 `json:"disk_id"`
	DataCenter string `json:"data_center"`
	Rack       string `json:"rack"`
}