Skip to content

system/nxpkg: Make the storage root configurable and crash-safe. - #3642

Open
aviralgarg05 wants to merge 2 commits into
apache:masterfrom
aviralgarg05:gsoc/nxpkg-sync-lifecycle-hardening-pr5
Open

system/nxpkg: Make the storage root configurable and crash-safe.#3642
aviralgarg05 wants to merge 2 commits into
apache:masterfrom
aviralgarg05:gsoc/nxpkg-sync-lifecycle-hardening-pr5

Conversation

@aviralgarg05

@aviralgarg05 aviralgarg05 commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Note: Please adhere to Contributing Guidelines.

Summary

This PR has been reduced to the storage layer. The rest of what it used to
contain is now in #3718, #3719 and #3720, in that order.

The package store, the catalog and the temporary download area were fixed
paths spread across /etc, /var/lib and /var/cache. A board rarely has
all three, and nothing let it put them somewhere it does have, such as a
removable card. They are now derived from CONFIG_SYSTEM_NXPKG_ROOT.

Every file the package manager owns was also written in place, so a reset
partway through a write left a truncated catalog or database behind. Writes
now go to a temporary file that is renamed into place.

Locking used only the file modification time. A card whose clock does not
follow CLOCK_REALTIME reports a file created a moment ago as decades old,
so a live lock looked stale to the next caller and was taken away from its
owner. Each lock now records a per-boot token and the owning task, so a
contender can tell a live owner from an abandoned one, and reclaims the
lock only in the second case.

Diagnostics go to syslog, since a package operation started by a supervisor
has no console to print to. pkg_runtime_compat() also falls back to
CONFIG_ARCH_BOARD_CUSTOM_NAME, because a board with a custom board
directory defines no CONFIG_ARCH_BOARD at all, which does not build.

Impact

  • New feature: NO, this is the foundation the other three parts build on.
  • User adaptation: YES. The storage root moves to
    CONFIG_SYSTEM_NXPKG_ROOT, default /var/lib/nxpkg. A board that mounts
    writable storage elsewhere sets that symbol.
  • Build: NO.
  • Hardware: NO.
  • Documentation: The companion documentation is Documentation: Update nxpkg and add nxstore guide. nuttx#18875.
  • Security: NO new boundary.
  • Compatibility: A store created under the old fixed paths is not migrated;
    point CONFIG_SYSTEM_NXPKG_ROOT at the old location to keep it.

Testing

Build host: macOS 26.5, arm64, xtensa-esp-elf-gcc 14.2.0
(esp-14.2.0_20251107).

Target: Xtensa / ESP32-S3, Waveshare ESP32-S3-Touch-LCD-7.

  • nxstyle, tools/checkpatch.sh, codespell and git diff --check on
    every changed file
  • all system/nxpkg sources compiled for the target
  • this part builds on master on its own; the three that follow declare it
    with Depends-On

On the target: a lock held by a running task was kept while a second caller
asked for it, and locks left by an exited task and by an earlier boot were
both reclaimed.

PR verification Self-Check

  • This PR introduces one focused change.
  • I have updated all required description fields above.
  • I have reviewed and signed every commit.
  • This PR adheres to the current contribution and coding guidelines.
  • My PR is still work in progress.
  • My PR is ready for review and can be safely merged.

Comment thread system/nxpkg/Kconfig Outdated
Comment thread system/nxpkg/README.txt Outdated
Comment thread system/nxpkg/pkg_install.c Outdated
Comment thread system/nxpkg/pkg_repo.c Outdated
Comment thread system/nxpkg/pkg_repo.c Outdated
Comment thread system/nxpkg/pkg_store.c Outdated
Comment thread system/nxpkg/pkg_store.c Outdated
@aviralgarg05
aviralgarg05 force-pushed the gsoc/nxpkg-sync-lifecycle-hardening-pr5 branch from c4f639c to f363a8f Compare July 24, 2026 10:01
@aviralgarg05 aviralgarg05 changed the title system/nxpkg: network sync, install hardening, and CLI completion system/nxpkg: Add network sync and harden package lifecycle. Jul 24, 2026
@aviralgarg05
aviralgarg05 force-pushed the gsoc/nxpkg-sync-lifecycle-hardening-pr5 branch from f363a8f to 45a9292 Compare August 6, 2026 16:35
@aviralgarg05

