← Back to team overview

dx-packages team mailing list archive

Re: [Bug 1244205] Re: cupsd wakes up the hard disk every 14 minutes

 

The current scheduler/file.c code was last changed back when we added
the SyncOnClose option. The sync-on-close was removed in r9766 in May of
2011 for STR #3715, as part of the 1.5.0 release (patches are attached).



On Oct 30, 2013, at 1:02 PM, Till Kamppeter <1244205@xxxxxxxxxxxxxxxxxx> wrote:

> Mike, can you have a look into this? The CUPS currently in Ubuntu 13.10
> (Saucy, CUPS 1.7rc1) does not show this problem, but the CUPS in 12.04
> LTS (Precise, CUPS 1.5.3) has this problem of an subscription renewal
> constantly waking up the system. Can you tell us which change fixed
> this, so that we can backport this change? Thanks.
> 
> -- 
> You received this bug notification because you are subscribed to the bug
> report.
> https://bugs.launchpad.net/bugs/1244205
> 
> Title:
>  cupsd wakes up the hard disk every 14 minutes
> 
> Status in The Ubuntu Power Consumption Project:
>  New
> Status in “cups” package in Ubuntu:
>  New
> 
> Bug description:
>  cupsd  calls fsync() on /etc/subscriptions.conf.N every 14~15 minutes.
>  This causes the hard disk to wake up soon after it spins down.
>  Subscription renewal is from indicator-printers every 15 minutes.
> 
>  I think we don't need cupsdRemoveFile() to always overwrite data and do a fsync() for this file. Currently only Precise is confirmed to be affected. Saucy seems not having the same issue according to
>  (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/cups/saucy/view/head:/scheduler/file.c#L149)
> 
>  ---- block_dump from the kernel ----
>  <7>[19935.646436] cupsd(1066): dirtied inode 15336755 (subscriptions.conf.N) on sda3
>  <7>[19935.646673] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors)
>  <7>[19935.646755] cupsd(1066): dirtied inode 15335603 (?) on sda3
>  <7>[19935.646763] cupsd(1066): dirtied inode 15335603 (?) on sda3
>  <7>[19935.646776] cupsd(1066): WRITE block 352701128 on sda3 (8 sectors)
>  <7>[20774.607856] cupsd(1066): dirtied inode 15335603 (subscriptions.conf.N) on sda3
>  <7>[20774.608034] cupsd(1066): WRITE block 352862776 on sda3 (8 sectors)
>  <7>[20774.608113] cupsd(1066): dirtied inode 15335607 (?) on sda3
>  <7>[20774.608120] cupsd(1066): dirtied inode 15335607 (?) on sda3
>  <7>[20774.608133] cupsd(1066): WRITE block 352753008 on sda3 (8 sectors)
>  <7>[21613.569033] cupsd(1066): dirtied inode 15335607 (subscriptions.conf.N) on sda3
>  <7>[21613.569257] cupsd(1066): WRITE block 352753024 on sda3 (8 sectors)
>  <7>[21613.569345] cupsd(1066): dirtied inode 15336755 (?) on sda3
>  <7>[21613.569353] cupsd(1066): dirtied inode 15336755 (?) on sda3
>  <7>[21613.569367] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors)
> 
>  ---- cups: scheduler/file.c ----
>  int					/* O - 0 on success, -1 on error */
>  cupsdCloseCreatedConfFile(
>      cups_file_t *fp,			/* I - File to close */
>      const char  *filename)		/* I - Filename */
>  {
>  ...
>    snprintf(newfile, sizeof(newfile), "%s.N", filename);
>    snprintf(oldfile, sizeof(oldfile), "%s.O", filename);
> 
>    if ((cupsdRemoveFile(oldfile) && errno != ENOENT) ||
>        (rename(filename, oldfile) && errno != ENOENT) ||
>        rename(newfile, filename))
>    {
>      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to finalize \"%s\": %s",
>                      filename, strerror(errno));
>      return (-1);
>    }
> 
>    return (0);
>  }
> 
>  int					/* O - 0 on success, -1 on error */
>  cupsdRemoveFile(const char *filename)	/* I - File to remove */
>  {
>  ...
>   /*
>    * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF,
>    * and more random data.
>    */
> 
>    memset(buffer, 0xF6, sizeof(buffer));
>    if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
>    {
>      close(fd);
>      return (-1);
>    }
>  ...
>  }
> 
>  static int				/* O - 0 on success, -1 on error */
>  overwrite_data(int        fd,		/* I - File descriptor */
>                 const char *buffer,	/* I - Buffer to write */
>          int        bufsize,	/* I - Size of buffer */
>                 int        filesize)	/* I - Size of file */
>  {
>    int	bytes;				/* Bytes to write/written */
> 
>   /*
>    * Start at the beginning of the file...
>    */
> 
>    if (lseek(fd, 0, SEEK_SET) < 0)
>      return (-1);
> 
>   /*
>    * Fill the file with the provided data...
>    */
> 
>    while (filesize > 0)
>    {
>      if (filesize > bufsize)
>        bytes = bufsize;
>      else
>        bytes = filesize;
> 
>      if ((bytes = write(fd, buffer, bytes)) < 0)
>        return (-1);
> 
>      filesize -= bytes;
>    }
> 
>   /*
>    * Force the changes to disk...
>    */
> 
>    return (fsync(fd));
>  }
> 
>  ---- indicator-printers-service.c ----
>  #define NOTIFY_LEASE_DURATION (15 * 60)
> 
>  int main (int argc, char *argv[])
>  {
>  ...
>      g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60,
>                             renew_subscription_timeout,
>                             &subscription_id);
>  ...
>  }
> 
> To manage notifications about this bug go to:
> https://bugs.launchpad.net/ubuntu-power-consumption/+bug/1244205/+subscriptions

