Commit Graph

13010 Commits (a0a262f07fcd370994efbb0e99e30cd7f4c7d1ec)
 

Author SHA1 Message Date
Your Name a0a262f07f perf: async S3 SDK upload path for emoji migration
Process-level workers plateaued at ~7.5 uploads/sec against Fastly Object
Storage because each PUT is high-latency and only a handful ran concurrently.

Add --concurrency=N which uses the AWS SDK CommandPool to keep N PutObject
requests in flight from a single process. A successful PutObject response is
the confirmation (no separate HEAD verify), and the local file is deleted on
success. Commands are yielded lazily so memory stays flat over large runs.

--no-acl escape hatch for S3-compatible stores that reject the ACL header.
4 weeks ago
Your Name f17a88e16c feat: add uploads/sec throughput counter to emoji migration
- Live 'up/s' rate shown on the progress bar during single-worker runs
- Final summary reports elapsed time and uploads/sec
- Parallel runs tally moved across workers and report aggregate uploads/sec

Makes it easy to compare --workers counts and decide whether async S3
(option 2) is worth pursuing.
4 weeks ago
Your Name 00564ac221 perf: parallelise emoji cloud migration with worker processes
The migration was ~1-2s/file due to sequential S3 round-trips (HEAD + PUT +
verify HEAD). Speed it up:

- --workers=N spawns N child processes, each handling a strided slice of the
  files (index % N == shard) for real concurrency on the I/O-bound uploads
- --skip-cloud-check skips the upfront HEAD (always upload, idempotent)
- --skip-verify skips the post-upload size re-check
- --offset for manual chunking

Storage/Flysystem has no batch or async upload API, so process-level
concurrency is the pragmatic lever here.
4 weeks ago
Your Name 9e5fcb9a90 fix: skip missing.png in emoji cloud migration
The frontend renders a hardcoded /storage/emoji/missing.png local onerror
fallback for emoji, so that placeholder must stay on local disk. Skip it in
the migration so it is never moved to cloud or deleted locally.
4 weeks ago
Your Name 79eef56be0 fix: make emoji cloud migration disk-driven + add --debug
The migration was DB-driven (whereNull('uri')), which excluded federated
emoji whose media is stored locally but have a uri set -> the disk was never
scanned, resulting in moved=0.

- Drive the migration by enumerating local files under public/emoji/ instead
  of a DB query; the local file is the source of truth for what needs moving
- Add --debug to print config, custom_emoji table breakdown, local emoji dir
  contents, and per-file decisions
4 weeks ago
Shlee 6e73fd4877
Merge pull request #6962 from pixelfed/fix/emoji-cloud-url-and-guard
fix: emoji admin URLs and cloud-migration guard
4 weeks ago
Your Name aa9bb868dd fix: emoji admin URLs and cloud-migration guard
Two issues prevented emoji from serving/migrating correctly on cloud:

- Admin custom-emoji views hardcoded url('storage/'.media_path), so they
  always showed local URLs and bypassed cloud resolution. Use $emoji->url().
- The migration/command guard relied solely on config_cache('pixelfed.cloud_storage'),
  which is DB/12h-cached and can read stale-false right after cloud is
  enabled, causing the migration to silently no-op. Treat cloud as enabled
  when either live config() or config_cache() is true.
