Code

smart plugin: add IgnoreSleepMode option to ignore sleeping disks
authorScott Talbert <scott.talbert@hgst.com>
Fri, 15 Jul 2016 13:36:30 +0000 (09:36 -0400)
committerScott Talbert <scott.talbert@hgst.com>
Fri, 15 Jul 2016 13:36:30 +0000 (09:36 -0400)
This option enables the smart plugin to use disks that libatasmart mistakenly
reports as asleep.  This happens because libatasmart has not been updated to
incorporate support for newer idle states in the ATA spec.

src/collectd.conf.pod
src/smart.c

index 24dc59dbfd019c89e2359fb54ba7167d225ba7e8..37a4d6b6f476cee1b7733467df35543be6381d39 100644 (file)
@@ -6456,6 +6456,14 @@ collected. If at least one B<Disk> option is given and no B<IgnoreSelected> or
 set to B<false>, B<only> matching disks will be collected. If B<IgnoreSelected>
 is set to B<true>, all disks are collected B<except> the ones matched.
 
+=item B<IgnoreSleepMode> B<true>|B<false>
+
+Normally, the C<smart> plugin will ignore disks that are reported to be asleep.
+This option disables the sleep mode check and allows the plugin to collect data
+from these disks anyway. This is useful in cases where libatasmart mistakenly
+reports disks as asleep because it has not been updated to incorporate support
+for newer idle states in the ATA spec.
+
 =back
 
 =head2 Plugin C<snmp>
index 7b39aaee867c83f8d5fdaa3cbb18535f19e6f58b..45bfd171275f6ae7f874fab6ffdb06bcf7ff8566 100644 (file)
 static const char *config_keys[] =
 {
   "Disk",
-  "IgnoreSelected"
+  "IgnoreSelected",
+  "IgnoreSleepMode"
 };
 
 static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
 static ignorelist_t *ignorelist = NULL;
+static int ignore_sleep_mode = 0;
 
 static int smart_config (const char *key, const char *value)
 {
@@ -60,6 +62,11 @@ static int smart_config (const char *key, const char *value)
       invert = 0;
     ignorelist_set_invert (ignorelist, invert);
   }
+  else if (strcasecmp ("IgnoreSleepMode", key) == 0)
+  {
+    if (IS_TRUE (value))
+      ignore_sleep_mode = 1;
+  }
   else
   {
     return (-1);
@@ -165,10 +172,13 @@ static void smart_handle_disk (const char *dev)
     DEBUG ("smart plugin: disk %s has no SMART support.", dev);
     goto end;
   }
-  if (sk_disk_check_sleep_mode (d, &awake) < 0 || !awake)
+  if (!ignore_sleep_mode)
   {
-    DEBUG ("smart plugin: disk %s is sleeping.", dev);
-    goto end;
+    if (sk_disk_check_sleep_mode (d, &awake) < 0 || !awake)
+    {
+      DEBUG ("smart plugin: disk %s is sleeping.", dev);
+      goto end;
+    }
   }
   if (sk_disk_smart_read_data (d) < 0)
   {