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/ClosureCounter.h>
24 #include <ripple/core/LoadMonitor.h>
25 #include <functional>
26 
27 #include <functional>
28 
29 namespace ripple {
30 
31 // Note that this queue should only be used for CPU-bound jobs
32 // It is primarily intended for signature checking
33 
34 enum JobType {
35  // Special type indicating an invalid job - will go away soon.
36  jtINVALID = -1,
37 
38  // Job types - the position in this enum indicates the job priority with
39  // earlier jobs having lower priority than later jobs. If you wish to
40  // insert a job at a specific priority, simply add it at the right location.
41 
42  jtPACK, // Make a fetch pack for a peer
43  jtPUBOLDLEDGER, // An old ledger has been accepted
44  jtCLIENT, // A placeholder for the priority of all jtCLIENT jobs
45  jtCLIENT_SUBSCRIBE, // A websocket subscription by a client
46  jtCLIENT_FEE_CHANGE, // Subscription for fee change by a client
47  jtCLIENT_CONSENSUS, // Subscription for consensus state change by a client
48  jtCLIENT_ACCT_HIST, // Subscription for account history by a client
49  jtCLIENT_SHARD, // Client request for shard archiving
50  jtCLIENT_RPC, // Client RPC request
51  jtCLIENT_WEBSOCKET, // Client websocket request
52  jtRPC, // A websocket command from the client
53  jtSWEEP, // Sweep for stale structures
54  jtVALIDATION_ut, // A validation from an untrusted source
55  jtUPDATE_PF, // Update pathfinding requests
56  jtTRANSACTION_l, // A local transaction
57  jtREPLAY_REQ, // Peer request a ledger delta or a skip list
58  jtLEDGER_REQ, // Peer request ledger/txnset data
59  jtPROPOSAL_ut, // A proposal from an untrusted source
60  jtREPLAY_TASK, // A Ledger replay task/subtask
61  jtLEDGER_DATA, // Received data for a ledger we're acquiring
62  jtTRANSACTION, // A transaction received from the network
63  jtMISSING_TXN, // Request missing transactions
64  jtREQUESTED_TXN, // Reply with requested transactions
65  jtBATCH, // Apply batched transactions
66  jtADVANCE, // Advance validated/acquired ledgers
67  jtPUBLEDGER, // Publish a fully-accepted ledger
68  jtTXN_DATA, // Fetch a proposed set
69  jtWAL, // Write-ahead logging
70  jtVALIDATION_t, // A validation from a trusted source
71  jtWRITE, // Write out hashed objects
72  jtACCEPT, // Accept a consensus ledger
73  jtPROPOSAL_t, // A proposal from a trusted source
74  jtNETOP_CLUSTER, // NetworkOPs cluster peer report
75  jtNETOP_TIMER, // NetworkOPs net timer processing
76  jtADMIN, // An administrative operation
77 
78  // Special job types which are not dispatched by the job pool
86  jtGENERIC, // Used just to measure time
87 
88  // Node store monitoring
92 };
93 
94 class Job
95 {
96 public:
98 
105  // VFALCO NOTE I'd prefer not to have a default constructed object.
106  // What is the semantic meaning of a Job with no associated
107  // function? Having the invariant "all Job objects refer to
108  // a job" would reduce the number of states.
109  //
110  Job();
111 
112  // Job (Job const& other);
113 
114  Job(JobType type, std::uint64_t index);
115 
117  using CancelCallback = std::function<bool(void)>;
118 
119  // VFALCO TODO try to remove the dependency on LoadMonitor.
120  Job(JobType type,
121  std::string const& name,
122  std::uint64_t index,
123  LoadMonitor& lm,
124  std::function<void(Job&)> const& job,
125  CancelCallback cancelCallback);
126 
127  // Job& operator= (Job const& other);
128 
129  JobType
130  getType() const;
131 
133  getCancelCallback() const;
134 
136  clock_type::time_point const&
137  queue_time() const;
138 
140  bool
141  shouldCancel() const;
142 
143  void
144  doJob();
145 
146  void
147  rename(std::string const& n);
148 
149  // These comparison operators make the jobs sort in priority order
150  // in the job set
151  bool
152  operator<(const Job& j) const;
153  bool
154  operator>(const Job& j) const;
155  bool
156  operator<=(const Job& j) const;
157  bool
158  operator>=(const Job& j) const;
159 
160 private:
167  clock_type::time_point m_queue_time;
168 };
169 
171 
172 } // namespace ripple
173 
174 #endif
ripple::jtCLIENT_SUBSCRIBE
@ jtCLIENT_SUBSCRIBE
Definition: Job.h:45
ripple::jtTRANSACTION
@ jtTRANSACTION
Definition: Job.h:62
std::chrono::steady_clock
ripple::Job::mName
std::string mName
Definition: Job.h:166
ripple::jtHO_WRITE
@ jtHO_WRITE
Definition: Job.h:85
std::string
STL class.
std::shared_ptr
STL class.
ripple::jtCLIENT
@ jtCLIENT
Definition: Job.h:44
ripple::Job::operator>=
bool operator>=(const Job &j) const
Definition: Job.cpp:111
ripple::jtPATH_FIND
@ jtPATH_FIND
Definition: Job.h:83
ripple::jtACCEPT
@ jtACCEPT
Definition: Job.h:72
functional
ripple::jtHO_READ
@ jtHO_READ
Definition: Job.h:84
ripple::jtMISSING_TXN
@ jtMISSING_TXN
Definition: Job.h:63
ripple::jtREPLAY_TASK
@ jtREPLAY_TASK
Definition: Job.h:60
ripple::Job::mJobIndex
std::uint64_t mJobIndex
Definition: Job.h:163
ripple::jtNETOP_CLUSTER
@ jtNETOP_CLUSTER
Definition: Job.h:74
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:89
ripple::jtCLIENT_CONSENSUS
@ jtCLIENT_CONSENSUS
Definition: Job.h:47
std::function
ripple::jtUPDATE_PF
@ jtUPDATE_PF
Definition: Job.h:55
ripple::jtADMIN
@ jtADMIN
Definition: Job.h:76
ripple::jtNS_WRITE
@ jtNS_WRITE
Definition: Job.h:91
ripple::Job::operator<=
bool operator<=(const Job &j) const
Definition: Job.cpp:135
ripple::jtSWEEP
@ jtSWEEP
Definition: Job.h:53
ripple::jtWRITE
@ jtWRITE
Definition: Job.h:71
ripple::jtCLIENT_RPC
@ jtCLIENT_RPC
Definition: Job.h:50
ripple::Job::operator<
bool operator<(const Job &j) const
Definition: Job.cpp:123
ripple::jtLEDGER_DATA
@ jtLEDGER_DATA
Definition: Job.h:61
ripple::Job::getCancelCallback
CancelCallback getCancelCallback() const
Definition: Job.cpp:58
ripple::jtBATCH
@ jtBATCH
Definition: Job.h:65
ripple::jtTXN_DATA
@ jtTXN_DATA
Definition: Job.h:68
ripple::jtCLIENT_WEBSOCKET
@ jtCLIENT_WEBSOCKET
Definition: Job.h:51
ripple::jtTRANSACTION_l
@ jtTRANSACTION_l
Definition: Job.h:56
ripple::jtPUBOLDLEDGER
@ jtPUBOLDLEDGER
Definition: Job.h:43
ripple::Job::mJob
std::function< void(Job &)> mJob
Definition: Job.h:164
ripple::jtDISK
@ jtDISK
Definition: Job.h:80
ripple::jtTXN_PROC
@ jtTXN_PROC
Definition: Job.h:81
ripple::Job::Job
Job()
Default constructor.
Definition: Job.cpp:26
ripple::jtPROPOSAL_t
@ jtPROPOSAL_t
Definition: Job.h:73
ripple::jtNETOP_TIMER
@ jtNETOP_TIMER
Definition: Job.h:75
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:86
ripple::jtVALIDATION_t
@ jtVALIDATION_t
Definition: Job.h:70
ripple::jtINVALID
@ jtINVALID
Definition: Job.h:36
ripple::jtOB_SETUP
@ jtOB_SETUP
Definition: Job.h:82
ripple::Job::m_cancelCallback
CancelCallback m_cancelCallback
Definition: Job.h:161
ripple::jtRPC
@ jtRPC
Definition: Job.h:52
ripple::Job
Definition: Job.h:94
ripple::ClosureCounter< void, Job & >
std::uint64_t
ripple::LoadMonitor
Definition: LoadMonitor.h:36
ripple::jtPUBLEDGER
@ jtPUBLEDGER
Definition: Job.h:67
ripple::jtPEER
@ jtPEER
Definition: Job.h:79
ripple::jtCLIENT_ACCT_HIST
@ jtCLIENT_ACCT_HIST
Definition: Job.h:48
ripple::jtCLIENT_FEE_CHANGE
@ jtCLIENT_FEE_CHANGE
Definition: Job.h:46
ripple::Job::mType
JobType mType
Definition: Job.h:162
ripple::jtREQUESTED_TXN
@ jtREQUESTED_TXN
Definition: Job.h:64
ripple::jtPACK
@ jtPACK
Definition: Job.h:42
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:54
ripple::jtWAL
@ jtWAL
Definition: Job.h:69
ripple::jtREPLAY_REQ
@ jtREPLAY_REQ
Definition: Job.h:57
ripple::jtPROPOSAL_ut
@ jtPROPOSAL_ut
Definition: Job.h:59
ripple::JobType
JobType
Definition: Job.h:34
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:66
ripple::Job::doJob
void doJob()
Definition: Job.cpp:79
ripple::Job::m_queue_time
clock_type::time_point m_queue_time
Definition: Job.h:167
ripple::jtCLIENT_SHARD
@ jtCLIENT_SHARD
Definition: Job.h:49
ripple::Job::m_loadEvent
std::shared_ptr< LoadEvent > m_loadEvent
Definition: Job.h:165
ripple::jtNS_ASYNC_READ
@ jtNS_ASYNC_READ
Definition: Job.h:90
ripple::jtLEDGER_REQ
@ jtLEDGER_REQ
Definition: Job.h:58