Bug 1282115

Summary: rpm %transfiletriggerun is called twice per transaction
Product: [Fedora] Fedora Reporter: Zbigniew Jędrzejewski-Szmek <zbyszek>
Component: rpmAssignee: Packaging Maintenance Team <packaging-team-maint>
Status: CLOSED RAWHIDE QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: rawhideCC: jzeleny, lkardos, novyjindrich, packaging-team-maint, pknirsch
Target Milestone: ---   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2015-11-23 16:16:14 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Zbigniew Jędrzejewski-Szmek 2015-11-14 23:59:50 UTC
Description of problem:
I'm working on using rpm file triggers in systemd. It is likely that I misunderstood something, but based on the documentation the trigger should be called just once. I added the following to systemd.spec:

%transfiletriggerun -- /usr/lib/systemd/system /etc/systemd/system
logger requesting reload "$*"
xargs logger
systemctl daemon-reload &>/dev/null || :
logger reload done

After I reinstall a package (e.g. dnf reinstall iputils) that has a systemd unit, the trigger is called twice:

Nov 14 18:45:29 fedora-rawhide zbyszek[14446]: requesting reload 0 0
Nov 14 18:45:29 fedora-rawhide zbyszek[14448]: /usr/lib/systemd/system/rdisc.service
Nov 14 18:45:29 fedora-rawhide systemd[1]: Reloading.
Nov 14 18:45:29 fedora-rawhide zbyszek[14461]: reload done
Nov 14 18:45:30 fedora-rawhide zbyszek[14463]: requesting reload 0 0
Nov 14 18:45:30 fedora-rawhide zbyszek[14465]: /usr/lib/systemd/system/rdisc.service
Nov 14 18:45:30 fedora-rawhide systemd[1]: Reloading.
Nov 14 18:45:30 fedora-rawhide zbyszek[14478]: reload done

Version-Release number of selected component (if applicable):
rpm-4.13.0-0.rc1.12.fc24.x86_64

How reproducible:
100%

Actual results:
transfiletriggerun script is called twice in the same transaction

Expected results:
transfiletriggerun script is called once per transaction.

Comment 1 Ľuboš Kardoš 2015-11-20 12:17:18 UTC
I wasn't able to reproduce this. Are you sure you don't have also defined %transfiletriggerin in spec? Isn't the second log record from %transfiletriggerin instead of %transfiletriggerun?

BTW: Are you sure you really want %transfiletriggerun and not %transfiletriggerpostun?

Comment 2 Zbigniew Jędrzejewski-Szmek 2015-11-20 20:40:40 UTC
I created a test package which calls /bin/logger in all scripts, to be able to debug what scripts are called: http://in.waw.pl/git/transfiletriggers/.

It confirms that %transfiletriggerun is called twice.

Also %transfiletriggerpostun is never called. Unless there's some typo that I don't see, it looks like another bug.

Initial installation of file with triggers: dnf install -y x86_64/transfiletriggers-0-1.fc24.x86_64.rpm

transfiletriggers pretrans 1                                               
transfiletriggers pre 1
transfiletriggers filetriggerin 0 0: /usr/share/doc/transfiletriggers /usr/share/doc/transfiletriggers/README
transfiletriggers filetriggerin 0 0: /usr/share/doc/setup /usr/share/doc/setup/COPYING /usr/share/doc/setup/uidgid /usr/share/doc/setup /usr/share/doc/setup/COPYING /usr/share/doc/setup/uidgid /usr/share/doc/expat /usr/share/doc/expat/README /usr/share/doc/expat /usr/share/doc/expat/README
transfiletriggers post 1
transfiletriggers posttrans 1
transfiletriggers transfiletriggerin 0 0: /usr/share/doc/setup /usr/share/doc/setup/COPYING /usr/share/doc/setup/uidgid /usr/share/doc/setup /usr/share/doc/setup/COPYING /usr/share/doc/setup/uidgid /usr/share/doc/expat /usr/share/doc/expat/README /usr/share/doc/expat /usr/share/doc/expat/README

Installation of package with triggering files: dnf install -y x86_64/transfiletriggers-a-0-1.fc24.x86_64.rpm

transfiletriggers-a pretrans 1
transfiletriggers-a pre 1
transfiletriggers filetriggerin 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a post 1
transfiletriggers-a posttrans 1
transfiletriggers transfiletriggerin 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README

Reinstallation: dnf reinstall -y x86_64/transfiletriggers-a-0-1.fc24.x86_64.rpm

transfiletriggers transfiletriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers transfiletriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a pretrans 2
transfiletriggers-a pre 2
transfiletriggers filetriggerin 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a post 2
transfiletriggers filetriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a preun 1
transfiletriggers filetriggerpostun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a postun 1
transfiletriggers-a posttrans 1
transfiletriggers transfiletriggerin 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README

Removal: dnf remove -y transfiletriggers-a

transfiletriggers transfiletriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers transfiletriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers filetriggerun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a preun 0
transfiletriggers filetriggerpostun 0 0: /usr/share/doc/transfiletriggers-a /usr/share/doc/transfiletriggers-a/README
transfiletriggers-a postun 0

> BTW: Are you sure you really want %transfiletriggerun and not %transfiletriggerpostun?

I need to call 'systemctl daemon-reload' with the following constraints:
1. After files have been added/removed/upgraded.
2. Before restarting daemons which were upgraded.

Ideally, we would run 'systemctl daemon-reload' just once, but if that's not possible, we can live with multiple calls as long as we get at least one call satisfying 1. and at least one call satisfying 2.

Restarting daemons which were upgraded is currently done through %postun scriptlets in individual packages. This means that we would like 2. to be implemented as "before %postun scriptlets in packages".

Looking at the debug logs above, this isn't currently possible (without saving state on disk or something like that). Any help would be appreciated.

Comment 3 Ľuboš Kardoš 2015-11-23 16:16:14 UTC
Now, I see where the problem is. It is reproducible only when reinstall is performed by dnf, if "rpm --reinstall" is used then it works. Both calling %transfiletriggerun twice per transaction and not calling %transfiletriggerpostun at all should be fixed in rpm-4.13.0-0.rc1.13.fc24.

Because the bug is fixed I am closing it. If you have still problem how to use file triggers with the fixed rpm version then contact me by email or send email to rpm-list.org.

Comment 4 Zbigniew Jędrzejewski-Szmek 2015-11-23 18:05:00 UTC
Thanks for the quick fix. I can confirm that I don't see %transfiletriggerun called twice.

Unfortunately %transfiletriggerpostun is still not called. I'll open a separate bug.