/// <summary> /// Notify the submitter that a new deadline has been found and add it to the queue. /// </summary> /// <param name="deadline"> /// The deadline to add. /// </param> public void NewDeadline(Deadline deadline) { // Let's log this and notify the UI Logger.Info("New deadline found " + deadline.DeadlineDuration + " for block " + deadline.MiningInfo.BlockHeight); ConsoleUi.DisplayDeadline(deadline); // Add this to our queue lock (_deadlineQueueLocker) _deadlineQueue.Add(deadline); }
/// <summary> /// This method provides the main logic that manages state transitions and deals with our queue. /// </summary> private void ThreadEntry() { while (_isAlive) { // First let's get a handle to our deadlines Deadline[] deadlines; lock (_deadlineQueueLocker) { // Remove any old deadlines List <Deadline> toRemove = new List <Deadline>(); toRemove.AddRange(_deadlineQueue.Where(dl => dl.Status == DeadlineStatus.Accepted || dl.Status == DeadlineStatus.Rejected)); foreach (Deadline dl in toRemove) { _deadlineQueue.Remove(dl); } // Copy the list locally deadlines = _deadlineQueue.Where(dl => dl.NextSubmissionDate <= DateTime.UtcNow).ToArray(); } foreach (Deadline deadline in deadlines) { HttpResponseMessage response = null; string stringResponse = null; try { _client.DefaultRequestHeaders.Clear(); _client.DefaultRequestHeaders.Add("X-Miner", _version); _client.DefaultRequestHeaders.Add("X-Capacity", _gbStorage.ToString()); deadline.Submit(); ConsoleUi.DisplayDeadline(deadline); response = _client.PostAsync("/burst?requestType=submitNonce&nonce=" + deadline.Scoop.Nonce + "&accountId=" + deadline.Scoop.AccountId, null).Result; response.EnsureSuccessStatusCode(); stringResponse = response.Content.ReadAsStringAsync().Result; JObject obj = JObject.Parse(stringResponse); JToken tok; if (obj.TryGetValue("deadline", out tok)) { // We have deadline so it was accepted deadline.Accept(); ConsoleUi.DisplayDeadline(deadline); } else if (obj.TryGetValue("errorCode", out tok)) { // An error and it was rejected deadline.Reject(); ConsoleUi.DisplayDeadline(deadline); } else { // Some other state so we want to retry deadline.SubmissionFailed(); ConsoleUi.DisplayDeadline(deadline); } } catch (Exception ex) { deadline.SubmissionFailed(); ConsoleUi.DisplayDeadline(deadline); Logger.Error("Failed to submit deadline", ex); if (response != null) { if (!string.IsNullOrEmpty(stringResponse)) { try { stringResponse = response.Content.ReadAsStringAsync().Result; } catch { } } if (!string.IsNullOrEmpty(stringResponse)) { Logger.Debug(stringResponse); } } } } // Wait to retry Thread.Sleep(100); } }