Copy link
Copy Markdown
Contributor Author

Rebased onto current master (2aebae740) and squashed to a single commit.

The squash also removes an artefact of the previous history: the first commit added system/nxpkg/README.txt and a later commit removed it again after review, which made tools/checkpatch.sh fail on the intermediate commit while trying to resolve a path that no longer exists. All checks pass on the squashed commit.

The diff is limited to system/nxpkg/. Keeping this as a draft until I attach the full HTTP lifecycle transcript (sync, install, update, rollback, remove, and checksum rejection) from the ESP32-S3 target.

@aviralgarg05
aviralgarg05 marked this pull request as ready for review August 7, 2026 14:35
Comment thread system/nxpkg/Makefile Outdated
@linguini1

Copy link
Copy Markdown
Contributor

This is a 2.5k LoC patch with 1 commit. Your PR lists a bunch of functionally different features in this PR (i.e adding an icon, adding SHA checks). Please split this into multiple commits, and ideally open a few PRs.

@acassis

acassis commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

This is a 2.5k LoC patch with 1 commit. Your PR lists a bunch of functionally different features in this PR (i.e adding an icon, adding SHA checks). Please split this into multiple commits, and ideally open a few PRs.

I suggest dividing in more commit inside this PR, because he has already many PRs opened and the final evaluation date is arriving

@linguini1

Copy link
Copy Markdown
Contributor

It won't make much difference except that the patches will be easier to review if split into many.

@aviralgarg05

Copy link
Copy Markdown
Contributor Author

It won't make much difference except that the patches will be easier to review if split into many.

I will split and stack the PRs, it will be easy for review then

@linguini1

Copy link
Copy Markdown
Contributor

Thank you Aviral!

halyssonJr

This comment was marked as off-topic.

@aviralgarg05
aviralgarg05 force-pushed the gsoc/nxpkg-sync-lifecycle-hardening-pr5 branch 2 times, most recently from 7641371 to 84d3bd3 Compare August 11, 2026 19:08
The package store, the catalog and the temporary download area were fixed
paths spread across /etc, /var/lib and /var/cache. A board rarely has all
three, and nothing let it put them somewhere it does have, such as a
removable card.

Derive all of them from CONFIG_SYSTEM_NXPKG_ROOT instead. Also send the
diagnostics to syslog, since a package operation started by a supervisor
has no console to print to, and fall back to CONFIG_ARCH_BOARD_CUSTOM_NAME
when a board defines no CONFIG_ARCH_BOARD, which is otherwise undefined
rather than empty and fails to build.

Assisted-by: OpenAI Codex:gpt-5.6-sol
Signed-off-by: aviralgarg05 <gargaviral99@gmail.com>
Every file the package manager owns was written in place, so a reset partway
through left a truncated catalog or database behind. Locking used only the
file modification time, which a card whose clock does not follow
CLOCK_REALTIME reports as decades old, so a lock created a moment earlier
looked stale to the next caller.

Write through a temporary file and rename it, and record a per-boot token
and the owner task in each lock so a contender can tell a live owner from
an abandoned one. Reject a zero-byte write rather than looping on it, and
add the path helpers the download and rollback paths need.

Assisted-by: OpenAI Codex:gpt-5.6-sol
Signed-off-by: aviralgarg05 <gargaviral99@gmail.com>
@aviralgarg05
aviralgarg05 force-pushed the gsoc/nxpkg-sync-lifecycle-hardening-pr5 branch from 84d3bd3 to ca37b4d Compare August 11, 2026 19:12
@github-actions github-actions Bot added Size: L and removed Size: XL labels Aug 11, 2026
@aviralgarg05 aviralgarg05 changed the title system/nxpkg: Add network sync and harden package lifecycle. system/nxpkg: Make the storage root configurable and crash-safe. Aug 11, 2026
@aviralgarg05

