Hi all, I hit a performance issue when using must statement with count().
The snippet yang model is as below:
==gpon-interface-cli.yang
augment /exa:config/exa:interface {
list ont-ethernet{
key port;
leaf port {
description "Ethernet port";
type string;
tailf:info "Ethernet port";
}
leaf role {
description "Ethernet role";
type string;
tailf:info "Ethernet role";
}
...
}// list ont-ethernet
==gpon-service-cli.yang
augment /exa:config/exa:interface/gpon-cli:ont-ethernet {
list vlan {
when "../role = 'uni' or ../role = 'enni'" {
tailf:dependency "../role";
}
must "count(../dtag-vlan) + count(.) <= 12" {
tailf:dependency "../dtag-vlan";
tailf:dependency ".";
error-message "interface ont-ethernet service limit exceeded";
}
max-elements 12;
key "vlan-id";
leaf vlan-id{
description "VlanId (range: 1-4094)";
type uint32;
}
}
list dtag-vlan {
when "../role = 'uni'" {
tailf:dependency "../role";
}
must "count(../vlan) + count(.) <= 12" {
tailf:dependency "../vlan";
tailf:dependency ".";
error-message "interface ont-ethernet service limit exceeded";
}
max-elements 12;
key "vlan-id";
leaf vlan-id{
description "VlanId (range: 1-4094)";
type uint32;
}
}
}
The cli cmd is :
GPON-8R2-West-Lake(config)# interface ont-ethernet 1/g1
GPON-8R2-West-Lake(config-ont-ethernet-1/g1)# vlan 789
Then the performance issue occurs. CONFD invokes get_next() to iterate all the /config/interface/ont-ethernet to validate the must count statement. What we expect is that the must count statement is only to validate the requested ont-ethernet. Why does CONFD need to iterate all the ont-ethernet?
The snippet confd_developer.log is as below:
<DEBUG> 7-Aug-2020::10:04:28.934 GPON-8R2-West-Lake confd[8571]: confd commit progress db=running usid=13 thandle=34: run dependency-triggered validation...
<DEBUG> 7-Aug-2020::10:04:28.935 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.936 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.940 GPON-8R2-West-Lake confd[8571]: devel-c get_elem request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet{1/g1}/role
<DEBUG> 7-Aug-2020::10:04:28.942 GPON-8R2-West-Lake confd[8571]: devel-c get_elem succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet{1/g1}/role
<DEBUG> 7-Aug-2020::10:04:28.943 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet{1/g1}/dtag-vlan
<DEBUG> 7-Aug-2020::10:04:28.945 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet{1/g1}/dtag-vlan
<DEBUG> 7-Aug-2020::10:04:28.946 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.947 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.948 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.950 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.951 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.952 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.953 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.955 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.956 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.957 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.959 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.960 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.961 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.963 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.964 GPON-8R2-West-Lake confd[8571]: devel-c get_next request for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG> 7-Aug-2020::10:04:28.966 GPON-8R2-West-Lake confd[8571]: devel-c get_next succeeded for callpoint imxs_cli_config_cp path /exa:config/interface/ont-ethernet
<DEBUG
…
is the must count() statement wrong? I tested must “count(…/dtag-vlan) <= 12” replacing must “count(…/dtag-vlan) + count(.) <= 12” , there is no get_next /config/interface/ont-ethernet requests in the confd_developer.log.
Please help to take a look at it. thanks.