11using System . Collections . Concurrent ;
22using System . Globalization ;
3+ using System . Text ;
34using Microsoft . Extensions . Logging ;
45using Microsoft . Extensions . Options ;
6+ using Orleans . Configuration ;
57using StackExchange . Redis ;
68
79namespace Orleans . DurableJobs . Redis ;
@@ -14,8 +16,10 @@ public sealed partial class RedisJobShardManager : JobShardManager
1416 private readonly ILocalSiloDetails _localSiloDetails ;
1517 private readonly IClusterMembershipService _clusterMembership ;
1618 private readonly RedisJobShardOptions _options ;
19+ private readonly ClusterOptions _clusterOptions ;
1720 private readonly ILogger < RedisJobShardManager > _logger ;
1821 private readonly ILoggerFactory _loggerFactory ;
22+ private readonly RedisKey _keyPrefix ;
1923
2024 private IConnectionMultiplexer ? _multiplexer ;
2125 private RedisOperationsManager ? _redisOps ;
@@ -30,20 +34,26 @@ public sealed partial class RedisJobShardManager : JobShardManager
3034 /// </summary>
3135 /// <param name="localSiloDetails">The local silo details.</param>
3236 /// <param name="options">The Redis job shard options.</param>
37+ /// <param name="clusterOptions">The cluster options.</param>
3338 /// <param name="clusterMembership">The cluster membership service.</param>
3439 /// <param name="loggerFactory">The logger factory.</param>
3540 public RedisJobShardManager (
3641 ILocalSiloDetails localSiloDetails ,
3742 IOptions < RedisJobShardOptions > options ,
43+ IOptions < ClusterOptions > clusterOptions ,
3844 IClusterMembershipService clusterMembership ,
3945 ILoggerFactory loggerFactory )
4046 : base ( localSiloDetails . SiloAddress )
4147 {
4248 _localSiloDetails = localSiloDetails ?? throw new ArgumentNullException ( nameof ( localSiloDetails ) ) ;
4349 _options = options ? . Value ?? throw new ArgumentNullException ( nameof ( options ) ) ;
50+ _clusterOptions = clusterOptions ? . Value ?? throw new ArgumentNullException ( nameof ( clusterOptions ) ) ;
4451 _clusterMembership = clusterMembership ?? throw new ArgumentNullException ( nameof ( clusterMembership ) ) ;
4552 _loggerFactory = loggerFactory ?? throw new ArgumentNullException ( nameof ( loggerFactory ) ) ;
4653 _logger = loggerFactory . CreateLogger < RedisJobShardManager > ( ) ;
54+
55+ _keyPrefix = Encoding . UTF8 . GetBytes (
56+ _options . KeyPrefix ?? $ "{ _clusterOptions . ServiceId } /durablejobs") ;
4757 }
4858
4959 private async ValueTask InitializeIfNeeded ( )
@@ -60,8 +70,8 @@ private async ValueTask InitializeIfNeeded()
6070 LogInitialized ( _logger ) ;
6171 }
6272
63- private string ShardSetKey => $ "durablejobs :shards:{ _options . ShardPrefix } ";
64- private static string MetaKeyForShard ( string shardId ) => $ "durablejobs :shard:{ shardId } :meta";
73+ private string ShardSetKey => $ "{ _keyPrefix } :shards:{ _options . ShardPrefix } ";
74+ private string MetaKeyForShard ( string shardId ) => $ "{ _keyPrefix } :shard:{ shardId } :meta";
6575
6676 public override async Task < List < IJobShard > > AssignJobShardsAsync ( DateTimeOffset maxDueTime , CancellationToken cancellationToken )
6777 {
@@ -165,7 +175,7 @@ public override async Task<List<IJobShard>> AssignJobShardsAsync(DateTimeOffset
165175 var minDue = ParseDateTimeOffset ( metadata , "MinDueTime" , DateTimeOffset . MinValue ) ;
166176 var maxDue = ParseDateTimeOffset ( metadata , "MaxDueTime" , DateTimeOffset . MaxValue ) ;
167177
168- var shard = new RedisJobShard ( shardId , minDue , maxDue , _multiplexer ! , metadata , _options , _loggerFactory . CreateLogger < RedisJobShard > ( ) ) ;
178+ var shard = new RedisJobShard ( shardId , minDue , maxDue , _multiplexer ! , metadata , _keyPrefix . ToString ( ) , _options , _loggerFactory . CreateLogger < RedisJobShard > ( ) ) ;
169179 try
170180 {
171181 await shard . InitializeAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
@@ -233,7 +243,7 @@ public override async Task<IJobShard> CreateShardAsync(DateTimeOffset minDueTime
233243 continue ;
234244 }
235245
236- var shard = new RedisJobShard ( shardId , minDueTime , maxDueTime , _multiplexer ! , metadataInfo , _options , _loggerFactory . CreateLogger < RedisJobShard > ( ) ) ;
246+ var shard = new RedisJobShard ( shardId , minDueTime , maxDueTime , _multiplexer ! , metadataInfo , _keyPrefix . ToString ( ) , _options , _loggerFactory . CreateLogger < RedisJobShard > ( ) ) ;
237247 await shard . InitializeAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
238248 _jobShardCache [ shardId ] = shard ;
239249 LogShardRegistered ( _logger , shardId ) ;
@@ -313,8 +323,8 @@ private async Task DeleteShardAsync(string shardId)
313323 {
314324 await InitializeIfNeeded ( ) . ConfigureAwait ( false ) ;
315325
316- var streamKey = $ "durablejobs :shard:{ shardId } :stream";
317- var metaKey = $ "durablejobs :shard:{ shardId } :meta";
326+ var streamKey = $ "{ _keyPrefix } :shard:{ shardId } :stream";
327+ var metaKey = $ "{ _keyPrefix } :shard:{ shardId } :meta";
318328
319329 // Delete all shard-related keys
320330 await _redisOps ! . DeleteKeysAsync ( [ streamKey , metaKey ] ) . ConfigureAwait ( false ) ;
0 commit comments