Copy link
Copy Markdown
Contributor Author

Split as asked. This PR now carries only the storage layer, and the rest went into three follow-ups:

Each declares the one before it with Depends-On, so CI applies them in order. Only this one builds on master by itself, which is why it is first.

The content is unchanged from what you already reviewed; it is the same tree, cut into six commits across four PRs.

Comment thread system/nxpkg/pkg_store.c
* Private Data
****************************************************************************/

static pthread_once_t g_pkg_lock_boot_once = PTHREAD_ONCE_INIT;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could we remove the global changed variable from nxpkg? so multiple instances could run concurrently.

Comment thread system/nxpkg/pkg.h

/* nxpkg is a one-shot CLI, not a daemon, so a lock file older than this
* cannot belong to a still-running install under normal use (even a full
* multi-MB artifact over a slow link finishes well within this window) -

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How slow of a link? Did you test this on something or is this hypothesizing. 10 minutes seems pretty reasonable for now, but I would remove this claim.

Comment thread system/nxpkg/pkg.h
Comment on lines +93 to +116
static inline void *pkg_malloc(size_t size)
{
return malloc(size);
}

static inline void *pkg_zalloc(size_t size)
{
return calloc(1, size);
}

static inline void *pkg_realloc(void *ptr, size_t size)
{
return realloc(ptr, size);
}

static inline void pkg_free(void *ptr)
{
free(ptr);
}

static inline FAR char *pkg_path_alloc(void)
{
return pkg_malloc(PATH_MAX);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why

Comment thread system/nxpkg/pkg_compat.c
Comment on lines +45 to +50
#elif defined(CONFIG_ARCH_BOARD_CUSTOM_NAME)
if (CONFIG_ARCH_BOARD_CUSTOM_NAME[0] != '\0')
{
return CONFIG_ARCH_BOARD_CUSTOM_NAME;
}
#endif

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why check this if you'll just return the empty string anyways?

Comment thread system/nxpkg/pkg_log.c
}

syslog(strcmp(level, "error") == 0 ? LOG_ERR : LOG_INFO,
"nxpkg: %s: %s", level, message);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't add level to the message. There is already a syslog option that allows level to be logged.

I would suggest a macro that just compile time prefixes the message with nxpkg if you need that, but there is also a syslog option that allows logging the process name as well which is a better choice.

Comment thread system/nxpkg/pkg_store.c
Comment on lines +367 to +387
/* Compatibility for empty lock files created by older nxpkg images.
* Their only ownership information is the filesystem timestamp.
*/

if (stat(path, &st) < 0)
{
return;
}

now = time(NULL);
if (now < st.st_mtime ||
(now - st.st_mtime) < PKG_LOCK_STALE_SECONDS)
{
return;
}

pkg_error("reclaiming legacy stale lock '%s' (age %ld s)",
path, (long)(now - st.st_mtime));
unlink(path);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is compatibility necessary? This application is quite new and unfinished anyways.

Comment thread system/nxpkg/pkg_store.c
UNUSED(version);

/* This used to be "PKG_TMP_PKG_DIR/name-version.pkg", which breaks on
* this SD card's short-name-only FAT mount as soon as name+version

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't mention "this SD card". Just refer to short name FAT. This is an application

Comment thread system/nxpkg/pkg_store.c
Comment on lines +498 to +502
* unlike pkg_store_make_tmp_path()'s already-FAT-safe scheme. The
* pid is small, bounded, and unique per concurrently running install
* (each `nxpkg install` is its own process with its own per-name
* lock), so it can't collide the way a single fixed name would if
* two different packages were being installed at once.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function just checks a length. We don't need to know about another function's safe naming scheme here, it's confusing. Check the AI generated comments for relevance.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants