mirror of
https://github.com/chrislusf/seaweedfs
synced 2024-05-20 02:10:20 +02:00
send flush message to follower before shutting down logBuffer
This commit is contained in:
parent
e568e742c9
commit
f07875e8e1
|
@ -43,6 +43,10 @@ func (b *MessageQueueBroker) PublishFollowMe(stream mq_pb.SeaweedMessaging_Publi
|
|||
} else if closeMessage := req.GetClose(); closeMessage != nil {
|
||||
glog.V(0).Infof("topic %v partition %v publish stream closed: %v", initMessage.Topic, initMessage.Partition, closeMessage)
|
||||
break
|
||||
} else if flushMessage := req.GetFlush(); flushMessage != nil {
|
||||
glog.V(0).Infof("topic %v partition %v publish stream flushed: %v", initMessage.Topic, initMessage.Partition, flushMessage)
|
||||
} else {
|
||||
glog.Errorf("unknown message: %v", req)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -41,6 +41,16 @@ func (b *MessageQueueBroker) genLogFlushFunc(t topic.Topic, partition *mq_pb.Par
|
|||
}
|
||||
|
||||
atomic.StoreInt64(&logBuffer.LastFlushTsNs, stopTime.UnixNano())
|
||||
|
||||
b.accessLock.Lock()
|
||||
defer b.accessLock.Unlock()
|
||||
p := topic.FromPbPartition(partition)
|
||||
if localPartition:=b.localTopicManager.GetLocalPartition(t, p); localPartition!=nil {
|
||||
localPartition.NotifyLogFlushed(logBuffer.LastFlushTsNs)
|
||||
}
|
||||
|
||||
println("flushing at", logBuffer.LastFlushTsNs, "to", targetFile, "size", len(buf))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -190,6 +190,10 @@ func (p *LocalPartition) MaybeConnectToFollowers(initMessage *mq_pb.PublishMessa
|
|||
func (p *LocalPartition) MaybeShutdownLocalPartition() (hasShutdown bool) {
|
||||
|
||||
if p.Publishers.Size() == 0 && p.Subscribers.Size() == 0 {
|
||||
p.LogBuffer.ShutdownLogBuffer()
|
||||
for !p.LogBuffer.IsAllFlushed() {
|
||||
time.Sleep(113 * time.Millisecond)
|
||||
}
|
||||
if p.followerStream != nil {
|
||||
// send close to the follower
|
||||
if followErr := p.followerStream.Send(&mq_pb.PublishFollowMeRequest{
|
||||
|
@ -205,7 +209,6 @@ func (p *LocalPartition) MaybeShutdownLocalPartition() (hasShutdown bool) {
|
|||
p.follower = ""
|
||||
}
|
||||
|
||||
p.LogBuffer.ShutdownLogBuffer()
|
||||
hasShutdown = true
|
||||
}
|
||||
|
||||
|
@ -219,3 +222,18 @@ func (p *LocalPartition) Shutdown() {
|
|||
p.LogBuffer.ShutdownLogBuffer()
|
||||
glog.V(0).Infof("local partition %v shutting down", p.Partition)
|
||||
}
|
||||
|
||||
func (p *LocalPartition) NotifyLogFlushed(flushTsNs int64) {
|
||||
if p.followerStream != nil {
|
||||
if followErr := p.followerStream.Send(&mq_pb.PublishFollowMeRequest{
|
||||
Message: &mq_pb.PublishFollowMeRequest_Flush{
|
||||
Flush: &mq_pb.PublishFollowMeRequest_FlushMessage{
|
||||
TsNs: flushTsNs,
|
||||
},
|
||||
},
|
||||
}); followErr != nil {
|
||||
glog.Errorf("send follower %s flush message: %v", p.follower, followErr)
|
||||
}
|
||||
println("notifying", p.follower, "flushed at", flushTsNs)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ type LogBuffer struct {
|
|||
ReadFromDiskFn LogReadFromDiskFuncType
|
||||
notifyFn func()
|
||||
isStopping *atomic.Bool
|
||||
isAllFlushed bool
|
||||
flushChan chan *dataToFlush
|
||||
LastTsNs int64
|
||||
sync.RWMutex
|
||||
|
@ -134,6 +135,7 @@ func (logBuffer *LogBuffer) IsStopping() bool {
|
|||
return logBuffer.isStopping.Load()
|
||||
}
|
||||
|
||||
// ShutdownLogBuffer flushes the buffer and stops the log buffer
|
||||
func (logBuffer *LogBuffer) ShutdownLogBuffer() {
|
||||
isAlreadyStopped := logBuffer.isStopping.Swap(true)
|
||||
if isAlreadyStopped {
|
||||
|
@ -144,6 +146,11 @@ func (logBuffer *LogBuffer) ShutdownLogBuffer() {
|
|||
close(logBuffer.flushChan)
|
||||
}
|
||||
|
||||
// IsAllFlushed returns true if all data in the buffer has been flushed, after calling ShutdownLogBuffer().
|
||||
func (logBuffer *LogBuffer) IsAllFlushed() bool {
|
||||
return logBuffer.isAllFlushed
|
||||
}
|
||||
|
||||
func (logBuffer *LogBuffer) loopFlush() {
|
||||
for d := range logBuffer.flushChan {
|
||||
if d != nil {
|
||||
|
@ -154,6 +161,7 @@ func (logBuffer *LogBuffer) loopFlush() {
|
|||
logBuffer.lastFlushDataTime = d.stopTime
|
||||
}
|
||||
}
|
||||
logBuffer.isAllFlushed = true
|
||||
}
|
||||
|
||||
func (logBuffer *LogBuffer) loopInterval() {
|
||||
|
|
Loading…
Reference in a new issue