Jira (FACT-2250) Facter ignores signals while waiting for external commands to run

8 views
Skip to first unread message

Charlie Sharpsteen (JIRA)

unread,
Dec 12, 2019, 3:45:04 PM12/12/19
to puppe...@googlegroups.com
Charlie Sharpsteen created an issue
 
Facter / Bug FACT-2250
Facter ignores signals while waiting for external commands to run
Issue Type: Bug Bug
Affects Versions: FACT 3.11.10, FACT 3.14.6
Assignee: Unassigned
Created: 2019/12/12 12:44 PM
Priority: Normal Normal
Reporter: Charlie Sharpsteen

When Facter executes an external command, it will block Ruby signal handlers from firing. This prevents things like SIGINT or SIGQUIT from terminating a Puppet process that is waiting for an external Facter command.

Reproduction Case

  • Install Puppet 5.5.17 or Puppet 6.11.1 on CentOS 7

yum install -y http://yum.puppetlabs.com/puppet5-release-el-7.noarch.rpm
yum install -y puppet-agent
 
source /etc/profile.d/puppet-agent.sh

  • Create a custom fact that logs a message and then executes sleep:

mkdir -p /var/lib/facter/test
cat <<EOF > /var/lib/facter/test/sleepy_fact.rb
Facter.add(:sleepy_fact) do
  setcode do
    Facter.warn('About to sleep for 1000 seconds')
    Facter::Core::Execution.execute('/usr/bin/sleep 1000')
    'took a nice nap'
  end
end
EOF

  • Run puppet facts find and attempt to cancel it with CTRL-C (SIGINT) or CTRL-\ (SIGQUIT)

FACTERLIB=/var/lib/facter/test puppet facts find

Outcome

Like Kieth Richards, Facter cannot be killed by conventional weapons:

# FACTERLIB=/var/lib/facter/test puppet facts find
Warning: Facter: About to sleep for 1000 seconds
^C^C^C^C^C^C^\^\^\^\^\^\^\

Expected Outcome

Facter executing /bin/sleep leaves the Ruby process free to respond to signals in the same way that calling Kernel.sleep does:

# cat <<EOF > /var/lib/facter/test/sleepy_fact.rb
Facter.add(:sleepy_fact) do
  setcode do
    Facter.warn('About to sleep for 1000 seconds')
    ::Kernel.sleep(1000)
    'took a nice nap'
  end
end
EOF
 
# FACTERLIB=/var/lib/facter/test puppet facts find
Warning: Facter: About to sleep for 1000 seconds
^CCancelling Face
Error: Facter: error while resolving custom fact "sleepy_fact": exit
...
 
# FACTERLIB=/var/lib/facter/test puppet facts find
Warning: Facter: About to sleep for 1000 seconds
^\Error: Facter: error while resolving custom fact "sleepy_fact": SIGQUIT
...

Add Comment Add Comment
 
This message was sent by Atlassian JIRA (v7.7.1#77002-sha1:e75ca93)
Atlassian logo

Charlie Sharpsteen (JIRA)

unread,
Dec 12, 2019, 3:46:03 PM12/12/19
to puppe...@googlegroups.com
Charlie Sharpsteen commented on Bug FACT-2250
 
Re: Facter ignores signals while waiting for external commands to run

I suspect this is occurring because Facter does not release the Ruby Global Interpreter Lock when dropping into libboost for command execution. The signal handlers need this lock in order to run Ruby code.

Mihai Buzgau (JIRA)

unread,
Jan 7, 2020, 2:51:04 AM1/7/20
to puppe...@googlegroups.com

Mihai Buzgau (JIRA)

unread,
Jan 7, 2020, 5:10:03 AM1/7/20
to puppe...@googlegroups.com

Bogdan Irimie (Jira)

unread,
Nov 5, 2020, 3:51:05 AM11/5/20
to puppe...@googlegroups.com
Bogdan Irimie updated an issue
Change By: Bogdan Irimie
Sprint:
This message was sent by Atlassian Jira (v8.5.2#805002-sha1:a66f935)
Atlassian logo

Bogdan Irimie (Jira)

unread,
Nov 5, 2020, 3:51:06 AM11/5/20
to puppe...@googlegroups.com

Ciprian Badescu (Jira)

unread,
Sep 23, 2021, 3:52:03 AM9/23/21
to puppe...@googlegroups.com
Ciprian Badescu updated an issue
Change By: Ciprian Badescu
Sprint: ready for triage
This message was sent by Atlassian Jira (v8.13.2#813002-sha1:c495a97)
Atlassian logo
Reply all
Reply to author
Forward
0 new messages