PoolKernelSet.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace NTMiner.Core.Kernels.Impl {
  5. public class PoolKernelSet : IPoolKernelSet {
  6. private readonly IServerContext _context;
  7. private readonly Dictionary<Guid, PoolKernelData> _dicById = new Dictionary<Guid, PoolKernelData>();
  8. public PoolKernelSet(IServerContext context) {
  9. _context = context;
  10. _context.AddCmdPath<AddPoolKernelCommand>("处理添加矿池级内核命令", LogEnum.DevConsole,
  11. action: message => {
  12. if (!_dicById.ContainsKey(message.Input.GetId())) {
  13. var entity = new PoolKernelData().Update(message.Input);
  14. _dicById.Add(message.Input.GetId(), entity);
  15. var repository = NTMinerRoot.CreateServerRepository<PoolKernelData>();
  16. repository.Add(entity);
  17. VirtualRoot.RaiseEvent(new PoolKernelAddedEvent(message.Id, message.Input));
  18. }
  19. });
  20. _context.AddCmdPath<RemovePoolKernelCommand>("处理移除矿池级内核命令", LogEnum.DevConsole,
  21. action: message => {
  22. if (_dicById.ContainsKey(message.EntityId)) {
  23. var entity = _dicById[message.EntityId];
  24. _dicById.Remove(message.EntityId);
  25. var repository = NTMinerRoot.CreateServerRepository<PoolKernelData>();
  26. repository.Remove(message.EntityId);
  27. VirtualRoot.RaiseEvent(new PoolKernelRemovedEvent(message.Id, entity));
  28. }
  29. });
  30. _context.AddCmdPath<UpdatePoolKernelCommand>("更新矿池内核", LogEnum.DevConsole,
  31. action: (message) => {
  32. InitOnece();
  33. if (message == null || message.Input == null || message.Input.GetId() == Guid.Empty) {
  34. throw new ArgumentNullException();
  35. }
  36. if (!_context.PoolSet.Contains(message.Input.PoolId)) {
  37. throw new ValidationException("there is no pool with id" + message.Input.PoolId);
  38. }
  39. if (!_dicById.ContainsKey(message.Input.GetId())) {
  40. return;
  41. }
  42. PoolKernelData entity = _dicById[message.Input.GetId()];
  43. if (ReferenceEquals(entity, message.Input)) {
  44. return;
  45. }
  46. entity.Update(message.Input);
  47. var repository = NTMinerRoot.CreateServerRepository<PoolKernelData>();
  48. repository.Update(entity);
  49. VirtualRoot.RaiseEvent(new PoolKernelUpdatedEvent(message.Id, entity));
  50. });
  51. }
  52. private bool _isInited = false;
  53. private readonly object _locker = new object();
  54. public int Count {
  55. get {
  56. InitOnece();
  57. return _dicById.Count;
  58. }
  59. }
  60. private void InitOnece() {
  61. if (_isInited) {
  62. return;
  63. }
  64. Init();
  65. }
  66. private void Init() {
  67. lock (_locker) {
  68. if (!_isInited) {
  69. var repository = NTMinerRoot.CreateServerRepository<PoolKernelData>();
  70. List<PoolKernelData> list = repository.GetAll().ToList();
  71. foreach (IPool pool in _context.PoolSet.AsEnumerable()) {
  72. foreach (ICoinKernel coinKernel in _context.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == pool.CoinId)) {
  73. PoolKernelData poolKernel = list.FirstOrDefault(a => a.PoolId == pool.GetId() && a.KernelId == coinKernel.KernelId);
  74. if (poolKernel != null) {
  75. _dicById.Add(poolKernel.GetId(), poolKernel);
  76. }
  77. else {
  78. Guid poolKernelId = Guid.NewGuid();
  79. _dicById.Add(poolKernelId, new PoolKernelData() {
  80. Id = poolKernelId,
  81. Args = string.Empty,
  82. KernelId = coinKernel.KernelId,
  83. PoolId = pool.GetId()
  84. });
  85. }
  86. }
  87. }
  88. _isInited = true;
  89. }
  90. }
  91. }
  92. public bool Contains(Guid kernelId) {
  93. InitOnece();
  94. return _dicById.ContainsKey(kernelId);
  95. }
  96. public bool TryGetPoolKernel(Guid kernelId, out IPoolKernel kernel) {
  97. InitOnece();
  98. var r = _dicById.TryGetValue(kernelId, out PoolKernelData k);
  99. kernel = k;
  100. return r;
  101. }
  102. public IEnumerable<IPoolKernel> AsEnumerable() {
  103. InitOnece();
  104. return _dicById.Values;
  105. }
  106. }
  107. }