drush pm-update fails: tar hangs when extracting *.tar.gz module archives from drupal.org
25th August 2014
Drush is awesome, especially for updating multisite Drupal installations.
I had only started using it a few days ago, and I’ve immediately hit a problem, to which I did find a workaround.
Symptoms
- running
drush @sites pm-update
results in normal execution up to after answering ‘y[es]‘; then drush seems to hang indefinitely (haven’t waited beyond about 10 minutes, maybe it does produce an error after a long while); - running the same command with
--debug
shows that drush hangs when trying to untar the downloaded module.tar.gz archive; there are no errors/warnings, it just hangs with no CPU usage; - trying to untar any of the modules downloaded from drupal.org manually is also unsuccessful:
tar -xzvf module.tar.gz
seems to do nothing, it also hangs with zero CPU usage/time and no warnings/errors; - interestingly, if I create some
test.tar.gz
locally,tar
does happily extract that; - finally, running
strace tar -xzvf module.tar.gz
shows a number of unexpected lines, such as references to NSS and libnss files (I am only showing some of the lines of strace output, including the last line):open(“/etc/nsswitch.conf”, O_RDONLY) = 4
read(4, “# /etc/nsswitch.conf\n#\n# Example”…, 4096) = 683
open(“/lib/x86_64-linux-gnu/libnss_nis.so.2″, O_RDONLY) = 4
open(“/lib/x86_64-linux-gnu/libnss_files.so.2″, O_RDONLY) = 4
open(“/etc/passwd”, O_RDONLY|O_CLOEXEC) = 4
open(“/usr/lib/x86_64-linux-gnu/libnss_mysql.so.2″, O_RDONLY) = 4
open(“/etc/group”, O_RDONLY|O_CLOEXEC) = 4
open(“/etc/libnss-mysql.cfg”, O_RDONLY) = -1 EACCES (Permission denied)
open(“/etc/libnss-mysql-root.cfg”, O_RDONLY) = -1 EACCES (Permission denied)
futex(0x7fd0816e8c48, FUTEX_WAIT_PRIVATE, 2, NULL
Analysis
strace
output provided enough information to understand the issue and generate a workaround. Briefly, we see tar querying users and groups information. On the system where this problem was identified, MySQL is used as a name-service back-end. This is why we see references to mysql libraries in the trace. Apparently, tar
is trying to resolve some user/groups information, but for some reason does not get what it is asking in a timely manner, or possibly never gets it and will only fail/proceed when the request times out.
Workaround
Not a solution, but works: tar -xzv --numeric-owner -f module.tar.gz
. The --numeric-owner
switch asks tar
to use numeric file/directory owner information as-is, without trying to resolve the name of the owner. This works. I have not checked strace
for the workaround, but I expect to see no MySQL/NSS references in it with the switch.
To actually be able to use drush with this workaround, I had to edit drush.inc
somewhere under /usr/share/drush/
; look for ‘tar ‘ string, and add --numeric-owner
where necessary. Do not forget that -f
has to be just in front of the archive filename, otherwise your edits will not work.