Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
            }
        }