From d9802e9067212f2806779537413a204d9c8d7cd2 Mon Sep 17 00:00:00 2001 From: RogueException Date: Fri, 24 Jun 2016 22:34:30 -0300 Subject: [PATCH] Some prep work for shared datastores, removed datastoreprovider --- .../Data/{DefaultDataStore.cs => DataStore.cs} | 38 +++++++++++----------- src/Discord.Net/Data/DataStoreProvider.cs | 4 --- src/Discord.Net/Data/IDataStore.cs | 29 ----------------- src/Discord.Net/Data/SharedDataStore.cs | 11 ------- src/Discord.Net/DiscordSocketClient.cs | 5 +-- src/Discord.Net/DiscordSocketConfig.cs | 9 ++--- .../Entities/WebSocket/CachedGlobalUser.cs | 7 ++++ src/Discord.Net/Entities/WebSocket/CachedGuild.cs | 3 +- 8 files changed, 30 insertions(+), 76 deletions(-) rename src/Discord.Net/Data/{DefaultDataStore.cs => DataStore.cs} (71%) delete mode 100644 src/Discord.Net/Data/DataStoreProvider.cs delete mode 100644 src/Discord.Net/Data/IDataStore.cs delete mode 100644 src/Discord.Net/Data/SharedDataStore.cs diff --git a/src/Discord.Net/Data/DefaultDataStore.cs b/src/Discord.Net/Data/DataStore.cs similarity index 71% rename from src/Discord.Net/Data/DefaultDataStore.cs rename to src/Discord.Net/Data/DataStore.cs index b267f5932..59b62e180 100644 --- a/src/Discord.Net/Data/DefaultDataStore.cs +++ b/src/Discord.Net/Data/DataStore.cs @@ -3,9 +3,9 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -namespace Discord.Data +namespace Discord { - public class DefaultDataStore : DataStore + public class DataStore { private const int CollectionConcurrencyLevel = 1; //WebSocket updater/event handler. //TODO: Needs profiling, increase to 2? private const double AverageChannelsPerGuild = 10.22; //Source: Googie2149 @@ -17,12 +17,12 @@ namespace Discord.Data private readonly ConcurrentDictionary _guilds; private readonly ConcurrentDictionary _users; - internal override IReadOnlyCollection Channels => _channels.ToReadOnlyCollection(); - internal override IReadOnlyCollection DMChannels => _dmChannels.ToReadOnlyCollection(); - internal override IReadOnlyCollection Guilds => _guilds.ToReadOnlyCollection(); - internal override IReadOnlyCollection Users => _users.ToReadOnlyCollection(); + internal IReadOnlyCollection Channels => _channels.ToReadOnlyCollection(); + internal IReadOnlyCollection DMChannels => _dmChannels.ToReadOnlyCollection(); + internal IReadOnlyCollection Guilds => _guilds.ToReadOnlyCollection(); + internal IReadOnlyCollection Users => _users.ToReadOnlyCollection(); - public DefaultDataStore(int guildCount, int dmChannelCount) + public DataStore(int guildCount, int dmChannelCount) { double estimatedChannelCount = guildCount * AverageChannelsPerGuild + dmChannelCount; double estimatedUsersCount = guildCount * AverageUsersPerGuild; @@ -32,18 +32,18 @@ namespace Discord.Data _users = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(estimatedUsersCount * CollectionMultiplier)); } - internal override ICachedChannel GetChannel(ulong id) + internal ICachedChannel GetChannel(ulong id) { ICachedChannel channel; if (_channels.TryGetValue(id, out channel)) return channel; return null; } - internal override void AddChannel(ICachedChannel channel) + internal void AddChannel(ICachedChannel channel) { _channels[channel.Id] = channel; } - internal override ICachedChannel RemoveChannel(ulong id) + internal ICachedChannel RemoveChannel(ulong id) { ICachedChannel channel; if (_channels.TryRemove(id, out channel)) @@ -51,19 +51,19 @@ namespace Discord.Data return null; } - internal override CachedDMChannel GetDMChannel(ulong userId) + internal CachedDMChannel GetDMChannel(ulong userId) { CachedDMChannel channel; if (_dmChannels.TryGetValue(userId, out channel)) return channel; return null; } - internal override void AddDMChannel(CachedDMChannel channel) + internal void AddDMChannel(CachedDMChannel channel) { _channels[channel.Id] = channel; _dmChannels[channel.Recipient.Id] = channel; } - internal override CachedDMChannel RemoveDMChannel(ulong userId) + internal CachedDMChannel RemoveDMChannel(ulong userId) { CachedDMChannel channel; ICachedChannel ignored; @@ -75,18 +75,18 @@ namespace Discord.Data return null; } - internal override CachedGuild GetGuild(ulong id) + internal CachedGuild GetGuild(ulong id) { CachedGuild guild; if (_guilds.TryGetValue(id, out guild)) return guild; return null; } - internal override void AddGuild(CachedGuild guild) + internal void AddGuild(CachedGuild guild) { _guilds[guild.Id] = guild; } - internal override CachedGuild RemoveGuild(ulong id) + internal CachedGuild RemoveGuild(ulong id) { CachedGuild guild; if (_guilds.TryRemove(id, out guild)) @@ -94,18 +94,18 @@ namespace Discord.Data return null; } - internal override CachedGlobalUser GetUser(ulong id) + internal CachedGlobalUser GetUser(ulong id) { CachedGlobalUser user; if (_users.TryGetValue(id, out user)) return user; return null; } - internal override CachedGlobalUser GetOrAddUser(ulong id, Func userFactory) + internal CachedGlobalUser GetOrAddUser(ulong id, Func userFactory) { return _users.GetOrAdd(id, userFactory); } - internal override CachedGlobalUser RemoveUser(ulong id) + internal CachedGlobalUser RemoveUser(ulong id) { CachedGlobalUser user; if (_users.TryRemove(id, out user)) diff --git a/src/Discord.Net/Data/DataStoreProvider.cs b/src/Discord.Net/Data/DataStoreProvider.cs deleted file mode 100644 index db6ea3e56..000000000 --- a/src/Discord.Net/Data/DataStoreProvider.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Discord.Data -{ - public delegate DataStore DataStoreProvider(int shardId, int totalShards, int guildCount, int dmCount); -} diff --git a/src/Discord.Net/Data/IDataStore.cs b/src/Discord.Net/Data/IDataStore.cs deleted file mode 100644 index 26d9c6e40..000000000 --- a/src/Discord.Net/Data/IDataStore.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Discord.Data -{ - public abstract class DataStore - { - internal abstract IReadOnlyCollection Channels { get; } - internal abstract IReadOnlyCollection DMChannels { get; } - internal abstract IReadOnlyCollection Guilds { get; } - internal abstract IReadOnlyCollection Users { get; } - - internal abstract ICachedChannel GetChannel(ulong id); - internal abstract void AddChannel(ICachedChannel channel); - internal abstract ICachedChannel RemoveChannel(ulong id); - - internal abstract CachedDMChannel GetDMChannel(ulong userId); - internal abstract void AddDMChannel(CachedDMChannel channel); - internal abstract CachedDMChannel RemoveDMChannel(ulong userId); - - internal abstract CachedGuild GetGuild(ulong id); - internal abstract void AddGuild(CachedGuild guild); - internal abstract CachedGuild RemoveGuild(ulong id); - - internal abstract CachedGlobalUser GetUser(ulong id); - internal abstract CachedGlobalUser GetOrAddUser(ulong userId, Func userFactory); - internal abstract CachedGlobalUser RemoveUser(ulong id); - } -} diff --git a/src/Discord.Net/Data/SharedDataStore.cs b/src/Discord.Net/Data/SharedDataStore.cs deleted file mode 100644 index fd3a6554a..000000000 --- a/src/Discord.Net/Data/SharedDataStore.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Discord.Data -{ - //TODO: Implement - //TODO: CachedPublicUser's GuildCount system is not at all multi-writer threadsafe! - //TODO: CachedPublicUser's Update method is not multi-writer threadsafe! - //TODO: Are there other multiwriters across shards? - - /*public class SharedDataStore - { - }*/ -} diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index 545ebcf20..35891b1b6 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -1,5 +1,4 @@ using Discord.API.Gateway; -using Discord.Data; using Discord.Extensions; using Discord.Logging; using Discord.Net.Converters; @@ -26,7 +25,6 @@ namespace Discord #if BENCHMARK private readonly Logger _benchmarkLogger; #endif - private readonly DataStoreProvider _dataStoreProvider; private readonly JsonSerializer _serializer; private readonly int _connectionTimeout, _reconnectDelay, _failedReconnectDelay; private readonly int _largeThreshold; @@ -71,7 +69,6 @@ namespace Discord _connectionTimeout = config.ConnectionTimeout; _reconnectDelay = config.ReconnectDelay; _failedReconnectDelay = config.FailedReconnectDelay; - _dataStoreProvider = config.DataStoreProvider; MessageCacheSize = config.MessageCacheSize; _largeThreshold = config.LargeThreshold; @@ -481,7 +478,7 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (READY)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var dataStore = _dataStoreProvider(ShardId, _totalShards, data.Guilds.Length, data.PrivateChannels.Length); + var dataStore = new DataStore( data.Guilds.Length, data.PrivateChannels.Length); var currentUser = new CachedSelfUser(this, data.User); int unavailableGuilds = 0; diff --git a/src/Discord.Net/DiscordSocketConfig.cs b/src/Discord.Net/DiscordSocketConfig.cs index c1ddaa90d..a40fba0e7 100644 --- a/src/Discord.Net/DiscordSocketConfig.cs +++ b/src/Discord.Net/DiscordSocketConfig.cs @@ -1,5 +1,4 @@ -using Discord.Data; -using Discord.Net.WebSockets; +using Discord.Net.WebSockets; namespace Discord { @@ -29,11 +28,7 @@ namespace Discord /// Decreasing this may reduce CPU usage while increasing login time and network usage. /// public int LargeThreshold { get; set; } = 250; - - //Engines - - /// Gets or sets the provider used to generate datastores. - public DataStoreProvider DataStoreProvider { get; set; } = (shardId, totalShards, guildCount, dmCount) => new DefaultDataStore(guildCount, dmCount); + /// Gets or sets the provider used to generate new websocket connections. public WebSocketProvider WebSocketProvider { get; set; } = () => new DefaultWebSocketClient(); } diff --git a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs b/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs index e07472ae8..6d101870e 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs @@ -1,4 +1,5 @@ using System; +using Discord.API; using Model = Discord.API.User; namespace Discord @@ -33,6 +34,12 @@ namespace Discord } } + public override void Update(Model model, UpdateSource source) + { + lock (this) + base.Update(model, source); + } + public CachedGlobalUser Clone() => MemberwiseClone() as CachedGlobalUser; ICachedUser ICachedUser.Clone() => Clone(); } diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs index 5dc26c1b5..4d0af0783 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/CachedGuild.cs @@ -1,5 +1,4 @@ -using Discord.Data; -using Discord.Extensions; +using Discord.Extensions; using System; using System.Collections.Concurrent; using System.Collections.Generic;