diff mbox series

[v2] python/sepolicy: Cache conditional rule queries

Message ID 20230130175828.2487173-1-vmojzis@redhat.com (mailing list archive)
State Accepted
Delegated to: Petr Lautrbach
Headers show
Series [v2] python/sepolicy: Cache conditional rule queries | expand

Commit Message

Vit Mojzis Jan. 30, 2023, 5:58 p.m. UTC
Commit 7506771e4b630fe0ab853f96574e039055cb72eb
"add missing booleans to man pages" dramatically slowed down
"sepolicy manpage -a" by removing caching of setools rule query.
Re-add said caching and update the query to only return conditional
rules.

Before commit 7506771e:
 #time sepolicy manpage -a
 real	1m43.153s
 # time sepolicy manpage -d httpd_t
 real	0m4.493s

After commit 7506771e:
 #time sepolicy manpage -a
 real   1h56m43.153s
 # time sepolicy manpage -d httpd_t
 real	0m8.352s

After this commit:
 #time sepolicy manpage -a
 real	1m41.074s
 # time sepolicy manpage -d httpd_t
 real	0m7.358s

Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
---
* Remove "sepolicy." before TERuleQuery (left over from testing on older
  version of userspace).

 python/sepolicy/sepolicy/__init__.py | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

James Carter Feb. 1, 2023, 3:20 p.m. UTC | #1
On Mon, Jan 30, 2023 at 1:01 PM Vit Mojzis <vmojzis@redhat.com> wrote:
>
> Commit 7506771e4b630fe0ab853f96574e039055cb72eb
> "add missing booleans to man pages" dramatically slowed down
> "sepolicy manpage -a" by removing caching of setools rule query.
> Re-add said caching and update the query to only return conditional
> rules.
>
> Before commit 7506771e:
>  #time sepolicy manpage -a
>  real   1m43.153s
>  # time sepolicy manpage -d httpd_t
>  real   0m4.493s
>
> After commit 7506771e:
>  #time sepolicy manpage -a
>  real   1h56m43.153s
>  # time sepolicy manpage -d httpd_t
>  real   0m8.352s
>
> After this commit:
>  #time sepolicy manpage -a
>  real   1m41.074s
>  # time sepolicy manpage -d httpd_t
>  real   0m7.358s
>
> Signed-off-by: Vit Mojzis <vmojzis@redhat.com>

Acked-by: James Carter <jwcart2@gmail.com>

> ---
> * Remove "sepolicy." before TERuleQuery (left over from testing on older
>   version of userspace).
>
>  python/sepolicy/sepolicy/__init__.py | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
> index e2d5c11a..c177cdfc 100644
> --- a/python/sepolicy/sepolicy/__init__.py
> +++ b/python/sepolicy/sepolicy/__init__.py
> @@ -125,6 +125,7 @@ all_attributes = None
>  booleans = None
>  booleans_dict = None
>  all_allow_rules = None
> +all_bool_rules = None
>  all_transitions = None
>
>
> @@ -1136,6 +1137,14 @@ def get_all_allow_rules():
>          all_allow_rules = search([ALLOW])
>      return all_allow_rules
>
> +def get_all_bool_rules():
> +    global all_bool_rules
> +    if not all_bool_rules:
> +        q = TERuleQuery(_pol, boolean=".*", boolean_regex=True,
> +                                ruletype=[ALLOW, DONTAUDIT])
> +        all_bool_rules = [_setools_rule_to_dict(x) for x in q.results()]
> +    return all_bool_rules
> +
>  def get_all_transitions():
>      global all_transitions
>      if not all_transitions:
> @@ -1146,7 +1155,7 @@ def get_bools(setype):
>      bools = []
>      domainbools = []
>      domainname, short_name = gen_short_name(setype)
> -    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, search([ALLOW, DONTAUDIT]))):
> +    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, get_all_bool_rules())):
>          for b in i:
>              if not isinstance(b, tuple):
>                  continue
> --
> 2.37.3
>
Petr Lautrbach Feb. 6, 2023, 2:40 p.m. UTC | #2
James Carter <jwcart2@gmail.com> writes:

