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  }