Skip to content

Sync main → net8#745

Closed
arcenox wants to merge 109 commits intonet8from
sync-main-to-net8-20260321-141855
Closed

Sync main → net8#745
arcenox wants to merge 109 commits intonet8from
sync-main-to-net8-20260321-141855

Conversation

@arcenox
Copy link
Copy Markdown
Collaborator

@arcenox arcenox commented Mar 21, 2026

Automated Branch Sync

This PR merges recent changes from main into net8.


Created automatically by branch sync workflow

arcenox and others added 30 commits November 14, 2025 18:51
* Fixed the scheduler background to Task.Delay since the Peridic Timer were skipping ticks on short interval with seconds.

* small refactor

* fixed the mixd up delete ticker
* Made improvements and new feature: request by default not using GZIP compression

* Added timezone dashboard support and other fix on features.

* Fixed the seefing data
* Added some new features on dashboard and on demand running directly without giving pressure of background scheduler

* Added dispatch interfaces

* added pagination on machine names

* Added test coverage

* added examples

* Added sample sqlite for samples

* Added csproj fules for Sample data

* fixed the locking of immediate run ticker in safe for runcondition

* fiexed indexing, the scheduler on high run and memory persistence

* fixed dashboard path merge

* small fixes on manager

* Added migration changes for examples
* Fix schema assignment logic in UseTickerQDbContext and add SetSchema method

* Refactor UseTickerQDbContext to simplify schema assignment logic
* Checkpoint from VS Code for coding agent session

* Remove documentation on separating job queueing from job processing
* Add retry logic improvements and unit tests for ExecuteTaskAsync

