1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00

consensus stream watch error

This commit is contained in:
Sergey Cherepanov 2022-10-20 14:04:59 +03:00 committed by Mikhail Iudin
parent add04d3e88
commit 2dcacdfbb6
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
8 changed files with 396 additions and 126 deletions

View file

@ -5,6 +5,7 @@ import "time"
type Log struct {
Id []byte `bson:"_id"`
Records []Record `bson:"records"`
Err error
}
type Record struct {

View file

@ -9,6 +9,7 @@ type Stream interface {
WatchIds(logIds [][]byte) (err error)
UnwatchIds(logIds [][]byte) (err error)
WaitLogs() []*consensusproto.Log
Err() error
Close() error
}
@ -24,6 +25,7 @@ func runStream(rpcStream consensusproto.DRPCConsensus_WatchLogClient) Stream {
type stream struct {
rpcStream consensusproto.DRPCConsensus_WatchLogClient
mb *mb.MB[*consensusproto.Log]
err error
}
func (s *stream) WatchIds(logIds [][]byte) (err error) {
@ -42,11 +44,16 @@ func (s *stream) WaitLogs() []*consensusproto.Log {
return s.mb.Wait()
}
func (s *stream) Err() error {
return s.err
}
func (s *stream) readStream() {
defer s.Close()
for {
event, err := s.rpcStream.Recv()
if err != nil {
s.err = err
return
}
if err = s.mb.Add(&consensusproto.Log{

View file

@ -363,6 +363,7 @@ func (m *WatchLogRequest) GetUnwatchIds() [][]byte {
type WatchLogEvent struct {
LogId []byte `protobuf:"bytes,1,opt,name=logId,proto3" json:"logId,omitempty"`
Records []*Record `protobuf:"bytes,2,rep,name=records,proto3" json:"records,omitempty"`
Error *Err `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
}
func (m *WatchLogEvent) Reset() { *m = WatchLogEvent{} }
@ -412,6 +413,57 @@ func (m *WatchLogEvent) GetRecords() []*Record {
return nil
}
func (m *WatchLogEvent) GetError() *Err {
if m != nil {
return m.Error
}
return nil
}
type Err struct {
Error ErrCodes `protobuf:"varint,1,opt,name=error,proto3,enum=anyConsensus.ErrCodes" json:"error,omitempty"`
}
func (m *Err) Reset() { *m = Err{} }
func (m *Err) String() string { return proto.CompactTextString(m) }
func (*Err) ProtoMessage() {}
func (*Err) Descriptor() ([]byte, []int) {
return fileDescriptor_6b92aaf7feaf5a54, []int{7}
}
func (m *Err) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *Err) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_Err.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *Err) XXX_Merge(src proto.Message) {
xxx_messageInfo_Err.Merge(m, src)
}
func (m *Err) XXX_Size() int {
return m.Size()
}
func (m *Err) XXX_DiscardUnknown() {
xxx_messageInfo_Err.DiscardUnknown(m)
}
var xxx_messageInfo_Err proto.InternalMessageInfo
func (m *Err) GetError() ErrCodes {
if m != nil {
return m.Error
}
return ErrCodes_Unexpected
}
func init() {
proto.RegisterEnum("anyConsensus.ErrCodes", ErrCodes_name, ErrCodes_value)
proto.RegisterType((*Log)(nil), "anyConsensus.Log")
@ -421,6 +473,7 @@ func init() {
proto.RegisterType((*AddRecordRequest)(nil), "anyConsensus.AddRecordRequest")
proto.RegisterType((*WatchLogRequest)(nil), "anyConsensus.WatchLogRequest")
proto.RegisterType((*WatchLogEvent)(nil), "anyConsensus.WatchLogEvent")
proto.RegisterType((*Err)(nil), "anyConsensus.Err")
}
func init() {
@ -428,37 +481,39 @@ func init() {
}
var fileDescriptor_6b92aaf7feaf5a54 = []byte{
// 475 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x8b, 0xd3, 0x50,
0x14, 0xed, 0x4b, 0xc6, 0x4e, 0x7b, 0xd3, 0x8f, 0x78, 0x19, 0x24, 0x74, 0x30, 0x84, 0x88, 0x10,
0x45, 0x5a, 0xa9, 0x82, 0x2b, 0x17, 0x63, 0xa9, 0x50, 0xa9, 0x16, 0x02, 0x55, 0x70, 0x65, 0xcc,
0x7b, 0x8d, 0x61, 0x42, 0x5e, 0x7d, 0x2f, 0x1d, 0x3b, 0xff, 0xc2, 0x1f, 0xe2, 0x0f, 0x71, 0xe7,
0x2c, 0x5d, 0x4a, 0xfb, 0x47, 0xa4, 0x2f, 0x4d, 0x68, 0x9c, 0x99, 0x85, 0x9b, 0x84, 0x7b, 0xce,
0x3d, 0xf7, 0x9e, 0xdc, 0x43, 0xe0, 0x61, 0xc8, 0x53, 0xc9, 0x52, 0xb9, 0x92, 0x4b, 0xc1, 0x33,
0x3e, 0x50, 0x4f, 0x39, 0x28, 0xd1, 0xbe, 0x02, 0xb0, 0x15, 0xa4, 0x97, 0xa3, 0x02, 0x73, 0xc7,
0xa0, 0x4f, 0x79, 0x84, 0x1d, 0xd0, 0x62, 0x6a, 0x11, 0x87, 0x78, 0x2d, 0x5f, 0x8b, 0x29, 0xf6,
0xe1, 0x58, 0xb0, 0x90, 0x0b, 0x2a, 0x2d, 0xcd, 0xd1, 0x3d, 0x63, 0x78, 0xd2, 0x3f, 0x94, 0xf5,
0x7d, 0x45, 0xfa, 0x45, 0x93, 0x9b, 0x40, 0x3d, 0x87, 0xae, 0x4d, 0xba, 0x07, 0xf5, 0xa5, 0x60,
0x17, 0x13, 0x6a, 0x69, 0x0a, 0xdb, 0x57, 0x68, 0xc1, 0xf1, 0x32, 0xb8, 0x4c, 0x78, 0x40, 0x2d,
0x5d, 0x11, 0x45, 0x89, 0x0e, 0x18, 0xa1, 0x60, 0x41, 0xc6, 0xe8, 0x3c, 0x8d, 0xd7, 0xd6, 0x91,
0x43, 0xbc, 0x23, 0xff, 0x10, 0x72, 0x8f, 0x40, 0x9b, 0x9d, 0xbb, 0xcf, 0xa1, 0x7d, 0x46, 0xe9,
0x94, 0x47, 0x3e, 0xfb, 0xba, 0x62, 0x32, 0xc3, 0x07, 0xa0, 0x27, 0x3c, 0x52, 0xbb, 0x8d, 0xe1,
0xdd, 0xaa, 0xe1, 0x5d, 0xdb, 0x8e, 0x75, 0xdf, 0x83, 0x79, 0x46, 0xe9, 0xde, 0xff, 0x5e, 0x78,
0x02, 0x77, 0x12, 0x1e, 0x4d, 0x0a, 0xdb, 0x79, 0x81, 0x4f, 0xa0, 0x9e, 0x7f, 0x9e, 0x72, 0x7e,
0xdb, 0x09, 0xf6, 0x3d, 0xee, 0x5b, 0xe8, 0x7e, 0x08, 0xb2, 0xf0, 0xcb, 0x81, 0x9f, 0x1e, 0x34,
0xbe, 0xed, 0xa0, 0x09, 0x95, 0x16, 0x71, 0x74, 0xaf, 0xe5, 0x97, 0x35, 0xda, 0x00, 0xab, 0xb4,
0x64, 0x35, 0xc5, 0x1e, 0x20, 0xee, 0x1c, 0xda, 0xc5, 0xb8, 0xf1, 0x05, 0x4b, 0x6f, 0xf3, 0xf8,
0x9f, 0x39, 0x3d, 0xfe, 0x04, 0x8d, 0xb1, 0x10, 0x23, 0x4e, 0x99, 0xc4, 0x0e, 0xc0, 0x3c, 0x65,
0xeb, 0x25, 0x0b, 0x33, 0x46, 0xcd, 0x1a, 0xb6, 0xa1, 0xb9, 0xdb, 0xb6, 0x8e, 0x65, 0x26, 0x4d,
0x82, 0x5d, 0x30, 0xa6, 0x3c, 0x7a, 0xc7, 0xb3, 0xd7, 0x7c, 0x95, 0x52, 0x53, 0x43, 0x84, 0x4e,
0x3e, 0x6e, 0xc4, 0xd3, 0x45, 0x12, 0x87, 0x99, 0xa9, 0xa3, 0x09, 0xc6, 0x58, 0x08, 0x2e, 0x66,
0x8b, 0x85, 0x64, 0x99, 0xf9, 0x43, 0x1b, 0xfe, 0x22, 0xd0, 0x2c, 0xf7, 0xe3, 0x0b, 0xa8, 0xe7,
0x19, 0xe1, 0x69, 0xd5, 0x58, 0x25, 0xb9, 0x9e, 0x59, 0x25, 0x67, 0xe7, 0xf8, 0x12, 0x9a, 0x65,
0x4c, 0x68, 0x5f, 0xd3, 0x56, 0xf2, 0xbb, 0x41, 0xfe, 0x06, 0x1a, 0xc5, 0xf9, 0xf0, 0x7e, 0x95,
0xfd, 0x27, 0xa5, 0xde, 0xe9, 0xcd, 0xb4, 0xba, 0xba, 0x47, 0x9e, 0x92, 0x57, 0x8f, 0x7e, 0x6e,
0x6c, 0x72, 0xb5, 0xb1, 0xc9, 0x9f, 0x8d, 0x4d, 0xbe, 0x6f, 0xed, 0xda, 0xd5, 0xd6, 0xae, 0xfd,
0xde, 0xda, 0xb5, 0x8f, 0xdd, 0x41, 0xf5, 0x97, 0xfb, 0x5c, 0x57, 0xaf, 0x67, 0x7f, 0x03, 0x00,
0x00, 0xff, 0xff, 0x40, 0xd0, 0xc6, 0x8e, 0x8b, 0x03, 0x00, 0x00,
// 509 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xcd, 0x8a, 0xd3, 0x50,
0x14, 0xee, 0x4d, 0x3a, 0x9d, 0xf6, 0xf4, 0x2f, 0x1e, 0x86, 0x21, 0x74, 0x30, 0x94, 0x88, 0x58,
0x65, 0x68, 0xa5, 0x23, 0xb8, 0x72, 0x31, 0x96, 0x0a, 0x95, 0x6a, 0x21, 0x30, 0x0a, 0xae, 0xac,
0xb9, 0xb7, 0x31, 0x4c, 0xc8, 0xad, 0xf7, 0xa6, 0x63, 0x67, 0xe3, 0x33, 0xf8, 0x20, 0x3e, 0x88,
0x3b, 0x67, 0xe9, 0x52, 0xda, 0x17, 0x91, 0xdc, 0xfc, 0xd0, 0xd8, 0x99, 0x85, 0x9b, 0x96, 0xf3,
0x7d, 0xe7, 0xe7, 0xbb, 0xe7, 0x7c, 0x81, 0x87, 0x2e, 0x0f, 0x25, 0x0b, 0xe5, 0x4a, 0x2e, 0x05,
0x8f, 0xf8, 0x40, 0xfd, 0xca, 0x41, 0x8e, 0xf6, 0x15, 0x80, 0x8d, 0x79, 0x78, 0x3d, 0xca, 0x30,
0x7b, 0x0c, 0xfa, 0x94, 0x7b, 0xd8, 0x02, 0xcd, 0xa7, 0x26, 0xe9, 0x92, 0x5e, 0xc3, 0xd1, 0x7c,
0x8a, 0x7d, 0x38, 0x14, 0xcc, 0xe5, 0x82, 0x4a, 0x53, 0xeb, 0xea, 0xbd, 0xfa, 0xf0, 0xa8, 0xbf,
0x5b, 0xd6, 0x77, 0x14, 0xe9, 0x64, 0x49, 0x76, 0x00, 0x95, 0x04, 0xda, 0xeb, 0x74, 0x0c, 0x95,
0xa5, 0x60, 0x57, 0x13, 0x6a, 0x6a, 0x0a, 0x4b, 0x23, 0x34, 0xe1, 0x70, 0x39, 0xbf, 0x0e, 0xf8,
0x9c, 0x9a, 0xba, 0x22, 0xb2, 0x10, 0xbb, 0x50, 0x77, 0x05, 0x9b, 0x47, 0x8c, 0x5e, 0x84, 0xfe,
0xda, 0x2c, 0x77, 0x49, 0xaf, 0xec, 0xec, 0x42, 0x76, 0x19, 0xb4, 0xd9, 0xa5, 0xfd, 0x0c, 0x9a,
0xe7, 0x94, 0x4e, 0xb9, 0xe7, 0xb0, 0x2f, 0x2b, 0x26, 0x23, 0x7c, 0x00, 0x7a, 0xc0, 0x3d, 0x35,
0xbb, 0x3e, 0xbc, 0x57, 0x14, 0x1c, 0xa7, 0xc5, 0xac, 0xfd, 0x0e, 0x8c, 0x73, 0x4a, 0x53, 0xfd,
0x69, 0xe1, 0x11, 0x1c, 0x04, 0xdc, 0x9b, 0x64, 0xb2, 0x93, 0x00, 0x4f, 0xa1, 0x92, 0x3c, 0x4f,
0x29, 0xbf, 0x6b, 0x05, 0x69, 0x8e, 0xfd, 0x06, 0xda, 0xef, 0xe7, 0x91, 0xfb, 0x79, 0x47, 0x4f,
0x07, 0xaa, 0x5f, 0x63, 0x68, 0x42, 0xa5, 0x49, 0xba, 0x7a, 0xaf, 0xe1, 0xe4, 0x31, 0x5a, 0x00,
0xab, 0x30, 0x67, 0x35, 0xc5, 0xee, 0x20, 0xf6, 0x37, 0x68, 0x66, 0xed, 0xc6, 0x57, 0x2c, 0xbc,
0x4b, 0xe3, 0x7f, 0xde, 0x09, 0x1f, 0xc1, 0x01, 0x13, 0x82, 0x0b, 0xb5, 0xf3, 0xbd, 0x25, 0x8d,
0x85, 0x70, 0x12, 0xde, 0x3e, 0x03, 0x7d, 0x2c, 0x04, 0x9e, 0x66, 0xf9, 0xf1, 0xd4, 0xd6, 0xf0,
0x78, 0x2f, 0x7f, 0xc4, 0x29, 0x93, 0x69, 0xd1, 0x93, 0x8f, 0x50, 0xcd, 0x20, 0x6c, 0x01, 0x5c,
0x84, 0x6c, 0xbd, 0x64, 0x6e, 0xc4, 0xa8, 0x51, 0xc2, 0x26, 0xd4, 0xe2, 0xb7, 0xac, 0x7d, 0x19,
0x49, 0x83, 0x60, 0x1b, 0xea, 0x53, 0xee, 0xbd, 0xe5, 0xd1, 0x2b, 0xbe, 0x0a, 0xa9, 0xa1, 0x21,
0x42, 0x2b, 0x11, 0x3b, 0xe2, 0xe1, 0x22, 0xf0, 0xdd, 0xc8, 0xd0, 0xd1, 0x80, 0xfa, 0x38, 0x6e,
0x3c, 0x5b, 0x2c, 0x24, 0x8b, 0x8c, 0x1f, 0xda, 0xf0, 0x17, 0x81, 0x5a, 0x3e, 0x1f, 0x9f, 0x43,
0x25, 0x71, 0x00, 0x9e, 0x14, 0x85, 0x15, 0x7c, 0xd1, 0x31, 0x8a, 0xe4, 0xec, 0x12, 0x5f, 0x40,
0x2d, 0x37, 0x01, 0x5a, 0x7b, 0xb5, 0x05, 0x77, 0xdc, 0x52, 0xfe, 0x1a, 0xaa, 0xd9, 0x71, 0xf0,
0x7e, 0x91, 0xfd, 0xc7, 0x03, 0x9d, 0x93, 0xdb, 0x69, 0x75, 0xd3, 0x1e, 0x79, 0x4a, 0x5e, 0x3e,
0xfe, 0xb9, 0xb1, 0xc8, 0xcd, 0xc6, 0x22, 0x7f, 0x36, 0x16, 0xf9, 0xbe, 0xb5, 0x4a, 0x37, 0x5b,
0xab, 0xf4, 0x7b, 0x6b, 0x95, 0x3e, 0xb4, 0x07, 0xc5, 0x0f, 0xfa, 0x53, 0x45, 0xfd, 0x9d, 0xfd,
0x0d, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x39, 0x8f, 0xb0, 0xe9, 0x03, 0x00, 0x00,
}
func (m *Log) Marshal() (dAtA []byte, err error) {
@ -715,6 +770,18 @@ func (m *WatchLogEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Error != nil {
{
size, err := m.Error.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintConsensus(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
if len(m.Records) > 0 {
for iNdEx := len(m.Records) - 1; iNdEx >= 0; iNdEx-- {
{
@ -739,6 +806,34 @@ func (m *WatchLogEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *Err) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *Err) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *Err) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Error != 0 {
i = encodeVarintConsensus(dAtA, i, uint64(m.Error))
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
}
func encodeVarintConsensus(dAtA []byte, offset int, v uint64) int {
offset -= sovConsensus(v)
base := offset
@ -869,6 +964,22 @@ func (m *WatchLogEvent) Size() (n int) {
n += 1 + l + sovConsensus(uint64(l))
}
}
if m.Error != nil {
l = m.Error.Size()
n += 1 + l + sovConsensus(uint64(l))
}
return n
}
func (m *Err) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.Error != 0 {
n += 1 + sovConsensus(uint64(m.Error))
}
return n
}
@ -1634,6 +1745,111 @@ func (m *WatchLogEvent) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowConsensus
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthConsensus
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthConsensus
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Error == nil {
m.Error = &Err{}
}
if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipConsensus(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthConsensus
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *Err) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowConsensus
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: Err: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: Err: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType)
}
m.Error = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowConsensus
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Error |= ErrCodes(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipConsensus(dAtA[iNdEx:])

View file

@ -52,4 +52,9 @@ message WatchLogRequest {
message WatchLogEvent {
bytes logId = 1;
repeated Record records = 2;
Err error = 3;
}
message Err {
ErrCodes error = 1;
}

View file

@ -6,8 +6,10 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/stream"
"storj.io/drpc/drpcerr"
"time"
)
@ -57,11 +59,26 @@ func (c *consensusRpc) WatchLog(rpcStream consensusproto.DRPCConsensus_WatchLogS
return rpcStream.Close()
}
for _, rec := range recs {
if err := rpcStream.Send(&consensusproto.WatchLogEvent{
LogId: rec.Id,
Records: recordsToProto(rec.Records),
}); err != nil {
return err
if rec.Err == nil {
if err := rpcStream.Send(&consensusproto.WatchLogEvent{
LogId: rec.Id,
Records: recordsToProto(rec.Records),
}); err != nil {
return err
}
} else {
errCode := consensusproto.ErrCodes(drpcerr.Code(rec.Err))
if errCode == 0 {
errCode = consensusproto.ErrCodes(drpcerr.Code(consensuserr.ErrUnexpected))
}
if err := rpcStream.Send(&consensusproto.WatchLogEvent{
LogId: rec.Id,
Error: &consensusproto.Err{
Error: errCode,
},
}); err != nil {
return err
}
}
}
}

View file

@ -5,7 +5,7 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/metric"
ocache2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/cheggaaa/mb/v2"
@ -42,21 +42,22 @@ type Service interface {
type service struct {
db db.Service
cache ocache2.OCache
cache ocache.OCache
lastStreamId uint64
}
func (s *service) Init(a *app.App) (err error) {
s.db = a.MustComponent(db.CName).(db.Service)
cacheOpts := []ocache2.Option{
ocache2.WithTTL(cacheTTL),
ocache2.WithLogger(log.Named("cache").Sugar()),
cacheOpts := []ocache.Option{
ocache.WithTTL(cacheTTL),
ocache.WithRefCounter(false),
ocache.WithLogger(log.Named("cache").Sugar()),
}
if ms := a.Component(metric.CName); ms != nil {
cacheOpts = append(cacheOpts, ocache2.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache"))
cacheOpts = append(cacheOpts, ocache.WithPrometheus(ms.(metric.Metric).Registry(), "consensus", "logcache"))
}
s.cache = ocache2.New(s.loadLog, cacheOpts...)
s.cache = ocache.New(s.loadLog, cacheOpts...)
return s.db.SetChangeReceiver(s.receiveChange)
}
@ -98,7 +99,7 @@ func (s *service) RemoveStream(ctx context.Context, logId []byte, streamId uint6
return
}
func (s *service) loadLog(ctx context.Context, id string) (value ocache2.Object, err error) {
func (s *service) loadLog(ctx context.Context, id string) (value ocache.Object, err error) {
if ctxLog := ctx.Value(ctxLogKey); ctxLog != nil {
return &object{
logId: ctxLog.(consensus.Log).Id,

View file

@ -4,6 +4,7 @@ import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/consensusproto/consensuserr"
"github.com/anytypeio/go-anytype-infrastructure-experiments/consensus/db"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -14,93 +15,111 @@ import (
var ctx = context.Background()
func TestService_NewStream(t *testing.T) {
fx := newFixture(t)
defer fx.Finish(t)
t.Run("watch/unwatch", func(t *testing.T) {
fx := newFixture(t)
defer fx.Finish(t)
var expLogId = []byte("logId")
var preloadLogId = []byte("preloadId")
var expLogId = []byte("logId")
var preloadLogId = []byte("preloadId")
fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) {
require.Equal(t, expLogId, logId)
return consensus.Log{
Id: logId,
Records: []consensus.Record{
{
Id: []byte{'1'},
fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) {
require.Equal(t, expLogId, logId)
return consensus.Log{
Id: logId,
Records: []consensus.Record{
{
Id: []byte{'1'},
},
},
},
}, nil
}
fx.mockDB.receiver(preloadLogId, []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
st1 := fx.NewStream()
sr1 := readStream(st1)
assert.Equal(t, uint64(1), sr1.id)
st1.WatchIds(ctx, [][]byte{expLogId, preloadLogId})
st1.UnwatchIds(ctx, [][]byte{preloadLogId})
assert.Equal(t, [][]byte{expLogId}, st1.LogIds())
st2 := fx.NewStream()
sr2 := readStream(st2)
assert.Equal(t, uint64(2), sr2.id)
st2.WatchIds(ctx, [][]byte{expLogId, preloadLogId})
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver(preloadLogId, []consensus.Record{
{
Id: []byte{'3'},
PrevId: []byte{'4'},
},
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
st1.Close()
st2.Close()
for _, sr := range []*streamReader{sr1, sr2} {
select {
case <-time.After(time.Second / 3):
require.False(t, true, "timeout")
case <-sr.finished:
}, nil
}
}
require.Len(t, sr1.logs, 2)
assert.Len(t, sr1.logs[string(expLogId)].Records, 2)
assert.Equal(t, []byte{'2'}, sr1.logs[string(expLogId)].Records[0].Id)
assert.Equal(t, []byte{'2'}, sr1.logs[string(preloadLogId)].Records[0].Id)
fx.mockDB.receiver(preloadLogId, []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
require.Len(t, sr2.logs, 2)
assert.Len(t, sr2.logs[string(expLogId)].Records, 2)
assert.Equal(t, []byte{'2'}, sr2.logs[string(expLogId)].Records[0].Id)
assert.Equal(t, []byte{'3'}, sr2.logs[string(preloadLogId)].Records[0].Id)
st1 := fx.NewStream()
sr1 := readStream(st1)
assert.Equal(t, uint64(1), sr1.id)
st1.WatchIds(ctx, [][]byte{expLogId, preloadLogId})
st1.UnwatchIds(ctx, [][]byte{preloadLogId})
assert.Equal(t, [][]byte{expLogId}, st1.LogIds())
st2 := fx.NewStream()
sr2 := readStream(st2)
assert.Equal(t, uint64(2), sr2.id)
st2.WatchIds(ctx, [][]byte{expLogId, preloadLogId})
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver(expLogId, []consensus.Record{
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
fx.mockDB.receiver(preloadLogId, []consensus.Record{
{
Id: []byte{'3'},
PrevId: []byte{'4'},
},
{
Id: []byte{'2'},
PrevId: []byte{'1'},
},
{
Id: []byte{'1'},
},
})
st1.Close()
st2.Close()
for _, sr := range []*streamReader{sr1, sr2} {
select {
case <-time.After(time.Second / 3):
require.False(t, true, "timeout")
case <-sr.finished:
}
}
require.Len(t, sr1.logs, 2)
assert.Len(t, sr1.logs[string(expLogId)].Records, 2)
assert.Equal(t, []byte{'2'}, sr1.logs[string(expLogId)].Records[0].Id)
assert.Equal(t, []byte{'2'}, sr1.logs[string(preloadLogId)].Records[0].Id)
require.Len(t, sr2.logs, 2)
assert.Len(t, sr2.logs[string(expLogId)].Records, 2)
assert.Equal(t, []byte{'2'}, sr2.logs[string(expLogId)].Records[0].Id)
assert.Equal(t, []byte{'3'}, sr2.logs[string(preloadLogId)].Records[0].Id)
})
t.Run("error", func(t *testing.T) {
fx := newFixture(t)
defer fx.Finish(t)
fx.mockDB.fetchLog = func(ctx context.Context, logId []byte) (log consensus.Log, err error) {
return log, consensuserr.ErrLogNotFound
}
st1 := fx.NewStream()
sr1 := readStream(st1)
id := []byte("nonExists")
assert.Equal(t, uint64(1), sr1.id)
st1.WatchIds(ctx, [][]byte{id})
st1.Close()
<-sr1.finished
require.Len(t, sr1.logs, 1)
assert.Equal(t, consensuserr.ErrLogNotFound, sr1.logs[string(id)].Err)
})
}
func newFixture(t *testing.T) *fixture {

View file

@ -48,7 +48,11 @@ func (s *Stream) WatchIds(ctx context.Context, logIds [][]byte) {
if _, ok := s.logIds[logIdKey]; !ok {
s.logIds[logIdKey] = struct{}{}
if addErr := s.s.AddStream(ctx, logId, s); addErr != nil {
log.Warn("can't add stream for log", zap.Binary("logId", logId), zap.Error(addErr))
log.Info("can't add stream for log", zap.Binary("logId", logId), zap.Error(addErr))
_ = s.mb.Add(consensus.Log{
Id: logId,
Err: addErr,
})
}
}
}