> On Mon, Jan 30, 2023 at 1:01 PM Vit Mojzis <vmojzis@redhat.com> wrote:
>>
>> Commit 7506771e4b630fe0ab853f96574e039055cb72eb
>> "add missing booleans to man pages" dramatically slowed down
>> "sepolicy manpage -a" by removing caching of setools rule query.
>> Re-add said caching and update the query to only return conditional
>> rules.
>>
>> Before commit 7506771e:
>>  #time sepolicy manpage -a
>>  real   1m43.153s
>>  # time sepolicy manpage -d httpd_t
>>  real   0m4.493s
>>
>> After commit 7506771e:
>>  #time sepolicy manpage -a
>>  real   1h56m43.153s
>>  # time sepolicy manpage -d httpd_t
>>  real   0m8.352s
>>
>> After this commit:
>>  #time sepolicy manpage -a
>>  real   1m41.074s
>>  # time sepolicy manpage -d httpd_t
>>  real   0m7.358s
>>
>> Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
>
> Acked-by: James Carter <jwcart2@gmail.com>

This is merged now. Thanks!


>> ---
>> * Remove "sepolicy." before TERuleQuery (left over from testing on older
>>   version of userspace).
>>
>>  python/sepolicy/sepolicy/__init__.py | 11 ++++++++++-
>>  1 file changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
>> index e2d5c11a..c177cdfc 100644
>> --- a/python/sepolicy/sepolicy/__init__.py
>> +++ b/python/sepolicy/sepolicy/__init__.py
>> @@ -125,6 +125,7 @@ all_attributes = None
>>  booleans = None
>>  booleans_dict = None
>>  all_allow_rules = None
>> +all_bool_rules = None
>>  all_transitions = None
>>
>>
>> @@ -1136,6 +1137,14 @@ def get_all_allow_rules():
>>          all_allow_rules = search([ALLOW])
>>      return all_allow_rules
>>
>> +def get_all_bool_rules():
>> +    global all_bool_rules
>> +    if not all_bool_rules:
>> +        q = TERuleQuery(_pol, boolean=".*", boolean_regex=True,
>> +                                ruletype=[ALLOW, DONTAUDIT])
>> +        all_bool_rules = [_setools_rule_to_dict(x) for x in q.results()]
>> +    return all_bool_rules
>> +
>>  def get_all_transitions():
>>      global all_transitions
>>      if not all_transitions:
>> @@ -1146,7 +1155,7 @@ def get_bools(setype):
>>      bools = []
>>      domainbools = []
>>      domainname, short_name = gen_short_name(setype)
>> -    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, search([ALLOW, DONTAUDIT]))):
>> +    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, get_all_bool_rules())):
>>          for b in i:
>>              if not isinstance(b, tuple):
>>                  continue
>> --
>> 2.37.3
>>
diff mbox series

Patch

diff --git a/python/sepolicy/sepolicy/__init__.py b/python/sepolicy/sepolicy/__init__.py
index e2d5c11a..c177cdfc 100644
--- a/python/sepolicy/sepolicy/__init__.py
+++ b/python/sepolicy/sepolicy/__init__.py
@@ -125,6 +125,7 @@  all_attributes = None
 booleans = None
 booleans_dict = None
 all_allow_rules = None
+all_bool_rules = None
 all_transitions = None
 
 
@@ -1136,6 +1137,14 @@  def get_all_allow_rules():
         all_allow_rules = search([ALLOW])
     return all_allow_rules
 
+def get_all_bool_rules():
+    global all_bool_rules
+    if not all_bool_rules:
+        q = TERuleQuery(_pol, boolean=".*", boolean_regex=True,
+                                ruletype=[ALLOW, DONTAUDIT])
+        all_bool_rules = [_setools_rule_to_dict(x) for x in q.results()]
+    return all_bool_rules
+
 def get_all_transitions():
     global all_transitions
     if not all_transitions:
@@ -1146,7 +1155,7 @@  def get_bools(setype):
     bools = []
     domainbools = []
     domainname, short_name = gen_short_name(setype)
-    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, search([ALLOW, DONTAUDIT]))):
+    for i in map(lambda x: x['booleans'], filter(lambda x: 'booleans' in x and x['source'] == setype, get_all_bool_rules())):
         for b in i:
             if not isinstance(b, tuple):
                 continue