_________________________________________________________
Michael Sweet, Senior Printing System Engineer, PWG Chair


** Attachment added: "str3715.patch"
   https://bugs.launchpad.net/bugs/1244205/+attachment/3895920/+files/str3715.patch

** Attachment added: "str3715p2.patch"
   https://bugs.launchpad.net/bugs/1244205/+attachment/3895921/+files/str3715p2.patch

** Attachment added: "str3715p3.patch"
   https://bugs.launchpad.net/bugs/1244205/+attachment/3895922/+files/str3715p3.patch

-- 
You received this bug notification because you are a member of DX
Packages, which is subscribed to indicator-printers in Ubuntu.
https://bugs.launchpad.net/bugs/1244205

Title:
  cupsd wakes up the hard disk every 14 minutes

Status in The Ubuntu Power Consumption Project:
  New
Status in “cups” package in Ubuntu:
  New
Status in “indicator-printers” package in Ubuntu:
  New

Bug description:
  cupsd  calls fsync() on /etc/subscriptions.conf.N every 14~15 minutes.
  This causes the hard disk to wake up soon after it spins down.
  Subscription renewal is from indicator-printers every 15 minutes.

  I think we don't need cupsdRemoveFile() to always overwrite data and do a fsync() for this file. Currently only Precise is confirmed to be affected. Saucy seems not having the same issue according to
  (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/cups/saucy/view/head:/scheduler/file.c#L149)

  ---- block_dump from the kernel ----
  <7>[19935.646436] cupsd(1066): dirtied inode 15336755 (subscriptions.conf.N) on sda3
  <7>[19935.646673] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors)
  <7>[19935.646755] cupsd(1066): dirtied inode 15335603 (?) on sda3
  <7>[19935.646763] cupsd(1066): dirtied inode 15335603 (?) on sda3
  <7>[19935.646776] cupsd(1066): WRITE block 352701128 on sda3 (8 sectors)
  <7>[20774.607856] cupsd(1066): dirtied inode 15335603 (subscriptions.conf.N) on sda3
  <7>[20774.608034] cupsd(1066): WRITE block 352862776 on sda3 (8 sectors)
  <7>[20774.608113] cupsd(1066): dirtied inode 15335607 (?) on sda3
  <7>[20774.608120] cupsd(1066): dirtied inode 15335607 (?) on sda3
  <7>[20774.608133] cupsd(1066): WRITE block 352753008 on sda3 (8 sectors)
  <7>[21613.569033] cupsd(1066): dirtied inode 15335607 (subscriptions.conf.N) on sda3
  <7>[21613.569257] cupsd(1066): WRITE block 352753024 on sda3 (8 sectors)
  <7>[21613.569345] cupsd(1066): dirtied inode 15336755 (?) on sda3
  <7>[21613.569353] cupsd(1066): dirtied inode 15336755 (?) on sda3
  <7>[21613.569367] cupsd(1066): WRITE block 352753016 on sda3 (8 sectors)

  ---- cups: scheduler/file.c ----
  int					/* O - 0 on success, -1 on error */
  cupsdCloseCreatedConfFile(
      cups_file_t *fp,			/* I - File to close */
      const char  *filename)		/* I - Filename */
  {
  ...
    snprintf(newfile, sizeof(newfile), "%s.N", filename);
    snprintf(oldfile, sizeof(oldfile), "%s.O", filename);

    if ((cupsdRemoveFile(oldfile) && errno != ENOENT) ||
        (rename(filename, oldfile) && errno != ENOENT) ||
        rename(newfile, filename))
    {
      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to finalize \"%s\": %s",
                      filename, strerror(errno));
      return (-1);
    }

    return (0);
  }

  int					/* O - 0 on success, -1 on error */
  cupsdRemoveFile(const char *filename)	/* I - File to remove */
  {
  ...
   /*
    * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF,
    * and more random data.
    */

    memset(buffer, 0xF6, sizeof(buffer));
    if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
    {
      close(fd);
      return (-1);
    }
  ...
  }

  static int				/* O - 0 on success, -1 on error */
  overwrite_data(int        fd,		/* I - File descriptor */
                 const char *buffer,	/* I - Buffer to write */
          int        bufsize,	/* I - Size of buffer */
                 int        filesize)	/* I - Size of file */
  {
    int	bytes;				/* Bytes to write/written */

   /*
    * Start at the beginning of the file...
    */

    if (lseek(fd, 0, SEEK_SET) < 0)
      return (-1);

   /*
    * Fill the file with the provided data...
    */

    while (filesize > 0)
    {
      if (filesize > bufsize)
        bytes = bufsize;
      else
        bytes = filesize;

      if ((bytes = write(fd, buffer, bytes)) < 0)
        return (-1);

      filesize -= bytes;
    }

   /*
    * Force the changes to disk...
    */

    return (fsync(fd));
  }

  ---- indicator-printers-service.c ----
  #define NOTIFY_LEASE_DURATION (15 * 60)

  int main (int argc, char *argv[])
  {
  ...
      g_timeout_add_seconds (NOTIFY_LEASE_DURATION - 60,
                             renew_subscription_timeout,
                             &subscription_id);
  ...
  }

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu-power-consumption/+bug/1244205/+subscriptions