github.com/lirm/aeron-go@v0.0.0-20230415210743-920325491dc4/cluster/service_adapter.go (about) 1 package cluster 2 3 import ( 4 "bytes" 5 6 "github.com/lirm/aeron-go/aeron" 7 "github.com/lirm/aeron-go/aeron/atomic" 8 "github.com/lirm/aeron-go/aeron/logbuffer" 9 "github.com/lirm/aeron-go/cluster/codecs" 10 ) 11 12 type serviceAdapter struct { 13 marshaller *codecs.SbeGoMarshaller 14 agent *ClusteredServiceAgent 15 subscription *aeron.Subscription 16 } 17 18 func (adapter *serviceAdapter) poll() int { 19 if adapter.subscription.IsClosed() { 20 panic("subscription closed") 21 } 22 return adapter.subscription.Poll(adapter.onFragment, 10) 23 } 24 25 func (adapter *serviceAdapter) onFragment( 26 buffer *atomic.Buffer, 27 offset int32, 28 length int32, 29 header *logbuffer.Header, 30 ) { 31 if length < SBEHeaderLength { 32 return 33 } 34 blockLength := buffer.GetUInt16(offset) 35 templateId := buffer.GetUInt16(offset + 2) 36 schemaId := buffer.GetUInt16(offset + 4) 37 version := buffer.GetUInt16(offset + 6) 38 if schemaId != ClusterSchemaId { 39 logger.Errorf("serviceAdapter: unexpected schemaId=%d templateId=%d blockLen=%d version=%d", 40 schemaId, templateId, blockLength, version) 41 return 42 } 43 offset += SBEHeaderLength 44 length -= SBEHeaderLength 45 46 switch templateId { 47 case joinLogTemplateId: 48 buf := &bytes.Buffer{} 49 buffer.WriteBytes(buf, offset, length) 50 joinLog := &codecs.JoinLog{} 51 if err := joinLog.Decode(adapter.marshaller, buf, version, blockLength, true); err != nil { 52 logger.Errorf("serviceAdapter: join log decode error: %v", err) 53 } else { 54 adapter.agent.onJoinLog( 55 joinLog.LogPosition, 56 joinLog.MaxLogPosition, 57 joinLog.MemberId, 58 joinLog.LogSessionId, 59 joinLog.LogStreamId, 60 joinLog.IsStartup == codecs.BooleanType.TRUE, 61 Role(joinLog.Role), 62 string(joinLog.LogChannel), 63 ) 64 } 65 case serviceTerminationPosTemplateId: 66 logPos := buffer.GetInt64(offset) 67 adapter.agent.onServiceTerminationPosition(logPos) 68 default: 69 logger.Debugf("serviceAdapter: unexpected templateId=%d at pos=%d", templateId, header.Position()) 70 } 71 }