12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package topic
- import "sync"
- type LocalTopic struct {
- Topic
- Partitions []*LocalPartition
- }
- func NewLocalTopic(topic Topic) *LocalTopic {
- return &LocalTopic{
- Topic: topic,
- Partitions: make([]*LocalPartition, 0),
- }
- }
- func (localTopic *LocalTopic) findPartition(partition Partition) *LocalPartition {
- for _, localPartition := range localTopic.Partitions {
- if localPartition.Partition.Equals(partition) {
- return localPartition
- }
- }
- return nil
- }
- func (localTopic *LocalTopic) removePartition(partition Partition) bool {
- foundPartitionIndex := -1
- for i, localPartition := range localTopic.Partitions {
- if localPartition.Partition.Equals(partition) {
- foundPartitionIndex = i
- localPartition.Shutdown()
- break
- }
- }
- if foundPartitionIndex == -1 {
- return false
- }
- localTopic.Partitions = append(localTopic.Partitions[:foundPartitionIndex], localTopic.Partitions[foundPartitionIndex+1:]...)
- return true
- }
- func (localTopic *LocalTopic) closePartitionPublishers(unixTsNs int64) bool {
- var wg sync.WaitGroup
- for _, localPartition := range localTopic.Partitions {
- if localPartition.UnixTimeNs != unixTsNs {
- continue
- }
- wg.Add(1)
- go func(localPartition *LocalPartition) {
- defer wg.Done()
- localPartition.closePublishers()
- }(localPartition)
- }
- wg.Wait()
- return true
- }
- func (localTopic *LocalTopic) closePartitionSubscribers(unixTsNs int64) bool {
- var wg sync.WaitGroup
- for _, localPartition := range localTopic.Partitions {
- if localPartition.UnixTimeNs != unixTsNs {
- continue
- }
- wg.Add(1)
- go func(localPartition *LocalPartition) {
- defer wg.Done()
- localPartition.closeSubscribers()
- }(localPartition)
- }
- wg.Wait()
- return true
- }
- func (localTopic *LocalTopic) WaitUntilNoPublishers() {
- for {
- var wg sync.WaitGroup
- for _, localPartition := range localTopic.Partitions {
- wg.Add(1)
- go func(localPartition *LocalPartition) {
- defer wg.Done()
- localPartition.WaitUntilNoPublishers()
- }(localPartition)
- }
- wg.Wait()
- if len(localTopic.Partitions) == 0 {
- return
- }
- }
- }
|