Skip to content

2.0rc1: handle Seagate vendor-packed raw values for attribute 1/7 (Raw_Read_Error_Rate norm flaps with zero actual errors) #72

Description

@karan

Description

snapraidd tracks norm-value changes for all attributes smartctl reports as type: prefail and emits a warning report on any degradation. On Seagate drives this causes recurring false "degraded" warnings for attribute 1 (Raw_Read_Error_Rate) and attribute 7 (Seek_Error_Rate) even though the drives have zero real read errors.

Observed behavior (ST8000VN004, ~45k power-on hours):

Disk data2:
Raw_Read_Error_Rate
norm degraded to 71 (-29)
worst 64 thresh 44

The raw value on Seagate drives is vendor-packed as errors << 32 | sectors_read - smartctl renders it as 0/113191894: 0 actual errors, 113M sectors read. Seagate derives the normalized value from that ratio, so it drifts with read workload and bounces up and down over the drive's life. WD drives report plain counters, so their norms are stable - this is vendor-specific encoding, not degradation.

Relevant code

  • daemon/parser.c (~line 1201): norm history is tracked for all prefail-typed attributes; attr 1/7 have no entry in the SMART_ENTRIES table in daemon/smart.c, so there is no kind/format awareness for their raw layout.
  • Precedent already exists in-repo: the attr 188 Command_Timeout entries carry the comment "adjusted from 48 to 16 to avoid Seagate packed values" (smartmontools ticket 551). Same class of problem, solved for that one attribute only.
  • sys_smartignore suppresses the notification but still prints the change tagged (ignored) in reports, and doesn't address the underlying misinterpretation.

Proposed fix (one or both):

  1. Add vendor-aware handling for attrs 1/7: split the 48-bit raw as 16-bit error count (upper) + 32-bit sector count (lower), track the error component as a COUNT attribute, and exclude workload-derived norm drift for these attributes from warning reports. smartmontools' drivedb.h -v formats are the reference implementation.
  2. Alternatively/additionally: let sys_smartignore fully suppress an ignored attribute from report output (currently it only tags the line (ignored)), giving users a config-level escape hatch without code changes.

Health is not affected in my case (norm 71 vs threshold 44, all real failure counters at 0), but the daily reports train the eye to dismiss warnings - which is the opposite of what a monitor should do.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdone

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions