On 5/7/19 10:39 PM, Ville Valkonen wrote:
Hello,

thanks for the great new tool, sysupgrade. Works like a charm.

While on it, I came with this patch to speed up the downloading.
It uses xargs -P to parallelize downloads (max 6, chosen from top of my head).

Also, removed trailing spaces in two lines.

Without parallel patch:
     4m20.91s real     0m00.44s user     0m24.26s system
With parallel patch:
     3m14.14s real     0m00.32s user     0m13.80s system

I wonder if saving a minute is worth the trouble. However, there seems to be a more important problem with the patch. See below


<snip>
diff --git usr.sbin/sysupgrade/sysupgrade.sh usr.sbin/sysupgrade/sysupgrade.sh
index 87de9ccf432..635b48186f5 100644
--- usr.sbin/sysupgrade/sysupgrade.sh
+++ usr.sbin/sysupgrade/sysupgrade.sh
@@ -44,7 +44,7 @@ unpriv()
          _file=$2
          shift 2
      fi
-     if [[ -n ${_file} ]]; then
+    if [[ -n ${_file} ]]; then
          >${_file}
          chown "${_user}" "${_file}"
      fi
@@ -69,6 +69,16 @@ rmel() {
      echo -n "$_c"
  }

+generate_urls()
+{
+    OFS=$IFS
+    IFS=$'\n'
+    printf "${2}\n" | while read -r f; do
+        printf "%s%s\n" "${1}" "${f}"
+    done
+    IFS=$OFS
+}
+
  RELEASE=false
  SNAP=false
  FORCE=false
@@ -122,7 +132,7 @@ if [[ -e ${SETSDIR} ]]; then
           ug_err "${SETSDIR} needs to be owned by root:wheel"
      [[ $st_gid -eq 0 ]] ||
           ug_err "${SETSDIR} needs to be owned by root:wheel"
-    [[ $st_mode -eq 040755 ]] ||
+    [[ $st_mode -eq 040755 ]] ||
          ug_err "${SETSDIR} is not a directory with permissions 0755"
  else
      mkdir -p ${SETSDIR}
@@ -167,9 +177,13 @@ for f in $SETS; do
  done

  [[ -n ${OLD_FILES} ]] && rm ${OLD_FILES}
+cd ${SETSDIR}
+generate_urls $URL "$(echo ${DL} |tr ' ' '\n')" \
+    | xargs -P 6 -n 1 ftp -VCm

Doesn't this download the files as root without using unpriv to drop the downloader's privileges? This doesn't seem correct.

  for f in ${DL}; do
-    unpriv -f $f ftp -Vmo ${f} ${URL}${f}
+    unpriv -f $f

Does unpriv do anything if you don't give it a command to run? These are probably no-ops.

  done
+cd -

  echo Verifying sets.
  [[ -n ${DL} ]] && unpriv cksum -qC SHA256 ${DL}
</snip>

--
Kind regards,
Ville Valkonen


--
Jarkko

Reply via email to