fix: spurious errors/warnings from a pc13v HA deploy (bug-1872..1877)

- bug-1872 (worker): "Failed to find any disk statistics in
  /proc/diskstats" ERROR every 15 s on an NVMe-only host. The whole-disk
  filter guessed from the name and skipped anything ending in a digit or
  containing 'p' -- every nvmeXnY, mmcblkN, even sdp -- so io was never
  reported. diskstats.h now counts a device only when
  /sys/block/<name>/device exists (real disks; not partitions, loop, dm,
  md, zram), and a host with no disk warns once.
- bug-1873 (worker): "Failed to get worker pid" WARN on job start. MainPID
  reads 0 until systemd has forked the new transient unit; xcecd.c already
  retries, so the miss is DEBUG and the final failure names the unit.
- bug-1874 (scheduler): deprecation WARN for the legacy xce_sched_fcfs on
  every start, though builtin_fcfs is the picker. Registration still wraps
  a job_elect_fn plugin but no longer warns; selecting one warns once.
- bug-1875 (apiserver): "Not running as root -- PAM authentication will not
  work" with the default provider config_file; now only for provider pam.
- bug-1876 (controller): standbys logged "cluster_init_phase2 ... failed
  (rc=-22)" WARN every 3 s while waiting for the primary's config push,
  a state the function itself calls normal. It returns -EAGAIN for that
  wait; callers log it at INFO, other failures still WARN.
- bug-1877 (controller): "WAL/snapshot stored unencrypted" warned without
  looking. persist_path_encrypted() checks fscrypt (statx) and dm-crypt
  (sysfs dm/uuid CRYPT-, through LVM slaves); the warning stays when the
  storage is not shown to be encrypted (e.g. a plain /tmp).

Tests: worker diskstats_test (2 of 4 RED on the old filter with pc13v's
/proc/diskstats), controller test_phase2_cold_boot and
test_persist_encryption, scheduler picker tests, apiserver
TestRootWarning. Full ASAN build: all 113 suites pass (controller 319/0,
harness 141/0).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Rongsong Shen 2026-09-28 04:35:19 +00:00
parent 8cadeeb2d0
commit 44173f74ae
Signed by untrusted user: rshen
GPG key ID: 80533536B0EB651C
23 changed files with 619 additions and 63 deletions

View file

@ -27,6 +27,7 @@
#include <string.h>
#include <sys/stat.h>
#include <sys/statfs.h>
#include <sys/sysmacros.h> /* major/minor -- bug-1877 */
#include <time.h>
#include <unistd.h>
#include <zlib.h>
@ -1147,6 +1148,85 @@ void persist_set_workdir(persist_t* p, const char* workdir, const char* name)
snprintf(p->snap_path, sizeof(p->snap_path), "%s/data/snap", effective);
}
static int dmcrypt_walk(const char* sysfs, unsigned maj, unsigned min,
int depth)
{
char path[512];
char uuid[128] = "";
FILE* fp;
DIR* d;
struct dirent* de;
int found = 0;
if (depth > 8) {
return 0;
}
snprintf(path, sizeof(path), "%s/dev/block/%u:%u/dm/uuid", sysfs, maj, min);
fp = fopen(path, "r");
if (fp != NULL) {
if (fgets(uuid, sizeof(uuid), fp) == NULL) {
uuid[0] = '\0';
}
fclose(fp);
if (strncmp(uuid, "CRYPT-", 6) == 0) {
return 1;
}
}
/* a stacked device (LVM, md, ...) is encrypted if what it sits on is */
snprintf(path, sizeof(path), "%s/dev/block/%u:%u/slaves", sysfs, maj, min);
d = opendir(path);
if (d == NULL) {
return 0;
}
while (!found && (de = readdir(d)) != NULL) {
char devpath[512];
unsigned smaj, smin;
if (de->d_name[0] == '.') {
continue;
}
snprintf(devpath, sizeof(devpath), "%s/class/block/%s/dev", sysfs,
de->d_name);
fp = fopen(devpath, "r");
if (fp == NULL) {
continue;
}
if (fscanf(fp, "%u:%u", &smaj, &smin) == 2) {
found = dmcrypt_walk(sysfs, smaj, smin, depth + 1);
}
fclose(fp);
}
closedir(d);
return found;
}
int persist_dev_is_dmcrypt(const char* sysfs, unsigned maj, unsigned min)
{
return dmcrypt_walk(sysfs, maj, min, 0);
}
int persist_path_encrypted(const char* path)
{
struct statx stx;
struct stat st;
#ifdef STATX_ATTR_ENCRYPTED
if ((statx(AT_FDCWD, path, 0, STATX_BASIC_STATS, &stx) == 0)
&& (stx.stx_attributes_mask & STATX_ATTR_ENCRYPTED)
&& (stx.stx_attributes & STATX_ATTR_ENCRYPTED)) {
return 1; /* fscrypt */
}
#else
(void)stx;
#endif
if (stat(path, &st) != 0) {
return 0;
}
return persist_dev_is_dmcrypt("/sys", major(st.st_dev), minor(st.st_dev));
}
int persist_init(persist_t* p, persist_config_t* cfg, cluster_t* c)
{
p->cluster = c;
@ -1288,9 +1368,16 @@ int persist_init(persist_t* p, persist_config_t* cfg, cluster_t* c)
pthread_cond_init(&p->fsync_cond, NULL);
repl_init(&p->repl); /* P2-4: fan-out replicator lifecycle */
WARN("WAL/snapshot stored unencrypted in %s — "
"ensure filesystem is encrypted if job payloads contain sensitive data",
p->wal_path);
/* bug-1877: only warn when the storage is not shown to be encrypted;
* this used to warn on every start without looking */
if (persist_path_encrypted(p->wal_path)) {
INFO("WAL/snapshot in %s is on encrypted storage", p->wal_path);
} else {
WARN("WAL/snapshot stored unencrypted in %s — "
"ensure filesystem is encrypted if job payloads contain "
"sensitive data",
p->wal_path);
}
return 0;
}