From faf274e01f956975e77b92e74e2c49ab61b61178 Mon Sep 17 00:00:00 2001 From: "Mohamed S. Mahmoud" <mmahmoud@redhat.com> Date: Fri, 8 Sep 2023 04:10:06 -0400 Subject: [PATCH] Revert "change aggregation flow map to hashmap instead perCPU hashmap (#118)" (#172) This reverts commit b6e2b87386e7d3242fa079768539c5e854ed6789. fix Signed-off-by: msherif1234 <mmahmoud@redhat.com> --- bpf/flows.c | 5 ++ bpf/maps_definition.h | 2 +- bpf/utils.h | 3 +- docs/architecture.md | 2 +- .../server/flowlogs-dump-collector.go | 10 ++- pkg/agent/agent.go | 2 +- pkg/agent/agent_test.go | 75 ++++++++++++++---- pkg/ebpf/bpf_bpfeb.o | Bin 92800 -> 93704 bytes pkg/ebpf/bpf_bpfel.o | Bin 94768 -> 95704 bytes pkg/ebpf/tracer.go | 17 ++-- pkg/flow/account.go | 4 +- pkg/flow/account_test.go | 20 ++--- pkg/flow/record.go | 32 ++++++++ pkg/flow/tracer_map.go | 22 ++++- pkg/flow/tracer_map_test.go | 21 +++-- pkg/test/tracer_fake.go | 10 +-- 16 files changed, 172 insertions(+), 53 deletions(-) diff --git a/bpf/flows.c b/bpf/flows.c index 373bc561..8a4aa232 100644 --- a/bpf/flows.c +++ b/bpf/flows.c @@ -75,6 +75,11 @@ static inline int flow_monitor(struct __sk_buff *skb, u8 direction) { aggregate_flow->packets += 1; aggregate_flow->bytes += skb->len; aggregate_flow->end_mono_time_ts = pkt.current_ts; + // it might happen that start_mono_time hasn't been set due to + // the way percpu hashmap deal with concurrent map entries + if (aggregate_flow->start_mono_time_ts == 0) { + aggregate_flow->start_mono_time_ts = pkt.current_ts; + } aggregate_flow->flags |= pkt.flags; // Does not matter the gate. Will be zero if not enabled. diff --git a/bpf/maps_definition.h b/bpf/maps_definition.h index ca07543a..8b22494c 100644 --- a/bpf/maps_definition.h +++ b/bpf/maps_definition.h @@ -11,7 +11,7 @@ struct { // Key: the flow identifier. Value: the flow metrics for that identifier. struct { - __uint(type, BPF_MAP_TYPE_HASH); + __uint(type, BPF_MAP_TYPE_PERCPU_HASH); __type(key, flow_id); __type(value, flow_metrics); __uint(max_entries, 1 << 24); diff --git a/bpf/utils.h b/bpf/utils.h index ce05dd13..f0932e13 100644 --- a/bpf/utils.h +++ b/bpf/utils.h @@ -253,12 +253,13 @@ static inline long pkt_drop_lookup_and_update_flow(struct sk_buff *skb, flow_id enum skb_drop_reason reason) { flow_metrics *aggregate_flow = bpf_map_lookup_elem(&aggregated_flows, id); if (aggregate_flow != NULL) { + aggregate_flow->end_mono_time_ts = bpf_ktime_get_ns(); aggregate_flow->pkt_drops.packets += 1; aggregate_flow->pkt_drops.bytes += skb->len; aggregate_flow->pkt_drops.latest_state = state; aggregate_flow->pkt_drops.latest_flags = flags; aggregate_flow->pkt_drops.latest_drop_cause = reason; - long ret = bpf_map_update_elem(&aggregated_flows, id, aggregate_flow, BPF_ANY); + long ret = bpf_map_update_elem(&aggregated_flows, id, aggregate_flow, BPF_EXIST); if (trace_messages && ret != 0) { bpf_printk("error packet drop updating flow %d\n", ret); } diff --git a/docs/architecture.md b/docs/architecture.md index 56fa4932..f659b92a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -11,7 +11,7 @@ flowchart TD E(ebpf.FlowFetcher) --> |"pushes via<br/>RingBuffer"| RB(flow.RingBufTracer) style E fill:#990 - E --> |"polls<br/>HashMap"| M(flow.MapTracer) + E --> |"polls<br/>PerCPUHashMap"| M(flow.MapTracer) RB --> |chan *flow.Record| ACC(flow.Accounter) RB -.-> |flushes| M ACC --> |"chan []*flow.Record"| DD(flow.Deduper) diff --git a/examples/flowlogs-dump/server/flowlogs-dump-collector.go b/examples/flowlogs-dump/server/flowlogs-dump-collector.go index bed9028f..8eb925d3 100644 --- a/examples/flowlogs-dump/server/flowlogs-dump-collector.go +++ b/examples/flowlogs-dump/server/flowlogs-dump-collector.go @@ -72,7 +72,7 @@ func main() { for records := range receivedRecords { for _, record := range records.Entries { if record.EthProtocol == ipv6 { - log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v\n", + log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v DropPkts: %d DropBytes: %d DropCause %d\n", ipProto[record.EthProtocol], record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"), record.Interface, @@ -92,9 +92,12 @@ func main() { record.GetDnsFlags(), record.DnsLatency.AsDuration().Milliseconds(), record.TimeFlowRtt.AsDuration().Nanoseconds(), + record.GetPktDropPackets(), + record.GetPktDropBytes(), + record.GetPktDropLatestDropCause(), ) } else { - log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v\n", + log.Printf("%s: %v %s IP %s:%d > %s:%d: protocol:%s type: %d code: %d dir:%d bytes:%d packets:%d flags:%d ends: %v dnsId: %d dnsFlags: 0x%04x dnsLatency(ms): %v rtt(ns) %v DropPkts: %d DropBytes: %d DropCause %d\n", ipProto[record.EthProtocol], record.TimeFlowStart.AsTime().Local().Format("15:04:05.000000"), record.Interface, @@ -114,6 +117,9 @@ func main() { record.GetDnsFlags(), record.DnsLatency.AsDuration().Milliseconds(), record.TimeFlowRtt.AsDuration().Nanoseconds(), + record.GetPktDropPackets(), + record.GetPktDropBytes(), + record.GetPktDropLatestDropCause(), ) } } diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go index 326de2b3..a20e76b9 100644 --- a/pkg/agent/agent.go +++ b/pkg/agent/agent.go @@ -78,7 +78,7 @@ type ebpfFlowFetcher interface { io.Closer Register(iface ifaces.Interface) error - LookupAndDeleteMap() map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics + LookupAndDeleteMap() map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics DeleteMapsStaleEntries(timeOut time.Duration) ReadRingBuf() (ringbuf.Record, error) } diff --git a/pkg/agent/agent_test.go b/pkg/agent/agent_test.go index 1cf3a1ff..2710f3f6 100644 --- a/pkg/agent/agent_test.go +++ b/pkg/agent/agent_test.go @@ -49,6 +49,11 @@ var ( DstPort: 456, IfIndex: 3, } + key1Dupe = ebpf.BpfFlowId{ + SrcPort: 123, + DstPort: 456, + IfIndex: 4, + } key2 = ebpf.BpfFlowId{ SrcPort: 333, @@ -66,7 +71,7 @@ func TestFlowsAgent_Deduplication(t *testing.T) { }) exported := export.Get(t, timeout) - assert.Len(t, exported, 1) + assert.Len(t, exported, 2) receivedKeys := map[ebpf.BpfFlowId]struct{}{} @@ -76,11 +81,21 @@ func TestFlowsAgent_Deduplication(t *testing.T) { receivedKeys[f.Id] = struct{}{} switch f.Id { case key1: - assert.EqualValues(t, 3, f.Metrics.Packets) - assert.EqualValues(t, 44, f.Metrics.Bytes) + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) assert.False(t, f.Duplicate) assert.Equal(t, "foo", f.Interface) key1Flows = append(key1Flows, f) + case key1Dupe: + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) + assert.False(t, f.Duplicate) + assert.Equal(t, "bar", f.Interface) + key1Flows = append(key1Flows, f) + case key2: + assert.EqualValues(t, 7, f.Metrics.Packets) + assert.EqualValues(t, 33, f.Metrics.Bytes) + assert.False(t, f.Duplicate) } } assert.Lenf(t, key1Flows, 1, "only one flow should have been forwarded: %#v", key1Flows) @@ -97,22 +112,33 @@ func TestFlowsAgent_DeduplicationJustMark(t *testing.T) { exported := export.Get(t, timeout) receivedKeys := map[ebpf.BpfFlowId]struct{}{} - assert.Len(t, exported, 1) + assert.Len(t, exported, 3) duplicates := 0 for _, f := range exported { require.NotContains(t, receivedKeys, f.Id) receivedKeys[f.Id] = struct{}{} switch f.Id { case key1: - assert.EqualValues(t, 3, f.Metrics.Packets) - assert.EqualValues(t, 44, f.Metrics.Bytes) + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) if f.Duplicate { duplicates++ } assert.Equal(t, "foo", f.Interface) + case key1Dupe: + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) + if f.Duplicate { + duplicates++ + } + assert.Equal(t, "bar", f.Interface) + case key2: + assert.EqualValues(t, 7, f.Metrics.Packets) + assert.EqualValues(t, 33, f.Metrics.Bytes) + assert.False(t, f.Duplicate) } } - assert.Equalf(t, 0, duplicates, "exported flows should have only one duplicate: %#v", exported) + assert.Equalf(t, 1, duplicates, "exported flows should have only one duplicate: %#v", exported) } func TestFlowsAgent_Deduplication_None(t *testing.T) { @@ -123,7 +149,7 @@ func TestFlowsAgent_Deduplication_None(t *testing.T) { }) exported := export.Get(t, timeout) - assert.Len(t, exported, 1) + assert.Len(t, exported, 3) receivedKeys := map[ebpf.BpfFlowId]struct{}{} var key1Flows []*flow.Record @@ -132,14 +158,24 @@ func TestFlowsAgent_Deduplication_None(t *testing.T) { receivedKeys[f.Id] = struct{}{} switch f.Id { case key1: - assert.EqualValues(t, 3, f.Metrics.Packets) - assert.EqualValues(t, 44, f.Metrics.Bytes) + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) assert.False(t, f.Duplicate) assert.Equal(t, "foo", f.Interface) key1Flows = append(key1Flows, f) + case key1Dupe: + assert.EqualValues(t, 4, f.Metrics.Packets) + assert.EqualValues(t, 66, f.Metrics.Bytes) + assert.False(t, f.Duplicate) + assert.Equal(t, "bar", f.Interface) + key1Flows = append(key1Flows, f) + case key2: + assert.EqualValues(t, 7, f.Metrics.Packets) + assert.EqualValues(t, 33, f.Metrics.Bytes) + assert.False(t, f.Duplicate) } } - assert.Lenf(t, key1Flows, 1, "both key1 flows should have been forwarded: %#v", key1Flows) + assert.Lenf(t, key1Flows, 2, "both key1 flows should have been forwarded: %#v", key1Flows) } func TestFlowsAgent_Decoration(t *testing.T) { @@ -149,7 +185,7 @@ func TestFlowsAgent_Decoration(t *testing.T) { }) exported := export.Get(t, timeout) - assert.Len(t, exported, 1) + assert.Len(t, exported, 3) // Tests that the decoration stage has been properly executed. It should // add the interface name and the agent IP @@ -183,10 +219,17 @@ func testAgent(t *testing.T, cfg *Config) *test.ExporterFake { }) now := uint64(monotime.Now()) - key1Metrics := ebpf.BpfFlowMetrics{Packets: 3, Bytes: 44, StartMonoTimeTs: now + 1000, EndMonoTimeTs: now + 1_000_000_000} - - ebpfTracer.AppendLookupResults(map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics{ - key1: &key1Metrics, + key1Metrics := []ebpf.BpfFlowMetrics{ + {Packets: 3, Bytes: 44, StartMonoTimeTs: now + 1000, EndMonoTimeTs: now + 1_000_000_000}, + {Packets: 1, Bytes: 22, StartMonoTimeTs: now, EndMonoTimeTs: now + 3000}, + } + key2Metrics := []ebpf.BpfFlowMetrics{ + {Packets: 7, Bytes: 33, StartMonoTimeTs: now, EndMonoTimeTs: now + 2_000_000_000}, + } + ebpfTracer.AppendLookupResults(map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics{ + key1: key1Metrics, + key1Dupe: key1Metrics, + key2: key2Metrics, }) return export } diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o index b7d0979401747cc2a100c166a54cac0156314c5b..4af479c293eb0d9fc253c72caa9fbae675edb33f 100644 GIT binary patch delta 23099 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 J3<^##8vtd>>gfOg delta 22375 zcmeCU!`g6_b%GvKD#JvBW=8FaTh=p*ZcbrTV`O6cu(^jxnn`vYD+9xN1_lO({f!`! zfq}gNOq=Ppv8~*Egyp%C`~r|bp#lRNh)!1kkqjJ#0u1aRmcQa;DUI+*2L?_s&jds= zFcc;*Fo9U<2_TYzqtJnY8N~8W0g((0g$@up9YS*y7BDb^MEu=BBm)CfT)^LLa+QXB zy%0pSFo3}Y#7YkUkqjJ#3Jk6wmVXe4WMC*%U~mGl;BHJ{a0c=H)j%Wz13Sbv#{E!N zltW!t%m#5Snz%$U*vAYE3dJlC=a)ka5GZDWI5%AYY_P)Q71|p0P+JB3Rl$NFKZ2D* z{lZZgz~Bgy@dvw^fuS<$zXXV%7z!d882CjY^!`8yT@LkSF)ITXNCZt>qL`I|14%rX z0jfcum=zKkXc{z%Ss_t~CazG-3W-WIaf@Qs$w6A`^_b3)Lb4XwR!J=4AZLQTiDo*; zR&gxqL9P@-7B_-=%b=K*0UScbj11Bs1?7;yw<u<05CQQsrT*^#(f)>$Z)wZ<6bdld zgSdqT40a$o-2g-~aQGX7X$B}?z~2Ogui$S4;a5uiKLKLd8ZwAZo+Gk*v%c;l0nKs- z8Ia(1h~3P(;!I#SZHJ^JhT>)a`oZ!IldbIR8M`)D*?nYWJTp1RL04b`NP>YOdFB5O z5UYCfL^r+3>s>h~KXA~jU-|zUNU(V2|Eo~?3Y5MKr7uD0i%|Lkls*roZ$RnmQ2H5^ zehQ_ZK<UR&`Vo|V2%@EmSN?whVid3Ze;-P}fY6&4InHEe2M0>^ipfr{<&15Uce(0n zTNSVT{|Tg|9O5yK;+6kDg80QN{(k_`<&c7eqj<$+AvZ^Mevnx8ipf!K>ls%}=5n77 zCUYnAdjvsQ=RFdILKz@wcRNHgWATc~UY=$)q6`d~ApM0342mEcn%6+3kP?XR4;E!$ zC=_6j2l1g9lcUgpL1FS9McH}-22HRyG!YakFld4Ju*fb{U{D9~;pRFpXn^?sDj<@9 zfgKXxjQhbkn1KOW5O5T;K-_~SE>X+^aYr#D1K54_(8MZG%*X&PK%o{1_$xy!C^TRI z7aP!23Gx`Y(1NAbLIDP_O1Q@y7{E^R2Pb_72B^4zzc9o+C||)JQgqfc><9aofq`9t zf#LuEe-jdw7z#j2`5_7z_JjS;z)%i$9s@@)69YJ`(8L9bnHcmz`ij{Zz!|9=Yzl)! zF*}1ESe%nV2SmeD1t)_x14BInL#5U~aGVx1G3bI6?1x4fl7-+XLKBxLW`aZwnmEWI z;3z^9*C=L!gd~bMGXsOd<PC=6(iX)`kbo>^gropy#26GaPCn$LJ~>mAZ?eCxG8cm% z$c>^548D_9eDxXKCx`gzGdfOg@ePqGUh#hxNHTl*{}mt_8Ug~@%Qye>oyo|!bMqAc zXii3}%^xD<c{z_TFqj@;U<jHvSt4yeBje^9X%m<x_hi~Dax#GH5GH0mkRc4<bOf#g z!4)S1gUaLsX`<4QbO))P7#P$T7??!Bg+2p=`ed1``dDzS%fP@O$G`ygmjeR><9h}M za1b;wFfe{*U;wA&0}Kp|KN-N83uFnCDb!X_kb?wZHs~-gFu6c&(4G7vE4?0<4cZJ0 z4EStFhuQ#2705OiGB7X|vM_+FA_WEprfvoX25{-Zz`z75JB=9_7#tWFn5Hu@Fc>p1 zD1j_tieq4400qSX1_mZja|BdoKVV>BTF$`0V74jeJ`<zq<Og}uu?7qb+{<|&A#2XS zz|-Br04}h>Wf=nlgB2vK!K51l1H%C@i-ExdqJ?KN0|O}L8Nn4d0|SFU0|V0m1_qvK z3=9nRlOyuo8G|P;$j=T9VPIfkU|`?{<-rsN2G$1*47{MAOo8}|7nH(N85r0c7#Mg# zo&&KP7#MiX85kHO7#P?NFfj0f>_}r^U<2s|xg~3ILV<X_HN-`{pjsEC0%S`B0|TUC z!@$5B%fJ9>1cB7CFo4@75)2HysSFGZHXtzu2Hq?v8>*kd77|qqut>H9sbht3IT#pt z^BEW*btD6W7;iDis~`m+3`vWOL6dn3mFvOPDFXxVY6b>yO9te*El@T%YeQ6nVvlzZ z3&eN<sMEmhFsRc&Y_QXy>YW%Ec#p9_VgTeEkXN8>B#0ppFAFg+Ah{V-4Z2T0P$=!0 z4RR=w45-5M1c@;)@V;SSVDN>qe?gPA7Xt$y6O`@Ez`(}_W&2E4Dbi*%og7dkod{`q zG4O#}I^ZTH0|Or@PN6{nj(w2p1sE9kKyeBc=L2~S9&;cC3=9n5#wjnvdl08EFxX6X z=og>-xJZN-+W6xGl{ayd3(CY9gD1-rFJ}ziY*5b5$QU;HOo_f~BqXT{fLa-#dK6su zGcYhjF)%PZU|<jc)s4}U6-vc<V;C6Vi8prgh6;Vg$jJ{Xta-y>HZw3VL`>dOx|}g` za!Q#ps%7zbElb3(ED6c7WE_?yOxCDuW{jM?rqWn7oq<6x4;s-d3=D#G3=9kz5Qhmi zLt`OxGE0?meK-SykXs7_Lo5RWGY12MkT(MZLk>ix5XdVN7#LU_7#M^=Zen6!U}<1r z5CSFKJ_ZJs1q=*AEes3{6B!s-4lpnX^+0T41+k|xfKwDGzX~m6U|^UJ$*)2iplpzu zgA5E(42vNhA)zx64ICiL?lLei^i4icrEj<dT#!QCvy_2>(}96O7}S_O&cMLgz`!63 zs@f(nfSc{Ypz<$cvO=}8VHyJi*8&Cx;bce-<AN1FCm0yG85kIZK{e@o1_o}BY4r>Y z45ucSR4YsNF);8XFfa%oVPIf5&A`9|G9MKG8zyh4R#vrVVBiC({{u0TuYrL<1e8L~ zFfi~PU|<jdx$4~HAJxkB=NTCIK_dPP3=HB74Ezrm7(_tnYBnRdWEBCWArPC9fkC8< zfq?<UW@2CvX@#<x85l&SfY>Yy0xS#+BB0=#&A=eQ!N4H0k%56Bnt?$;fPq0|CzP$g zz#wuI$~ItNkP`tlZ0#8s1RNL`L_m$uY6b=YkaIy*)XK>_YLx5y7#IW{7#KuBEguj& zfq_93R90PJU=VCzU=Rfr8nYP~1Q#$ci28t>!oVQ7f`LI4lr5qe7z8&kFo>2gFfdGJ zU=TdOz#t0h(K0bG2tHt75bb4PV7Sb{0BY@s&SYR<xWd371hQ)xBv^$S7#QkBH!(0U zcrq{ufi&-ixE<7<5<Ld7Ojv+{K@`*u&tPB>R$yQdy$wlP!XSe{?d#bL48kBsgKFT} zj10mV3=CqRUNVTC$-p26YMahxV-U__U=RbfuC6gK2sbb=h=HmlV}^PL;R6f|VxTUt zF$1_yBNoiSz;K;`LBxT9K@8-}n+yyhAT^-Ky2SwQ4~bPWFff4FAT{k!Hpoy=odpsH zsR#M;4g&+IV<ongfq~&31A`by{V9lgF_8LepfvY@fk6zU0n~eV2u>&rVqX~;7!ETq zh=VkM(%B;h2Jr(74B{Z4RY2LIEes5x?jN{o!@$6h3&|W{vJg_EgV~@=n!vyy4$2{* z3cZ1WK^)Xx1f{si*Xvvo%OORbcr^n9Lp7v)5eMbw8U_YNkYZ47u4iCi1UUc{kM#@; zOb!eT;;R@K7+N5;HQ1syNYy9~@@)qL12ZV?fFwF6*VHR}_A)RqKVV=G2X$c5z@<5Z z_+JJFh7JY>7Dxk_fuSG9M$|15pf*h&$QUTjpZua;nHQ9CK@~eFN(&}SH0U!HP4;Ne z=LMxjs6vL)$t?}ajFFR9H0ak?Km;W~*$Kv8hE`#MVija2C~H;00uWlGfb~GxV092S zV<-cI#CB*oS_`rRTGnzfFi3!sFsQtRR7g+_feZ{1r=W@i7#Ji#eNAvp4${mD2|<wf zO$G)AP-X%-2-I(E0?9KlNPw!>W)K@(o$YTFV2qr6p;25D6d<7X5eox@#5bseK;;Oi z(FAG>axgFmf+EsuvOtr#CbaUD1Qmjy#LvLMAPE{W03~LS;m~FaqyOZ9CT(A^=NT9z zLG8~jur!0D6<Xkd+LR!-f&vd@4><B6er5pcfwH?NpJ<Zj?Sq;Es*3t1e`!+ogo%Ls z31fqrhEO)R4q;$mVDw{PkX!`y-z1PJ&<2?T1A`=}N|`)4p;^3sE+qOS_d``qVPKGi zg*qsdKpH_66Nm;iaX=x&!oVO2iVaXE28G8>Xe@!mL3tC@ItGcqhnhKqfkE;=LJim` zQ1$?ohTob6B|&}z3o<Y;fO{`c&YZ~#E#kbhAv`HiXL9yrmloyvXov{7feT^_Ffd4I zL+zT!z#wG{4RHwu1}RVj3lut_rYfkB1ZprjFfd33K|=!+mmuRn4R;0x2B~;R4Fqb~ z!}WsYpczd7(y(D*097#{LqYA|MIaME7-})BVTq;9E0uyz&18pG@p@=*@XUc!@1Q<8 zxXlhS4b-d!wd+A_aAtrc7RE4;?NBFjFfd5fFfcHH%2kk;KnVrPh9?eC;|!W~8CEbb zNcFHVfCjFZ6&M)mrDiZNFn|mIX`au(zyM0spfFnsWgmcs>q<xwC<SVBr$LH9DNrrd z$H2h2fPq138v_Hw21s!zwFgogfd*OyKzXW<fdOQh)FDv21yTe`frhmD80s0A6Brl- zK_%T51_tH^1_r5f3=9lg85o#B7K4V6b}}%qg2X{p+%8CCND7qocQY_>fW)6OFfi<a zG<~E%#lT($25wMjfhvL73=G^I3=C4gA=M`L1O^7i5GZ>F1A{aZsHOoaTEM^{4I0~w zW?<mnz`!6a2pWfGVBkK$z#t83dLLq7;9+23kOmEXRDgR<4AN$h+DM{-fkD~|nj%4k zKT_Eu3Cba$5CiFThN@Y^z#tt6O&Il1F^09EIAvgv1~r60Sqc;)pezWAa!_=EnrhIr z0#>;WOfrCL444{_JTwDIg9<*-Xgb(@P((o0gXBS3otc3_x{`$<3FKH%zg!wrwSnRu z<Wf+{1d2D1&p@RKsPqE$+d)AGif^!4AX^z27(i)&0j*Q98KeLzzhSaThq)~%b%0FX z%fP?@VuMUR%)r193F(bUpM<gn7#O5M<BcG31qKG`TOjetD>~e5cR<pa45*n0GJZRV zK-3H}pcW0t(+ms@GN6$zaBaZAAOjlAs-LXWdAc4{8Za<0$b$OypkQcVV34(dmJA*Y z46<I3rZ>o3Sx{#PRBj$%V2}khckCgVNj3u<o(v587#L)8LB%7e@MU3ujDJIX%oxqU zAY04=X-b1eK|t-XgOD~jgETk*CO346gW8yk2@DLfph3&okPIaYDttlg4h9BUkP|`d z2@DLfOCV{MaRvi}>>5ZW0%bZ`P(Xts1mw(JQ1J&046+BI-jZNokOl=5D9Axx2L&@I zkQx{mCX01TG9H+0&@EjLYS4pZK{*W6P)4q#K#>G1J3uuzdQ^k;BBd|TI0z_xfx`k( zM#+N4bV219$ey<h3=ANbfY`rT7$%?U=4Eu8e52c#@$6)t9(CSe1_n7@Xh8c;cIXkW z2lcT*DHRmrEDQ`%prIg8^A|MU<O5X+9&!g;3(4a!SA$yn;0_Q210$${fQmClGBC)& zDh2@t202g;0}ov@Fvx+%EkISQ0|SFx5opj5RP%t+0ZcQf(GO#TyXX*$89+gZ9z@`l z1XLc>a|6kPxF8HlY+!llKnc`L2Jp}~FQnaL!vGzMfhh#fBA{wu1l3GX&5T|Q402V_ zP<cFgLa)3eXe5Gxfk6S31wd>A1_lLCPd0M$iQZsIP?;mZz`zJfs35ii1A`LC!;zCs z`jmM=<tx~W3=9k}Ca3f%hrR^4nt?$H)Kq>2VZ+NI4hBdX2c<Glh6klS5F1>cK?^;s zY9`<5(+7`|a4;|^gF3sBlO_6<8Q)H}>DLc^2eAcgBdALQ=0Z&a6%(Lb1uDv6HiFoo zIslYrK*5Yv&Ey09;@|-d&?qIyFCf1QFfgcsTKrHqtAb1_nEa=|ITR#Yz`&pcDrG@o z(!ju=3QBVz@d*qJ>Ip31KmgSfs-ST!kT{yj>L9&Plhr{TlTVYcOt7v8nI^!%ppnMF z!0-hWO(5^FLQG>}V9)^du|QoP&<HB1%?~mG#0I(f8%Qk!g9gaW-yv+UMv$*TtuR=e zg4BbGc#x|=-5prSurM$PX@I(<APJBnP&+Sj@`8zwu^u!JfSV~Gm7pX7^33zeUnc5< zlZXHVgBGa%_%+#Jl6WSl!ewA!&;pI4f_iEoHmDT{b)pui5e4ezfW%iaFfjasI9&@= zp#6uiA&DQ#26-7&tbhst@JJ(6JaY1eNz%L^7lGUk_Tc0jla|+mM8Mtzg#!ZvBO?QY zeiI9L+zvGCiEFGE>_1Q|v4Md>e=(#$Wmo_k-i34s89@0L<PIhV2JS_W`b&Q^WT=-B zY#kG%xM5^vV6f<)%rT{$apvTPDeAgxkWyX%l$*pE7?>0o7%V`Z2eCnIJ<#|ph@HT| zV6kQLl_|>gpmYrqdBDJ60ctRbLjuL(5(5JxJET!%aTm&7z`$SuN=f37-l7F)Gy}wT zU|_HS1uuvVF2WcX7&#y#RlK0GKo&AOWeF-U#33PM32Od`Gcaheg0n3H10xp$1FHiA zgC(df1X9$%z+kD&03O9)UBJL#sXuwaRQGxd1_nk@(F~3pa8NKXf(JlZA;AP1Q@zN* zzzFJJA*%ruMM$A)>BPXm$il#2=>`o|P}2(}4>FR8fdMAZ0BQ&eGB8-q2P<HxX9V?% zK?<SK15@bt32G2hl3)N&4T4N$U|@jhgK|MLv5Z2Hwj!f21B1Ug!~#Z8w*(To42+-w zEyxrh14ADJL%<|HP+7sizz7=K0674r5EN!Gg|itL0%n74V_*a|P#GB*0#>2&p)Cal z22dm*rFBMGNNW#NzyxfC>H*ER!0iIrFT=nPum>s$iaf9+QvGZSHH3wMA>as99jLhk zRtNDuBdEy)bv$VDFyJgy9jGsYtPVWu1!^^eid_bVfcmRYg`gQcWQCv}GR#0;28MvU zP<5c0KxB2G5lW~!Mtuf`fTz$R9yGfHD##$Qzz_gR+ENS*j29Rf0)9iy(gju1$cBM( z6VxzJuPP8ay~PNcECj2Ax*QZD$iWPn(E$}T8Vn49+)%^8YCtI#5t58Bbt()Dfl6R? z$_$L4A$X8FYz9g&Fa&x{zB5DG6sA>-fgvy+td)TgTE{~&IM@gVxD}=h41r~nb!H-T zDl#wx_Cj@nTIyg8SRALyz!11{a?MQXdYGNc3=DxMp*lg61Plxefe-j0`5x4m1r2$E zOygi+U<6Gh!Pua&F&G;(yaZ!|TGLQ=;8T8Z-2>u6TEx)FG9^&lfJ8wl1{CQqHh2OT zRB|&g1it16m#iQuMo<w9Vt{He@DdA<%NQ6K!Al;XY*2$Aqz06=L4$Z8HptPSZW$=$ zYcMb{S}=fT)EHD4>KPb8W1FC%dkF>xMo?1}R9lEKFff9eQ=pLuQ%Db&0kn=mk%55` z)K~%)5~>Ugj4liejG*-upwRow4=K$+?f{j6Ad6WT7y^HTh9N;528JL`B(^k&4Jz|N zt<_`@2dYQ~iLHsmHb!E5BiIth5bU6^$vv~JjDix8gffxX6-exQBzEWKAG4ixCd;4X zn%sJ#XtKdc`^n!=SWeDAnKU`#1^;BzC;F4KUI<NYOOe@Zf67N@^2TS<ldqi+oZRzF zbaMUkxXIT}2u!v<Aw2ol3%<!F&*di1ea^A@=kr|ldd)u!3|bKk3>=`4<zQgo2K5=i z*^GgK!GeK7AJnmc@)?;K7%V|GG>p&7z+egL)<DW121b4c2Fn|e5cdaVMVLBJi6{Uy z8&o?pFfeeRVqoBY#IX74`!x3Y00sv69tH;O{|wB3xFE9?AbIV{3=Aj47#MgmAnMf` z85qtuFfi~`K=_d8fXrxs^{;1O{-Mgiz%v8Qyaf=xjuHb4Xl(({2Pi+7frUkjfuWw) z04e}gz}o=jLlyA;fbd}!g0dmVLLHF25d#As2Sgss*J5Dc6M*u28CV3&7#R2>p!_oo zEIft`415I;zAh^R3x^>?Jp*Xg1#X}g0|P(QK`;yXEub3g7+6F^85sBzp#13!ETAD} z{t6_%ECU072b6z^fklRofq{PqB*gSM7#L+Z85sCqK>5B53{NEL85sC~Km=eGf_m$q zDA225V0a+}nV13dr!X+Qk!4^Iuz;x7+r+@|N0@;@AOgz2#K7<aq&@-4hsifU`7r$* zP(Db$9%R4_sK6@*M$k$Ifdx=LNC8M5=3<xuA5i5%NetP6prI)+AF3ZTEd=I6^$S8B z0P--X{sqqoffVTTGcby9GcX8(Ce=<cFz81yFiLPj=77NRAie|xgCNua`V9<>9iV0^ zD5F3}@bn)sFzEkbU<7rZK?N#^&m+aa_=c5%0n~m0^Su}tKY$uu3=HWEAOVm|Kp51> z1Mzu43P24o1qQIZyc7c?Xk>{|1IqVfVB`Rmi3Uh~K?Vj!4=5j|z5>EGaGreTmlu=% zqs<b({TP|_A5G5qV+W#E{P6=(KmL4H%wk}U;bmapm;lw%#lUDG$iToc1IC}s^G^z- zSmPg9YX*c`@vo@f;1~n5iXa06Cp5Ex`C<$VoExBeUokKih%zv6?m*%zGB9vHfbb19 z7#JIZ7#KJ|An}tK7&w0*@!cSeEKu-()h9DBa0!6r>lwfTK@1FB5?}!cpOb-s3mRUA zlNlIW_!t<tpy31N^D;1S1whr`VPLqx$-ux3<r^t5FkAug3((|GK=`1z0%0Bw5Wk** z0j7cH21tN`!6=1+u|tD_fd}eCqh$;X8-y4bcwRu|4>B-pkz-&06-OW+8G-l`3=BL_ z9~*sQU^pQIsa!$w#<C0yM?ieAg$xXaPzQt7f#}yiLO6gI8pLn~2Ot(2doVEe2r@A6 zLLCU_Lmg<`%fL86ih+R_>Oe4Glz{<M{DB<+l?N4XVE!%!#wmgf415|44D}!Z6J`d6 zJ)8^-d<!5Jnz%DC902j52Eyd|q3H`IF91!#FnIxJdIJS72n#?R3|9{gA(L(f#wAh= z41ydC_24{WvYvr)g$4tIAS6*Rz=B*5nkK+OEC(65200ka2W4hx8i575Ak;yyAQuGH zgpU{)U=9?_K=q*DgL<d{Gz0`;KK{VKxJHVBK?oXWrX~!Gpfn%^b)ab&1LGEH1_mK$ zCI|BkKz)0Nd8WM#j5`Dw7=)k>0EGq!gJzyV9)Qc&CqOiSBtcjR>O#{K42*j$85o41 zsTj<+V_*PHSAz@ysRd!74v2m;F$RVh6$S>O6%f9jF9Sn@1Oo$TfdfdrSt<iV4krVH z5HyW}9jwQ|P%m@=qQR`4fuRNDBWR*BTgJdp!NtHJ1Pu|hhYSook_-$&(0mS;hsLQn z69dB(H3kOIv^mH^Fkgj%K^Pi>F!i9Rbg;Y~1H%Mm(9}0Hj?F;=ijetru!0f>h6a!U z&^R_<&cILuvH%*S<}i5&hzH>E&~gH9A+%gDzr(;V1Ee1`*6@gd0U}?|z#t3_Lbw8G zF0kNXVCax$U=W6ugkZiT1A{QMAb}VFnXd;q7#5@=P!CyXGce5IWMB}1dH@t%APkz* z2dTFxW?=kM&kAjuLEB=MDGUsj6%0%YpuU#?0|T57Qn!YIfiVDN1XO$z0|RI#8MKT8 ztnLTILeTsIoDb?Y8$i{A<U!4Q3k1J@4yZ!`8fpMp3{wz*P%sD7e=9)Zg9aQx!x1SA z3|2M_3>!do;|z$ryc7e&9uWTqgm0C>z;FcAJ%5122leScK==%>ehR}6h=A2*28I)$ z4h931e~N+Of+l1D1>_@ZMh1o}p#A~0p=Pbkz{DcTz`&>gX*YrSp!JmwP<{*plL)9T z-T~!LV_=d1jgm`1`IiJ3m}Dd%V?&^Zob{#YGHi_U^-K(mCGrdmOdb$*Hu?;V6`TwV zOwjh5O%MZP56B#7gV3gjfpG$e4{g7}<!?asL*<z@p!{PDj8j09DbV(xtpo$(3=sbW zL|(`?i-B>8E&~Je1&Dy{vgv2o80Ca)&oVG<kz@dkCW4#Zwr8jRVPljJWMW`EA`cm4 z0(k@E-V>Y*3@j@k+U=Mb81Jw$Fo2dqf#mJH85ke1GBB_~?X#QA!1zX&fq@NST@E{= zoD$4BP>%+r56tI<tR)8V?aobK!_Fu#D9pg{Lz;ns1L_@n;punS8TCQ!L$EM36zoCD zK+TjF5LemzGB8Sjv_aeTU_LKog%!wj`*sF~8<GqRoX}=Em=BVN#-9CN21W~61_n-O z?1TAy3=EvmR=5z@KxqaBPG~dS-go*O4n}!Fn7J8HceGDG0}_TAcK|B9clsX=M(O$# z1_t|I3=Cf+7#O%XAnDRU9@1O}HDW;N5-cwWX|sU%4z>)89H2G~G-JW}0SpWd!3+!z zxeQD^tPBiX9Z>!f1||_91_rJPNPIB{2Cf+l4E10QAO#=|3!n<lGB6(CXJ7y=B?HMj zaxpMo0X33tK;*%EkOLkd@j({6K;la=FmQc9;)^mcaQ#5ygBnqw916C;hJnEYBmmRU z#J~tzZ^jMN0F?*z`M~PeGBEgXGBEI7fEWlVwHO$9Vfx=QFcc_2+9+W4AoJ8ABZDBm zlLiAri3q5RR*z}`p9F;O<ix-bAjQDIrvTx@EZ{SM@SU<57(zhu7Et~a28Ie5NS_XD z0f;Zg0Pezp_;CHuC~?}!z^Ee4z`$1z4RS}QkN7q~41{Yq0O30`GB9d@8cipld>IBt z9aRPfK4=IygZL5*41CZi0`rv_82F%3;_Su1=)udtzy}Q>=X3_f5FrMJdVUV5f%OcG z2_g&({7@e|A7Efi;bmX|buvLd0P|%S82CM)>R&N1W`N`?Abb~X28Ii)kWM8?y-PX+ z!xcry;y^He76U_%9AtqYoG;E$5AJn>1&%T>Oi*E9;D@@<1;hvSTA^vc<qreH6e$J< z0S%~yAU>!M2#pfByaSp%G*`IFGcYWWfpkhi_JR3o^$ZLG84wL%0TBiUfdVK$g@IuS zD+7Z7G>BanFfgoOWncg`1HlH|VPIIp%D^B5b%2`$q`ne{@k1CGwn#BBfR^!r)VqQB z!VC<;PzSk{GcfF^2PsH^SO^vXDS!qk%t4^Fd|(4+F)-XQVqg%S0a5SH$iVP`lYv1P znugpJ85o|ZF))ZgEdcX{7#Kt%pz1;LybKH?Q2X427#Qkbs4y^yLQ}naBLl-53CM~_ zkcIBg85lkYGBAk33;^*#3lyOt<{`?!@C76fEm%C_85pPVGcbrk9q7@-z~BHf59&aV zxeN?3oD2+NF#dgpdWHl}1_p7c04&vuLxUWa4aK3U8ZHk_)v#<R4ox$TpnR{!z#tAy zGq8LP8i53P2rRF_z#sul^iEUiA^BDUny8$h`BnlNgfI&wpdsL?$iO%Uv~;Zj5~QGU zfCZck3=&WugZUB+3=+_6>{-je_(Yh2L1G6)J($nOz#sw5)}Hks1t0-vzIKF`bdpdF zj-Zl@pMgOVssSc11x;kIazh&G0GNZNVfsNK0-7*|=?9so&cGlIwXYr)MAFb8hZ_Jb z+hI{44GnU*JS>QzB_U`q7Zk+c5R_qHkb#yXV7?dwgABCXfa#Zkgm66rtSFR$CMsA- zCj-rf;F3(0fk6hEE5LjS1_l{u6oC243=A^RL<lSCWS}7eE9qpQQQ{0O=w!elP|v^s zF4=e)7-XP62J=BafF>$uXh|mv^%1P311%*1`50Ex$wEEg0xjuep=CXoFAiB70#*+y z*i;x8WI+zB4`yJ1m2|SuTmUP{WT8<4<_j}0$U<`gm@mb^APbEWFdrljjS_IVAp_aG z1F{gzS7Tt16M!T_Fkgg$K~4f%|GPp<Iyq<%!%8|isD-Z3l1?7Vhm~{+Fg~bclVV^{ zfI0|P(kVb41TNU57#I|x*$&JXW?)cMV5kSTSYR$vgl0oGXi29CEz4mgogy?5flD?u z1_ni_1z^4qXjc!!hhRQ01A`LOLQqKuD(IA;xd2wsDZPN!|FDt{Gy?z%GB96(fk7D> zWU!J>8Jg`pr!g>o5N2RdhSvXJJ|6>vGStCvKGeaml1~My9#&GS)I&AE6+ly|$9)EH z$*2Y`nqk>S4Qc?aBvXUxhh<|msD*I#(1Ht=jn$xKKTN(}4VukhMX4Gz4S@5l3<HB2 zD3t~?Fo5}D3=C?}AcPs92F^wd46u?>4Vr7fB_SsRgE}+{z<db?26a>q)ibDjKw7<? z>lqkTOc)qI%PK&vTrYk|i$@*WJ@hhUU^I|tU{Hs4@4R9d7<CjG7&M@*V3@o{0>nJ8 zCI&_qbp{3v(2RBp0|Q(=Oh4GXdIkp2ycpQREewnn@(c``3aAEXLi?*=3)C4HG+`Ei z4Pao<f_9|69xyPP7%(tsNkH|3_*x7MS_hzfkojs13|c3U`1SG(3|cRs0#FxgYasCj z85p#oJ#4U#co`V9p*?JGX$D3QH3kN4sD5v62F4H(1_m9d13(2?1TO=F4pcvwFT=o~ z0}V0nB@B%91t0|#5DUHUGB7qMGBD^sd*I&x85luh6gm^o<e@!sA2|lb9(4u=9cU24 z^+SE=6TrYYLzaO-=K`vJU8n<n3K;4cL2Wu+XpqAU(1mvKeI_t4t`T7XZvh2Gk<Swb z#tpm-40_O>lFuIo#uI`J40=%ga6U8yedQP!&w%8iQRo}Vz<5KBfk7_<;vnD1dIrWD zG7JoQ&^Yz2VPFI`vGh8i3SKfWJ^&d24FNwE2F53%3=DcJAo6hj1}I;Pf$;@M9_j(V zCI-eIQVa~n&=B#P&%pRco`Jz~2ULCiaRw&P8V5^g5a~BCFbOa+Fo0&vK)qCdM+OEB z(2UvxNVgHp=VV~8g!Xd5e9)>1=wuX_F9F$+2-h#dzyMm(3g>e&FjzsyIO_f585j&e z3ZUIyFkgUy!3x^#1@l1$Lc6_SzB~hi6|~n2=1Vg$SV0Fxz<iK?=-`HbD+7ZK$b9H@ z9+(f3hs=J}Gk^s^7C`&UU_QtK=;#NS53&H-{Ri_w20%wc{MR!ucz`UJ01Y7!A0!W* z?*q$&_|VY`|C0<10U-4oK<eum7{CG`1<+v}I3GHE;s2O{Ap)cUI(z}<gVaL@9^iaf zl>B920QID-paT#7AU;SvEQ+9fYtX<$eGdaefHVU`h6n?LH8f7Zd;taqYiN|f`Oxv5 z04oND0+4!Wlz{ml_0TAR^Py1?5Xrz$0a6c*0x%z>K7xUv9+W8H0?;T3s9<1d0BL{* zIhYU90G$DamHpPxAl7eSVCZ3FU;t0=A`LbA^D!`)APqHw`JfRz*tD-6Xb1NX1_scc zZywNQRnROvXjy?J1A`!V@R5Om5wt$RkbyxEv^)<a4_c{~&A=cB-4g`bvcq7>z#tDk z!-Ii=38WsxKMQdt6KL6hB?E&3ba?_3X!Y3>1_lMtCMb~oOdx~d0t^gHpk2LB7#Ls< zVg?zA%m=Nz0;z{uzzo`CV9CIs*aoqX8MJ*H$wC&;TCZme3`)?2`K+Mc2#62b{sNk1 zWCi)?83ThdXt4tW0|P6_K}ZII#??SRg!zCK6k@L#7?h#QHQ7LmBa!&vQw3f#FsOjm zJTNdYu!D95An`dsA^aK=q9FUhGkG8jz)OV~7#KL9K7v`u0a{7>0TyHo3>=^-%nyhV z;smXFwuI~s2ZaGA$U>wL0L|7hd_<@RO~!%v3c;Z8XJBC90xeQTG5|Ci2XYY10igYj z44)AW-~z4Y{)}WG$brcEK@LQ605>QN{6MJZ1}(7t0WuHle+C9_sEc7Cz>O9Hpn)ic zpCAn&|1mItruRU6SQ-J%{ev8=(+QCW%~c`u!3!opE3-a8mM_BeG1i0P0+d>zsh1Jz z5P4|g0xb*&83YRnMvzZIi4UB5Aw$ay$b8TUK2l<30-1-*2PH<3dZ_vJ%%D|tNQsRZ zlsb`ujs=wZL8%p*dO>?)89;nc>IE%718o{bPQ0MiI!NZRLOlrc04pf>AQEdm11l)I zAp{uMK<iGCQY&b5m;sp&N^H>73kqy@Xk5dhjvZtkk_R}@;+_K@_aNQ%3=ABgf&`Qp zpg{so?MR6UoZ68L<OGEfQf>eZ5QFCLVQ~sh{T~<@3_u%XKxZRB9RzbAI5)t|1EoLE ztQ;tgVTlL4dd3K{ED5yi)C#nS095jU7DTZ!Fjzs?;DYA-k>j2b6f&T=g{BQ~+ChqY zSlWR(lnK=T0~-MKIcNd_9JkQ8W(GwCQd~2G5)V>bvw&8aB83DCD6Wyp1s0HlkfN3q zlo*luD?s@lDQ?+7i3gbvvJfe*L0g2N1qUedAO#gt!2;Sbja*J}f^q{=Il&1k`$16+ z4I$16pzud37&t)|BIR>VP<H!?C^$f?3_(%i0A2>lz`zAc{T~oTHy0?bK|LU-JU3{` z*#`y&N9Z0&QBa70LJS(>67`^x3`qlM+y|7HU>ZOjP7ohfH-I{jAie_B0L=&n29Sdw zwHX70P6sL<)Q$wHhdJ01RCgdbxE|CHL{?x0%I_Z-7+{If$^)`G1!e$f)(xcIAG#6B z3Y2@0)q`q3BnzxSA&TTdD`*Ho^;<K5nn54~13+_$3=9m`&_omfU8ZRbbwB`UzY<6u zR9k*vU<fFl+?c8~y+w)9ib?Rp^aDza%95a+G0^r0Gbp6NiG+cHsdD-sB}Vt@zm*ud zr~4^08ZcT;uUBSNVHBCZM43@P7gX3owQ+)yJWLyCe+N{Y8&qsT#aTdmKcV70pyCrM z4sHm*#6f04#hE}s1Qq9hG2KChQJEJMeK4UN(+gA>gBi7_A5me{XM8&Siwa}8Bxsue zbP1>ks04$VHDh{<Dx;GhC|;TOg9-(x1hTt98|R>_>_Ghrs0s!qP`LpWX948|s08!1 z=^|>3?zW(P8Bl3vP%?o@gF+H24lcW3;-Hv@inDM`f1t)FHhrBMqv~{Tbw(c0Y7wY9 z2IhOy->5O_+k$dGR6S_D4@{Z~$$SnZXEA|JVSuXVXqdi0ol$Iho;suI^xqnc+;-qn z7-|F)sDOm21m#GmI16Y|C{!F=G(g3fd8Xe{XLM&gHeE%7v7B-5^f?-g`n;gkq)^4` z64M(r8O7AVxeuy|1+?uNDlZGF0-)l|=cbEjGP<cUfez?^%IhF|1GEVQDy}_!x+bGC zFKAL3d`b@k1B2f5<C=`hQp}(Q&QMi)ph5>``nTyUT8#QUpe7+y+G@JJ7NfY4HK^4G zQw3kl&A<T8uuyR((569{wub2+R2jt>t*6h|Vzgjnn0`Zx@iXI!>1VVV<0W}P>$#ws zK!rMp$-%(DykWYF4x@g(43adch=xjoDA4i%2GBV=P-{R7s~A9AaiM%ZP~rz=9w;9) z-^75-2bl-j(+ZOZWp~h798f-J@}nNKvk(?wpvejpKB(=8WPm8Bd_Xb)G<1(_A!vsu z_=FRv1)zawWO>jyF$(_#sFFgmKn7H%BUu0%v_y6gXpj+w4=VAH^n=C}8IbgYM$nKg z1dX5}J5U|86cbs4I;d7dT5+olau5<9H2#BZ0BF1iSwCoW1=)e1(G+C$dY}>*$$@&H zWkd`}xls?4W08EM2dc!7G=LUyfTIgkT{18*@PG<1BnN^H8$oseXpRwu4@w_M=GTK( zt|I#Yv~m@h4?4O7*#OWoO=KT|Ge0Q4p$_5&osklQC_O=I*BFrapoLmUe0A`d9!LTV zpoLM$7J^pgFhowDqR*%e-hc_(`~_O;3_5HIR3N2;TFT(;!eD#{vY#5f$^s-0N*<un z9;O~tUVyeNLiykhG$`<4d{Ef~3QQOul=nda2Ibd-#vs9Ng$kH}aug_sLaP%KP(=y~ zT^Jvv8I)sTd{99M+CK^7gQ^zL(Uveis8j{THjEES4G4Zcg9&K+J3@fL1XNKV^FgOO zA@f18fy@VO7)0iS%0py6D7}MDbAo!10koR|RGEVL(`^hH-5CS7w-_>7bBThC1~n|e zQqcCA`1UK-jNV+Ppkxl}lR@P~L8%m(56WhsL<5rtg%jiU5I4rxBK4q71gOA=%4vZL z9b`TzjNndUV9){$W+3xHdw`Mopddl!gLdK~^FiCFk@(y9MKd-sg@R%V$#=S-b~`d3 z)KEd@gCYi*4_c;=%m;1t7vDZ5j`1{OD9FV~zSjr27?}@pF)|<IVq`wZ#mIcnmLJCL zTM`(LFbT#drDUcirsZTLq$i7u`uYcMf0@h}$;4<e-8zj?Z+c}KqwVy4X^i@emeZf5 zF}gBZPFG21jGf+@&e+OmIh{R&F>HEj24g3q_4M}{jOJX{pe`VI|JrneOhz*%-v`q( zG8yfdk_@J=0Mh}}Ux4X?=^9y#c1+1Dre}cZ4bxXZ=@(gyc3df-6aYG|rD(cAHlrEW z8}I=D3=BqFrWa&0nhD8+QUGYU0#rqUHjqS2-;vFz$E2At{Y5sT9g}v&bd4NFJ0=~D z=^0?UV)_a&-7)<In4U3RBbU*R3tZrW&Zi5QUXaUZ#*`2-eFaE70TiF0l48pAf-FV} E0GUaMApigX diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o index 6cc2976532c7ce9021e109fa087c940ab959b188..9178cef275556d76f37c51fb275a15bb808b214f 100644 GIT binary patch delta 24260 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	=YdBZXkIB6s?H0lt|Sy(go5fo23?3)J$U%R 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 delta 23488 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 diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go index 755016e4..8d505bb4 100644 --- a/pkg/ebpf/tracer.go +++ b/pkg/ebpf/tracer.go @@ -377,27 +377,28 @@ func (m *FlowFetcher) ReadRingBuf() (ringbuf.Record, error) { // TODO: detect whether BatchLookupAndDelete is supported (Kernel>=5.6) and use it selectively // Supported Lookup/Delete operations by kernel: https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md // Race conditions here causes that some flows are lost in high-load scenarios -func (m *FlowFetcher) LookupAndDeleteMap() map[BpfFlowId]*BpfFlowMetrics { +func (m *FlowFetcher) LookupAndDeleteMap() map[BpfFlowId][]BpfFlowMetrics { flowMap := m.objects.AggregatedFlows iterator := flowMap.Iterate() - var flow = make(map[BpfFlowId]*BpfFlowMetrics, m.cacheMaxSize) + var flows = make(map[BpfFlowId][]BpfFlowMetrics, m.cacheMaxSize) var id BpfFlowId - var metric BpfFlowMetrics + var metrics []BpfFlowMetrics // Changing Iterate+Delete by LookupAndDelete would prevent some possible race conditions // TODO: detect whether LookupAndDelete is supported (Kernel>=4.20) and use it selectively - for iterator.Next(&id, &metric) { + for iterator.Next(&id, &metrics) { if err := flowMap.Delete(id); err != nil { log.WithError(err).WithField("flowId", id). Warnf("couldn't delete flow entry") } - metricPtr := new(BpfFlowMetrics) - *metricPtr = metric - flow[id] = metricPtr + // We observed that eBFP PerCPU map might insert multiple times the same key in the map + // (probably due to race conditions) so we need to re-join metrics again at userspace + // TODO: instrument how many times the keys are is repeated in the same eviction + flows[id] = append(flows[id], metrics...) } - return flow + return flows } // DeleteMapsStaleEntries Look for any stale entries in the features maps and delete them diff --git a/pkg/flow/account.go b/pkg/flow/account.go index b88840e0..d23223fd 100644 --- a/pkg/flow/account.go +++ b/pkg/flow/account.go @@ -65,7 +65,9 @@ func (c *Accounter) Account(in <-chan *RawRecord, out chan<- []*Record) { alog.Debug("exiting account routine") return } - if _, ok := c.entries[record.Id]; !ok { + if stored, ok := c.entries[record.Id]; ok { + Accumulate(stored, &record.Metrics) + } else { if len(c.entries) >= c.maxEntries { evictingEntries := c.entries c.entries = map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics{} diff --git a/pkg/flow/account_test.go b/pkg/flow/account_test.go index c53df299..16005493 100644 --- a/pkg/flow/account_test.go +++ b/pkg/flow/account_test.go @@ -104,11 +104,11 @@ func TestEvict_MaxEntries(t *testing.T) { RawRecord: RawRecord{ Id: k1, Metrics: ebpf.BpfFlowMetrics{ - Bytes: 123, Packets: 1, StartMonoTimeTs: 123, EndMonoTimeTs: 123, Flags: 1, + Bytes: 444, Packets: 2, StartMonoTimeTs: 123, EndMonoTimeTs: 789, Flags: 1, }, }, TimeFlowStart: now.Add(-(1000 - 123) * time.Nanosecond), - TimeFlowEnd: now.Add(-(1000 - 123) * time.Nanosecond), + TimeFlowEnd: now.Add(-(1000 - 789) * time.Nanosecond), }, k2: { RawRecord: RawRecord{ @@ -178,15 +178,15 @@ func TestEvict_Period(t *testing.T) { RawRecord: RawRecord{ Id: k1, Metrics: ebpf.BpfFlowMetrics{ - Bytes: 10, - Packets: 1, + Bytes: 30, + Packets: 3, StartMonoTimeTs: 123, - EndMonoTimeTs: 123, + EndMonoTimeTs: 789, Flags: 1, }, }, TimeFlowStart: now.Add(-1000 + 123), - TimeFlowEnd: now.Add(-1000 + 123), + TimeFlowEnd: now.Add(-1000 + 789), }, *records[0]) records = receiveTimeout(t, evictor) require.Len(t, records, 1) @@ -194,15 +194,15 @@ func TestEvict_Period(t *testing.T) { RawRecord: RawRecord{ Id: k1, Metrics: ebpf.BpfFlowMetrics{ - Bytes: 10, - Packets: 1, + Bytes: 20, + Packets: 2, StartMonoTimeTs: 1123, - EndMonoTimeTs: 1123, + EndMonoTimeTs: 1456, Flags: 1, }, }, TimeFlowStart: now.Add(-1000 + 1123), - TimeFlowEnd: now.Add(-1000 + 1123), + TimeFlowEnd: now.Add(-1000 + 1456), }, *records[0]) // no more flows are evicted diff --git a/pkg/flow/record.go b/pkg/flow/record.go index f3e173da..9b28caab 100644 --- a/pkg/flow/record.go +++ b/pkg/flow/record.go @@ -81,6 +81,38 @@ func NewRecord( return &record } +func Accumulate(r *ebpf.BpfFlowMetrics, src *ebpf.BpfFlowMetrics) { + // time == 0 if the value has not been yet set + if r.StartMonoTimeTs == 0 || r.StartMonoTimeTs > src.StartMonoTimeTs { + r.StartMonoTimeTs = src.StartMonoTimeTs + } + if r.EndMonoTimeTs == 0 || r.EndMonoTimeTs < src.EndMonoTimeTs { + r.EndMonoTimeTs = src.EndMonoTimeTs + } + r.Bytes += src.Bytes + r.Packets += src.Packets + r.Flags |= src.Flags + // Accumulate Drop statistics + r.PktDrops.Bytes += src.PktDrops.Bytes + r.PktDrops.Packets += src.PktDrops.Packets + r.PktDrops.LatestFlags |= src.PktDrops.LatestFlags + if src.PktDrops.LatestDropCause != 0 { + r.PktDrops.LatestDropCause = src.PktDrops.LatestDropCause + } + // Accumulate DNS + r.DnsRecord.Flags |= src.DnsRecord.Flags + if src.DnsRecord.Id != 0 { + r.DnsRecord.Id = src.DnsRecord.Id + } + if r.DnsRecord.Latency < src.DnsRecord.Latency { + r.DnsRecord.Latency = src.DnsRecord.Latency + } + // Accumulate RTT + if r.FlowRtt < src.FlowRtt { + r.FlowRtt = src.FlowRtt + } +} + // IP returns the net.IP equivalent object func IP(ia IPAddr) net.IP { return ia[:] diff --git a/pkg/flow/tracer_map.go b/pkg/flow/tracer_map.go index 1cfd6d6d..e46ae4be 100644 --- a/pkg/flow/tracer_map.go +++ b/pkg/flow/tracer_map.go @@ -27,7 +27,7 @@ type MapTracer struct { } type mapFetcher interface { - LookupAndDeleteMap() map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics + LookupAndDeleteMap() map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics DeleteMapsStaleEntries(timeOut time.Duration) } @@ -96,7 +96,7 @@ func (m *MapTracer) evictFlows(ctx context.Context, enableGC bool, forwardFlows var forwardingFlows []*Record laterFlowNs := uint64(0) for flowKey, flowMetrics := range m.mapFetcher.LookupAndDeleteMap() { - aggregatedMetrics := flowMetrics + aggregatedMetrics := m.aggregate(flowMetrics) // we ignore metrics that haven't been aggregated (e.g. all the mapped values are ignored) if aggregatedMetrics.EndMonoTimeTs == 0 { continue @@ -126,3 +126,21 @@ func (m *MapTracer) evictFlows(ctx context.Context, enableGC bool, forwardFlows } mtlog.Debugf("%d flows evicted", len(forwardingFlows)) } + +func (m *MapTracer) aggregate(metrics []ebpf.BpfFlowMetrics) *ebpf.BpfFlowMetrics { + if len(metrics) == 0 { + mtlog.Warn("invoked aggregate with no values") + return &ebpf.BpfFlowMetrics{} + } + aggr := &ebpf.BpfFlowMetrics{} + for _, mt := range metrics { + // eBPF hashmap values are not zeroed when the entry is removed. That causes that we + // might receive entries from previous collect-eviction timeslots. + // We need to check the flow time and discard old flows. + if mt.StartMonoTimeTs <= m.lastEvictionNs || mt.EndMonoTimeTs <= m.lastEvictionNs { + continue + } + Accumulate(aggr, &mt) + } + return aggr +} diff --git a/pkg/flow/tracer_map_test.go b/pkg/flow/tracer_map_test.go index 9ea7c168..d0728791 100644 --- a/pkg/flow/tracer_map_test.go +++ b/pkg/flow/tracer_map_test.go @@ -11,25 +11,36 @@ import ( func TestPacketAggregation(t *testing.T) { type testCase struct { - input ebpf.BpfFlowMetrics + input []ebpf.BpfFlowMetrics expected ebpf.BpfFlowMetrics } tcs := []testCase{{ - input: ebpf.BpfFlowMetrics{Packets: 0x7, Bytes: 0x22d, StartMonoTimeTs: 0x176a790b240b, EndMonoTimeTs: 0x176a792a755b, Flags: 1}, + input: []ebpf.BpfFlowMetrics{ + {Packets: 0, Bytes: 0, StartMonoTimeTs: 0, EndMonoTimeTs: 0, Flags: 1}, + {Packets: 0x7, Bytes: 0x22d, StartMonoTimeTs: 0x176a790b240b, EndMonoTimeTs: 0x176a792a755b, Flags: 1}, + {Packets: 0x0, Bytes: 0x0, StartMonoTimeTs: 0x0, EndMonoTimeTs: 0x0, Flags: 1}, + {Packets: 0x0, Bytes: 0x0, StartMonoTimeTs: 0x0, EndMonoTimeTs: 0x0, Flags: 1}, + }, expected: ebpf.BpfFlowMetrics{ Packets: 0x7, Bytes: 0x22d, StartMonoTimeTs: 0x176a790b240b, EndMonoTimeTs: 0x176a792a755b, Flags: 1, }, }, { - input: ebpf.BpfFlowMetrics{Packets: 0x5, Bytes: 0x5c4, StartMonoTimeTs: 0x17f3e9613a7f, EndMonoTimeTs: 0x17f3e979816e, Flags: 1}, + input: []ebpf.BpfFlowMetrics{ + {Packets: 0x3, Bytes: 0x5c4, StartMonoTimeTs: 0x17f3e9613a7f, EndMonoTimeTs: 0x17f3e979816e, Flags: 1}, + {Packets: 0x2, Bytes: 0x8c, StartMonoTimeTs: 0x17f3e9633a7f, EndMonoTimeTs: 0x17f3e96f164e, Flags: 1}, + {Packets: 0x0, Bytes: 0x0, StartMonoTimeTs: 0x0, EndMonoTimeTs: 0x0, Flags: 1}, + {Packets: 0x0, Bytes: 0x0, StartMonoTimeTs: 0x0, EndMonoTimeTs: 0x0, Flags: 1}, + }, expected: ebpf.BpfFlowMetrics{ - Packets: 0x5, Bytes: 0x5c4, StartMonoTimeTs: 0x17f3e9613a7f, EndMonoTimeTs: 0x17f3e979816e, Flags: 1, + Packets: 0x5, Bytes: 0x5c4 + 0x8c, StartMonoTimeTs: 0x17f3e9613a7f, EndMonoTimeTs: 0x17f3e979816e, Flags: 1, }, }} + ft := MapTracer{} for i, tc := range tcs { t.Run(fmt.Sprint(i), func(t *testing.T) { assert.Equal(t, tc.expected, - tc.input) + *ft.aggregate(tc.input)) }) } } diff --git a/pkg/test/tracer_fake.go b/pkg/test/tracer_fake.go index 522c6332..e41a95ac 100644 --- a/pkg/test/tracer_fake.go +++ b/pkg/test/tracer_fake.go @@ -14,14 +14,14 @@ import ( // TracerFake fakes the kernel-side eBPF map structures for testing type TracerFake struct { interfaces map[ifaces.Interface]struct{} - mapLookups chan map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics + mapLookups chan map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics ringBuf chan ringbuf.Record } func NewTracerFake() *TracerFake { return &TracerFake{ interfaces: map[ifaces.Interface]struct{}{}, - mapLookups: make(chan map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics, 100), + mapLookups: make(chan map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics, 100), ringBuf: make(chan ringbuf.Record, 100), } } @@ -34,12 +34,12 @@ func (m *TracerFake) Register(iface ifaces.Interface) error { return nil } -func (m *TracerFake) LookupAndDeleteMap() map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics { +func (m *TracerFake) LookupAndDeleteMap() map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics { select { case r := <-m.mapLookups: return r default: - return map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics{} + return map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics{} } } @@ -50,7 +50,7 @@ func (m *TracerFake) ReadRingBuf() (ringbuf.Record, error) { return <-m.ringBuf, nil } -func (m *TracerFake) AppendLookupResults(results map[ebpf.BpfFlowId]*ebpf.BpfFlowMetrics) { +func (m *TracerFake) AppendLookupResults(results map[ebpf.BpfFlowId][]ebpf.BpfFlowMetrics) { m.mapLookups <- results } -- GitLab