You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							43 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							43 lines
						
					
					
						
							1.7 KiB
						
					
					
				
								package logstore
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/mq/topic"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/util/log_buffer"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								func GenMergedReadFunc(filerClient filer_pb.FilerClient, t topic.Topic, p topic.Partition) log_buffer.LogReadFromDiskFuncType {
							 | 
						|
									fromParquetFn := GenParquetReadFunc(filerClient, t, p)
							 | 
						|
									readLogDirectFn := GenLogOnDiskReadFunc(filerClient, t, p)
							 | 
						|
									// Reversed order: live logs first (recent), then Parquet files (historical)
							 | 
						|
									// This provides better performance for real-time analytics queries
							 | 
						|
									return mergeReadFuncs(readLogDirectFn, fromParquetFn)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func mergeReadFuncs(readLogDirectFn, fromParquetFn log_buffer.LogReadFromDiskFuncType) log_buffer.LogReadFromDiskFuncType {
							 | 
						|
									var exhaustedLiveLogs bool
							 | 
						|
									var lastProcessedPosition log_buffer.MessagePosition
							 | 
						|
									return func(startPosition log_buffer.MessagePosition, stopTsNs int64, eachLogEntryFn log_buffer.EachLogEntryFuncType) (lastReadPosition log_buffer.MessagePosition, isDone bool, err error) {
							 | 
						|
										if !exhaustedLiveLogs {
							 | 
						|
											// glog.V(4).Infof("reading from live logs startPosition: %v\n", startPosition.UTC())
							 | 
						|
											lastReadPosition, isDone, err = readLogDirectFn(startPosition, stopTsNs, eachLogEntryFn)
							 | 
						|
											// glog.V(4).Infof("read from live logs: %v %v %v %v\n", startPosition, lastReadPosition, isDone, err)
							 | 
						|
											if isDone {
							 | 
						|
												isDone = false
							 | 
						|
											}
							 | 
						|
											if err != nil {
							 | 
						|
												return
							 | 
						|
											}
							 | 
						|
											lastProcessedPosition = lastReadPosition
							 | 
						|
										}
							 | 
						|
										exhaustedLiveLogs = true
							 | 
						|
								
							 | 
						|
										if startPosition.Before(lastProcessedPosition.Time) {
							 | 
						|
											startPosition = lastProcessedPosition
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										// glog.V(4).Infof("reading from parquet startPosition: %v\n", startPosition.UTC())
							 | 
						|
										lastReadPosition, isDone, err = fromParquetFn(startPosition, stopTsNs, eachLogEntryFn)
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
								}
							 |