4 weeks ago
Shlee 53b3dbfe47
Merge pull request #6961 from pixelfed/fix/story-cloud-schedule
fix: schedule StoryMoveStorageLocalToCloud command
4 weeks ago
Your Name 842681b99b fix: schedule StoryMoveStorageLocalToCloud command
The story cloud-migration command was merged (#6958) but its scheduler
entry was dropped when the emoji branch (based off staging before that
merge) later merged and overwrote the scheduler block. Restore the hourly
schedule so local story media is migrated to cloud automatically.
4 weeks ago
Shlee dd007e2345
Merge pull request #6960 from pixelfed/feat/emoji-cloud-storage
Feat/emoji cloud storage
4 weeks ago
Your Name a945efbf74 feat: add migration to move local emoji to cloud on deploy
Runs admin:EmojiMoveStorageLocalToCloud during migrate so existing local
emoji are relocated to cloud as part of the upgrade, shrinking the window
where emoji URLs resolve to cloud before the files are there. No-op unless
cloud storage is enabled.
4 weeks ago
Your Name 979df6e39e feat: migrate all local emoji to cloud in one pass by default
Change --limit default to 0 (no limit) so the emoji migration processes
every local emoji in a single run instead of capping at 1000, and drop the
limit from the scheduled invocation. Avoids a multi-run window where
not-yet-migrated emoji resolve to missing cloud URLs.
4 weeks ago
Shlee fd39008677
Merge pull request #6959 from pixelfed/feat/emoji-cloud-storage
feat: store custom emoji on cloud storage when enabled
4 weeks ago
Your Name fa76e1014a feat: store custom emoji on cloud storage when enabled
Custom emoji were always written locally and served via hardcoded /storage
URLs, so they never used S3 even on cloud instances.

- CustomEmoji: centralize URL + storage on the active disk (cloud when
  pixelfed.cloud_storage is enabled, else local public/ disk) via
  urlForPath/url/storageTarget/storeMedia/storeMediaFromFile/deleteMedia
- Route emoji writes/deletes and URL generation (scan, CustomEmojiService::all)
  through those helpers in ImportEmojis, CustomEmojiService::import and
  AdminController
- Add admin:EmojiMoveStorageLocalToCloud to migrate existing local emoji to
  cloud: copy, verify by size, delete local, bust caches
- Schedule it daily when cloud storage is enabled
4 weeks ago
Shlee eae6253731
Merge pull request #6958 from pixelfed/fix/remcache-tmp-file-leak
feat: migrate local story media to cloud storage
4 weeks ago
Your Name 9f110bb74c feat: migrate local story media to cloud storage
Ensure story media lands on and stays on cloud storage for S3 instances.

- StoryExpire: archive expiring story media on the same explicit disk the
  media lives on (S3 move is a server-side copy+delete), with error handling
- Add admin:StoryMoveStorageLocalToCloud to migrate local story media
  (active + story_archives) to cloud: copy, verify by size, then delete local
- --orphans option relocates untracked story_archives/ files to cloud using
  the same copy/verify/delete flow (media is moved, never discarded)
- Schedule it hourly alongside the media migration when cloud storage is on
4 weeks ago
Shlee ec1c778c97
Merge pull request #6957 from pixelfed/fix/remcache-tmp-file-leak
Fix/remcache tmp file leak
4 weeks ago
Your Name 9704fd5a36 refactor: use GarbageCollector prefix for GC console command classes
Rename the internal garbage collector commands to a consistent
GarbageCollector* naming scheme (file + class). Command signatures are
unchanged, so the scheduler and cron entries are unaffected.

- MediaGarbageCollector          -> GarbageCollectorMedia
- DatabaseSessionGarbageCollector -> GarbageCollectorDatabaseSession
- FailedJobGC                    -> GarbageCollectorFailedJob
- PasswordResetGC                -> GarbageCollectorPasswordReset
- GCRemcache                     -> GarbageCollectorRemcache
- StoryGC                        -> GarbageCollectorStory
- ImportUploadGarbageCollection  -> GarbageCollectorImportUpload
4 weeks ago
Your Name 57b3bf140b refactor: rename RemcacheGarbageCollector to GCRemcache 4 weeks ago
Your Name 3232761a74 fix: prevent remcache temp file leaks and add GC command
The remote avatar/media fetchers wrote temp files to storage/app/remcache/
and only unlinked them on the happy path. Any exception between the write
and the unlink (e.g. a cloud upload failure) leaked the file, and nothing
swept the directory.

- Wrap post-write logic in fetchAvatar() and remoteToCloud() in try/finally
  so the temp file is always removed, even on failure
- Add gc:remcache command to delete stale remcache files (default >24h old,
  preserves .gitignore, supports --hours and --dry-run)
- Schedule gc:remcache daily to clean up any stragglers

StoryFetch already handled cleanup via try/catch and was left unchanged.
4 weeks ago
Shlee 1f85fc8da2
Merge pull request #6954 from pixelfed/add-psalm-report-script
Add psalm report script
4 weeks ago
Your Name 878775cab9 chore: resolve psalm issues in admin commands and auth
- Add return type hints (void) and final class markers
- Guard null returns from newestBackup() and putFileAs() in BackupToCloud
- Type ask() default values as strings
- Fix uses_left fallback condition for null/zero max_uses
- Annotate AdminInvite::whereInviteCode and cast Str::uuid() to string
- Ignore local redis-data and mysql-9-data dev directories
4 weeks ago
Your Name fb69275cd7 chore: target PHP 8.4 in psalm config
Set phpVersion="8.4" so Psalm targets 8.4 explicitly instead of
inferring 8.3 from composer.json's ^8.3|^8.4 constraint.
4 weeks ago
Shlee 4b45ac72b8
Merge pull request #6953 from pixelfed/add-psalm-report-script
chore: add composer psalm:report script for a full local txt report
4 weeks ago
Your Name 6eea565bab chore: add composer psalm:report script for a full local txt report
Adds a psalm:report script that ignores the baseline and writes a full
human-readable report to psalm-report.txt, including informational issues,
so all outstanding items to fix are surfaced in one file.
4 weeks ago
Shlee bbc15a64e7
Merge pull request #6952 from pixelfed/revert-hashtags-collation
Revert hashtags collation migration from #6098
4 weeks ago
Your Name 4056747666 Revert hashtags collation migration from #6098
Migration failed with a duplicate entry error: recollating to
utf8mb4_unicode_520_ci causes previously-distinct hashtag names/slugs
to collide on the unique indexes. Reverting until the data is
de-duplicated first.
4 weeks ago
Shlee 0e77345930
Merge pull request #6951 from pixelfed/shleeable-patch-1
Shleeable patch 1
4 weeks ago
Shlee 765e10ea66
Update php-pint.yml 4 weeks ago
Shlee 338d4da427
Update php-laravel-tests.yml 4 weeks ago
Shlee 9dfb5c062e
Update php-larastan.yml 4 weeks ago
Shlee 336f5f899f
Merge pull request #6098 from bpeel/hashtags-outside-bmp
Fix hashtags usings scripts outside the BMP on MySQL
4 weeks ago
Shlee 27768cd69c
Create HashtagCollationTest.php 4 weeks ago
Shlee e53e82faf3
Update 2025_07_31_164635_change_hashtags_collation.php 4 weeks ago
Shlee 94362ba8b9
Merge pull request #6950 from pixelfed/fix/6588-compacted-note-attachments
Fix/6588 compacted note attachments
4 weeks ago
Your Name 87ed60d675 Accept compacted Note attachments (#6588)
Normalize JSON-LD compacted single attachments (a bare object instead of a
one-item array) in getAttachments(), and route verifyAttachments() through it
so validation and import share one normalization path.

Includes PR #6589's tests plus additional edge-case coverage: list-form
preservation, bare-input normalization, and guards for missing/empty/scalar
attachments.
4 weeks ago
Shlee 4f9fafbc23
Merge pull request #6949 from pixelfed/fix/oidc-test-larastan
Fix/OIDC test larastan
4 weeks ago
Your Name d86fd28e34 polish 4 weeks ago
Your Name b7c15dc7ca Fix larastan errors in RemoteOidcTest: import Test attribute and RefreshDatabase, replace removed str_random helper 4 weeks ago
Shlee 79af98f9d0
Merge pull request #6667 from vinzgreg/fix/blurhash-memory-strands-video-uploads
Fix videos never reaching cloud storage by downscaling in Blurhash (#2652)
4 weeks ago
Shlee 186fa7c860
Update VideoThumbnail.php 4 weeks ago
Shlee d0ed7293e9
Merge pull request #6948 from pixelfed/add-psalm
Add vimeo/psalm and composer scripts
4 weeks ago
Your Name 4e0c567ecd Add vimeo/psalm and composer scripts 4 weeks ago
Shlee b291b7bf65
Merge pull request #6783 from thomasjacumin/dev
Use Mastodon username convention for OIDC
4 weeks ago
Shlee a82dc91295
Merge branch 'staging' into dev 4 weeks ago
Shlee f710b5eee8
Merge pull request #6947 from pixelfed/shleeable-patch-1
Update php-psalm.yml
4 weeks ago
Shlee 27f7127ccd
Update php-psalm.yml 4 weeks ago
Shlee 32aa90301f
Merge pull request #6946 from pixelfed/shleeable-patch-1
Update php-psalm.yml
4 weeks ago
Shlee 3058d3f816
Update php-psalm.yml
Comment out the SARIF report check and upload steps in the workflow.
4 weeks ago
Shlee 6d9521e1c8
Merge pull request #6945 from pixelfed/chore/add-psalm-static-analysis
Chore/add psalm static analysis
4 weeks ago