rippled
Job.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_CORE_JOB_H_INCLUDED
21 #define RIPPLE_CORE_JOB_H_INCLUDED
22 
23 #include <ripple/core/LoadMonitor.h>
24 #include <functional>
25 
26 #include <functional>
27 
28 namespace ripple {
29 
30 // Note that this queue should only be used for CPU-bound jobs
31 // It is primarily intended for signature checking
32 
33 enum JobType {
34  // Special type indicating an invalid job - will go away soon.
35  jtINVALID = -1,
36 
37  // Job types - the position in this enum indicates the job priority with
38  // earlier jobs having lower priority than later jobs. If you wish to
39  // insert a job at a specific priority, simply add it at the right location.
40 
41  jtPACK, // Make a fetch pack for a peer
42  jtPUBOLDLEDGER, // An old ledger has been accepted
43  jtVALIDATION_ut, // A validation from an untrusted source
44  jtTRANSACTION_l, // A local transaction
45  jtLEDGER_REQ, // Peer request ledger/txnset data
46  jtPROPOSAL_ut, // A proposal from an untrusted source
47  jtLEDGER_DATA, // Received data for a ledger we're acquiring
48  jtCLIENT, // A websocket command from the client
49  jtRPC, // A websocket command from the client
50  jtUPDATE_PF, // Update pathfinding requests
51  jtTRANSACTION, // A transaction received from the network
52  jtBATCH, // Apply batched transactions
53  jtADVANCE, // Advance validated/acquired ledgers
54  jtPUBLEDGER, // Publish a fully-accepted ledger
55  jtTXN_DATA, // Fetch a proposed set
56  jtWAL, // Write-ahead logging
57  jtVALIDATION_t, // A validation from a trusted source
58  jtWRITE, // Write out hashed objects
59  jtACCEPT, // Accept a consensus ledger
60  jtPROPOSAL_t, // A proposal from a trusted source
61  jtSWEEP, // Sweep for stale structures
62  jtNETOP_CLUSTER, // NetworkOPs cluster peer report
63  jtNETOP_TIMER, // NetworkOPs net timer processing
64  jtADMIN, // An administrative operation
65 
66  // Special job types which are not dispatched by the job pool
74  jtGENERIC, // Used just to measure time
75 
76  // Node store monitoring
80 };
81 
82 class Job
83 {
84 public:
86 
93  // VFALCO NOTE I'd prefer not to have a default constructed object.
94  // What is the semantic meaning of a Job with no associated
95  // function? Having the invariant "all Job objects refer to
96  // a job" would reduce the number of states.
97  //
98  Job();
99 
100  // Job (Job const& other);
101 
102  Job(JobType type, std::uint64_t index);
103 
105  using CancelCallback = std::function<bool(void)>;
106 
107  // VFALCO TODO try to remove the dependency on LoadMonitor.
108  Job(JobType type,
109  std::string const& name,
110  std::uint64_t index,
111  LoadMonitor& lm,
112  std::function<void(Job&)> const& job,
113  CancelCallback cancelCallback);
114 
115  // Job& operator= (Job const& other);
116 
117  JobType
118  getType() const;
119 
121  getCancelCallback() const;
122 
124  clock_type::time_point const&
125  queue_time() const;
126 
128  bool
129  shouldCancel() const;
130 
131  void
132  doJob();
133 
134  void
135  rename(std::string const& n);
136 
137  // These comparison operators make the jobs sort in priority order
138  // in the job set
139  bool
140  operator<(const Job& j) const;
141  bool
142  operator>(const Job& j) const;
143  bool
144  operator<=(const Job& j) const;
145  bool
146  operator>=(const Job& j) const;
147 
148 private:
155  clock_type::time_point m_queue_time;
156 };
157 
158 } // namespace ripple
159 
160 #endif
ripple::jtTRANSACTION
@ jtTRANSACTION
Definition: Job.h:51
std::chrono::steady_clock
ripple::Job::mName
std::string mName
Definition: Job.h:154
ripple::jtHO_WRITE
@ jtHO_WRITE
Definition: Job.h:73
std::string
STL class.
std::shared_ptr
STL class.
ripple::jtCLIENT
@ jtCLIENT
Definition: Job.h:48
ripple::Job::operator>=
bool operator>=(const Job &j) const
Definition: Job.cpp:111
ripple::jtPATH_FIND
@ jtPATH_FIND
Definition: Job.h:71
ripple::jtACCEPT
@ jtACCEPT
Definition: Job.h:59
functional
ripple::jtHO_READ
@ jtHO_READ
Definition: Job.h:72
ripple::Job::mJobIndex
std::uint64_t mJobIndex
Definition: Job.h:151
ripple::jtNETOP_CLUSTER
@ jtNETOP_CLUSTER
Definition: Job.h:62
ripple::Job::queue_time
clock_type::time_point const & queue_time() const
Returns the time when the job was queued.
Definition: Job.cpp:65
ripple::jtNS_SYNC_READ
@ jtNS_SYNC_READ
Definition: Job.h:77
std::function
ripple::jtUPDATE_PF
@ jtUPDATE_PF
Definition: Job.h:50
ripple::jtADMIN
@ jtADMIN
Definition: Job.h:64
ripple::jtNS_WRITE
@ jtNS_WRITE
Definition: Job.h:79
ripple::Job::operator<=
bool operator<=(const Job &j) const
Definition: Job.cpp:135
ripple::jtSWEEP
@ jtSWEEP
Definition: Job.h:61
ripple::jtWRITE
@ jtWRITE
Definition: Job.h:58
ripple::Job::operator<
bool operator<(const Job &j) const
Definition: Job.cpp:123
ripple::jtLEDGER_DATA
@ jtLEDGER_DATA
Definition: Job.h:47
ripple::Job::getCancelCallback
CancelCallback getCancelCallback() const
Definition: Job.cpp:58
ripple::jtBATCH
@ jtBATCH
Definition: Job.h:52
ripple::jtTXN_DATA
@ jtTXN_DATA
Definition: Job.h:55
ripple::jtTRANSACTION_l
@ jtTRANSACTION_l
Definition: Job.h:44
ripple::jtPUBOLDLEDGER
@ jtPUBOLDLEDGER
Definition: Job.h:42
ripple::Job::mJob
std::function< void(Job &)> mJob
Definition: Job.h:152
ripple::jtDISK
@ jtDISK
Definition: Job.h:68
ripple::jtTXN_PROC
@ jtTXN_PROC
Definition: Job.h:69
ripple::Job::Job
Job()
Default constructor.
Definition: Job.cpp:26
ripple::jtPROPOSAL_t
@ jtPROPOSAL_t
Definition: Job.h:60
ripple::jtNETOP_TIMER
@ jtNETOP_TIMER
Definition: Job.h:63
ripple::Job::shouldCancel
bool shouldCancel() const
Returns true if the running job should make a best-effort cancel.
Definition: Job.cpp:71
ripple::jtGENERIC
@ jtGENERIC
Definition: Job.h:74
ripple::jtVALIDATION_t
@ jtVALIDATION_t
Definition: Job.h:57
ripple::jtINVALID
@ jtINVALID
Definition: Job.h:35
ripple::jtOB_SETUP
@ jtOB_SETUP
Definition: Job.h:70
ripple::Job::m_cancelCallback
CancelCallback m_cancelCallback
Definition: Job.h:149
ripple::jtRPC
@ jtRPC
Definition: Job.h:49
ripple::Job
Definition: Job.h:82
std::uint64_t
ripple::LoadMonitor
Definition: LoadMonitor.h:36
ripple::jtPUBLEDGER
@ jtPUBLEDGER
Definition: Job.h:54
ripple::jtPEER
@ jtPEER
Definition: Job.h:67
ripple::Job::mType
JobType mType
Definition: Job.h:150
ripple::jtPACK
@ jtPACK
Definition: Job.h:41
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Job::rename
void rename(std::string const &n)
Definition: Job.cpp:93
ripple::jtVALIDATION_ut
@ jtVALIDATION_ut
Definition: Job.h:43
ripple::jtWAL
@ jtWAL
Definition: Job.h:56
ripple::jtPROPOSAL_ut
@ jtPROPOSAL_ut
Definition: Job.h:46
ripple::JobType
JobType
Definition: Job.h:33
ripple::Job::getType
JobType getType() const
Definition: Job.cpp:52
ripple::Job::operator>
bool operator>(const Job &j) const
Definition: Job.cpp:99
ripple::jtADVANCE
@ jtADVANCE
Definition: Job.h:53
ripple::Job::doJob
void doJob()
Definition: Job.cpp:79
ripple::Job::m_queue_time
clock_type::time_point m_queue_time
Definition: Job.h:155
ripple::Job::m_loadEvent
std::shared_ptr< LoadEvent > m_loadEvent
Definition: Job.h:153
ripple::jtNS_ASYNC_READ
@ jtNS_ASYNC_READ
Definition: Job.h:78
ripple::jtLEDGER_REQ
@ jtLEDGER_REQ
Definition: Job.h:45