* Refactor retry test setup to use SetupRetryTestFixture for consistency
arcenox and others added 23 commits March 15, 2026 00:15
* Add per-function concurrency control via maxConcurrency attribute parameter (#458)

Adds a `maxConcurrency` parameter to `[TickerFunction]` that limits how many
instances of a specific function can execute concurrently. When set to 0 (default),
concurrency is unlimited (preserving backward compatibility). The limit is enforced
via a per-function SemaphoreSlim in the dispatcher, queuing excess work instead of
skipping it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add tests for per-function concurrency gate and dispatcher concurrency behavior

Tests cover:
- ConcurrencyGate: null for unlimited, semaphore creation, caching, independence
- Dispatcher: semaphore acquire/release, release on exception, independent
  semaphores per function, serialized execution with maxConcurrency=1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Apply concurrency gate to all QueueAsync call sites

Previously only TickerQDispatcher and FallbackBackgroundService used the
concurrency gate. This adds it to TickerQSchedulerBackgroundService (the
main scheduler loop) and SdkExecutionEndpoint (SDK remote execution).

Also moves ITickerFunctionConcurrencyGate to TickerQ.Utilities so the SDK
project can resolve it from DI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add scheduler concurrency gate integration tests

Verify that TickerQSchedulerBackgroundService correctly uses the
concurrency gate when queuing tasks: semaphore acquire/release on
success, release on exception, and no semaphore for unlimited functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Centralize test project versions via Directory.Build.props

Replace hardcoded TargetFramework and package versions in test projects
with MSBuild variables (DotNetVersion), matching the pattern used by src
projects. This ensures version compatibility when backporting to v8/v9.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add EntityFrameworkCore test project to PR workflow

The pr.yaml workflow only built and ran TickerQ.Tests. Added
TickerQ.EntityFrameworkCore.Tests to both the build and test steps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix design-time DbContext tests failing due to EF Core GetService throw

EF Core's GetService<T>() extension throws InvalidOperationException
when the service is unresolvable, so the null-conditional (?.) from
#652 never executes. Use try-catch to fall back to DefaultSchema.
Also add EnableServiceProviderCaching(false) to prevent model cache
pollution across tests with the same DbContext type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Fix AddStackExchangeRedis overriding EF Core persistence provider (#669)

Change Redis persistence registration to TryAddSingleton so EF Core's
AddSingleton takes precedence regardless of registration order. Move
in-memory provider registration after external providers as a
TryAddSingleton fallback. Add dedicated Redis test project with
registration precedence tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add functional tests for persistence provider CRUD via managers and DI

Exercise ITimeTickerManager, ICronTickerManager, and
ITickerPersistenceProvider end-to-end through in-memory, EF Core,
and EF Core + Redis configurations. Add InternalsVisibleTo for the
new test project.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add concurrency and locking tests for persistence providers

Test lock acquisition, optimistic concurrency, dead node recovery,
concurrent multi-node access, cron occurrence locking, and
per-function concurrency gate (serialized/parallel execution,
exception safety).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use atomic Lua scripts for Redis acquire/release/recovery operations

Replace all non-atomic read-check-write patterns with Redis Lua scripts
that execute atomically (single-threaded), eliminating TOCTOU race
conditions in multi-node deployments. This brings Redis provider parity
with EF Core's atomic ExecuteUpdateAsync + WHERE clause guarantees.

Three Lua scripts: AcquireScript (status/holder/updatedAt check + lock),
ReleaseScript (status/holder check + unlock), RecoverDeadNodeScript
(dead node holder match + reset to Idle).

10 methods updated: QueueTimeTickers, QueueTimedOutTimeTickers,
AcquireImmediateTimeTickersAsync, ReleaseAcquiredTimeTickers,
ReleaseDeadNodeTimeTickerResources, QueueCronTickerOccurrences,
QueueTimedOutCronTickerOccurrences, AcquireImmediateCronOccurrencesAsync,
ReleaseAcquiredCronTickerOccurrences, ReleaseDeadNodeOccurrenceResources.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
… reference (#680)

- Changed Redis registration test to check service descriptor instead
  of resolving the provider, which triggered a real Redis connection
  and failed in CI environments without Redis.
- Removed redundant Microsoft.Extensions.Hosting.Abstractions package
  reference from TickerQ.csproj — it's already a transitive dependency
  from TickerQ.Utilities, and the explicit lower-bound reference caused
  NU1605 package downgrade errors.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…le bug (#683)

- Date format now adapts to selected timezone: EU (dd/MM/yyyy), US (MM/dd/yyyy), ISO (yyyy-MM-dd)
- Applied timezone-aware formatting to all date displays including tables, graphs, and date picker
- Fixed cron ticker enable/disable dialog showing inverted text
- Fixed Redis persistence not filtering disabled cron tickers in GetAllCronTickerExpressions

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Simplify EF Core DbContext session pattern and remove dead validation

- Remove dead originalDescriptor lookup and throw in UseApplicationDbContext
  (the variable was unused after PR #590 switched to IDbContextOptionsConfiguration)
- Replace ITickerDbContextFactory/ITickerDbContextSession interfaces with a
  simpler DbContextLease struct that handles both IDbContextFactory and
  scoped DbContext resolution
- Remove ITickerDbContextFactory DI registration — BasePersistenceProvider
  now takes IServiceProvider directly and creates leases via helper methods
- Addresses feedback from @jods4 on PR #590

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update EF Core tests to use IServiceProvider instead of removed ITickerDbContextFactory

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#691)

Tests cover factory path, scoped path, pooled factory, precedence,
instance isolation, dispose behavior, change tracking isolation,
and error cases when no DbContext is registered.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Includes 6 comparison benchmarks (cron parsing, job creation, serialization,
startup registration, delegate invocation, concurrent throughput) plus 7
internal TickerQ micro-benchmarks. All runnable via `dotnet run -c Release`.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
)

* Register scoped DbContext from factory for direct injection (#700)

UseTickerQDbContext only registered IDbContextFactory<TContext> but not
TContext itself, preventing users from injecting the DbContext directly.
Add a scoped registration that creates instances from the factory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* new fix on db context scope create, release: 10.2.1

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…er (#709)

* Restructure hub projects: move RemoteExecutor and SDKs into hub/ folder

- Move TickerQ.RemoteExecutor to hub/remoteExecutor/
- Move TickerQ.SDK (.NET) to hub/sdks/dotnet/
- Add TickerQ Node.js SDK to hub/sdks/node/ with full source, README, and LICENSE
- Add hub/Directory.Build.props with corrected icon.jpg path for NuGet packaging
- Add .gitignore for Node.js SDK
- Update src.sln project references to new paths

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix TickerQ.slnx project paths for hub restructuring

Update RemoteExecutor and SDK paths in root slnx to match the new
hub/ folder structure, fixing CI build and test failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix build.yml project paths for hub restructuring

Update SDK and RemoteExecutor build/pack paths from src/ to hub/
to match the new folder structure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Add CLA.md with copyright/patent license grants for contributors
- Add CONTRIBUTING.md with development setup and contribution process
- Add GitHub Actions CLA workflow using contributor-assistant/github-action
- Allowlist dependabot, github-actions, and renovate bots

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ection

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Update LICENSE, CLA.md, README.md to reference Arcenox LLC
- Add Authors and Copyright tags to Directory.Build.props
- Clean trailing whitespace in LICENSE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace cherry-pick workflow with merge-based sync (handles renames/deletions naturally)
- Add .sync-overrides config for generic version replacement rules
- Apply version overrides from config instead of hardcoded sed commands
- Post PR comment with sync details (restored files + version overrides applied)
- Auto-resolve conflicts: excluded files keep target, everything else takes main

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts:
#	.github/workflows/sync-version-branches.yml
#	.sync-exclude
#	TickerQ.sln
#	hub/remoteExecutor/TickerQ.RemoteExecutor/TickerQ.RemoteExecutor.csproj
#	hub/sdks/dotnet/TickerQ.SDK/TickerQ.SDK.csproj
#	samples/TickerQ.Sample.ApplicationDbContext/TickerQ.Sample.ApplicationDbContext.csproj
#	samples/TickerQ.Sample.Console/TickerQ.Sample.Console.csproj
#	samples/TickerQ.Sample.Dashboard.ReflectionFree/TickerQ.Sample.Dashboard.ReflectionFree.csproj
#	samples/TickerQ.Sample.WebApi/TickerQ.Sample.WebApi.csproj
#	samples/TickerQ.Sample.WorkerService/TickerQ.Sample.WorkerService.csproj
#	src/Directory.Build.props
#	src/TickerQ.Dashboard/TickerQ.Dashboard.csproj
#	src/TickerQ.EntityFrameworkCore/Customizer/CustomizerServiceDescriptor.cs
#	src/TickerQ.EntityFrameworkCore/Infrastructure/BasePersistenceProvider.cs
#	src/TickerQ.EntityFrameworkCore/Infrastructure/MappingExtensions.cs
#	src/TickerQ.EntityFrameworkCore/Properties/InternalsVisibleTo.cs
#	src/TickerQ.EntityFrameworkCore/TickerQ.EntityFrameworkCore.csproj
#	src/TickerQ.Instrumentation.OpenTelemetry/TickerQ.Instrumentation.OpenTelemetry.csproj
#	src/TickerQ.Utilities/TickerQ.Utilities.csproj
#	tests/Directory.Build.props
#	tests/TickerQ.EntityFrameworkCore.Tests/TickerQ.EntityFrameworkCore.Tests.csproj
#	tests/TickerQ.Tests/TickerQ.Tests.csproj
@arcenox arcenox added automated Automated PR sync Branch synchronization net8 Target: net8 branch labels Mar 21, 2026
@arcenox
Copy link
Copy Markdown
Collaborator Author

arcenox commented Mar 21, 2026

Sync Details

Excluded files restored from net8

These files have version-specific implementations and were kept as-is (defined in .sync-exclude).

  • src/TickerQ.EntityFrameworkCore/Infrastructure/MappingExtensions.cs
  • src/TickerQ.EntityFrameworkCore/Infrastructure/BasePersistenceProvider.cs
  • src/TickerQ.EntityFrameworkCore/Infrastructure/TickerQueryExtensions.cs
  • TickerQ.sln

Version overrides

No overrides were needed.

@arcenox
Copy link
Copy Markdown
Collaborator Author

arcenox commented Mar 21, 2026

Closing — .sync-overrides was missing when this sync ran. Will re-trigger after merging #744.

@arcenox arcenox closed this Mar 21, 2026
@arcenox arcenox deleted the sync-main-to-net8-20260321-141855 branch March 21, 2026 15:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Automated PR net8 Target: net8 branch sync Branch synchronization

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants