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 {
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  jtVALIDATION_ut, // A validation from an untrusted source
45  jtTRANSACTION_l, // A local transaction
46  jtLEDGER_REQ, // Peer request ledger/txnset data
47  jtPROPOSAL_ut, // A proposal from an untrusted source
48  jtLEDGER_DATA, // Received data for a ledger we're acquiring
49  jtCLIENT, // A websocket command from the client
50  jtRPC, // A websocket command from the client
51  jtUPDATE_PF, // Update pathfinding requests
52  jtTRANSACTION, // A transaction received from the network
53  jtBATCH, // Apply batched transactions
54  jtADVANCE, // Advance validated/acquired ledgers
55  jtPUBLEDGER, // Publish a fully-accepted ledger
56  jtTXN_DATA, // Fetch a proposed set
57  jtWAL, // Write-ahead logging
58  jtVALIDATION_t, // A validation from a trusted source
59  jtWRITE, // Write out hashed objects
60  jtACCEPT, // Accept a consensus ledger
61  jtPROPOSAL_t, // A proposal from a trusted source
62  jtSWEEP, // Sweep for stale structures
63  jtNETOP_CLUSTER, // NetworkOPs cluster peer report
64  jtNETOP_TIMER, // NetworkOPs net timer processing
65  jtADMIN, // An administrative operation
66 
67  // Special job types which are not dispatched by the job pool
75  jtGENERIC , // Used just to measure time
76 
77  // Node store monitoring
81 };
82 
83 class Job
84 {
85 public:
87 
94  // VFALCO NOTE I'd prefer not to have a default constructed object.
95  // What is the semantic meaning of a Job with no associated
96  // function? Having the invariant "all Job objects refer to
97  // a job" would reduce the number of states.
98  //
99  Job ();
100 
101  //Job (Job const& other);
102 
103  Job (JobType type, std::uint64_t index);
104 
106  using CancelCallback = std::function <bool(void)>;
107 
108  // VFALCO TODO try to remove the dependency on LoadMonitor.
109  Job (JobType type,
110  std::string const& name,
111  std::uint64_t index,
112  LoadMonitor& lm,
113  std::function <void (Job&)> const& job,
114  CancelCallback cancelCallback);
115 
116  //Job& operator= (Job const& other);
117 
118  JobType getType () const;
119 
121 
123  clock_type::time_point const& queue_time () const;
124 
126  bool shouldCancel () const;
127 
128  void doJob ();
129 
130  void rename (std::string const& n);
131 
132  // These comparison operators make the jobs sort in priority order
133  // in the job set
134  bool operator< (const Job& j) const;
135  bool operator> (const Job& j) const;
136  bool operator<= (const Job& j) const;
137  bool operator>= (const Job& j) const;
138 
139 private:
143  std::function <void (Job&)> mJob;
146  clock_type::time_point m_queue_time;
147 };
148 
149 }
150 
151 #endif
ripple::jtTRANSACTION
@ jtTRANSACTION
Definition: Job.h:52
std::chrono::steady_clock
ripple::Job::mJob
std::function< void(Job &)> mJob
Definition: Job.h:143
ripple::Job::mName
std::string mName
Definition: Job.h:145
ripple::jtHO_WRITE
@ jtHO_WRITE
Definition: Job.h:74
std::string
STL class.
std::shared_ptr
STL class.
ripple::jtCLIENT
@ jtCLIENT
Definition: Job.h:49
ripple::Job::operator>=
bool operator>=(const Job &j) const
Definition: Job.cpp:106
ripple::jtPATH_FIND
@ jtPATH_FIND
Definition: Job.h:72
ripple::jtACCEPT
@ jtACCEPT
Definition: Job.h:60
functional
ripple::jtHO_READ
@ jtHO_READ
Definition: Job.h:73
ripple::Job::mJobIndex
std::uint64_t mJobIndex
Definition: Job.h:142
ripple::jtNETOP_CLUSTER
@ jtNETOP_CLUSTER
Definition: Job.h:63
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:78
std::function
ripple::jtUPDATE_PF
@ jtUPDATE_PF
Definition: Job.h:51
ripple::jtADMIN
@ jtADMIN
Definition: Job.h:65
ripple::jtNS_WRITE
@ jtNS_WRITE
Definition: Job.h:80
ripple::Job::operator<=
bool operator<=(const Job &j) const
Definition: Job.cpp:128
ripple::jtSWEEP
@ jtSWEEP
Definition: Job.h:62
ripple::jtWRITE
@ jtWRITE
Definition: Job.h:59
ripple::Job::operator<
bool operator<(const Job &j) const
Definition: Job.cpp:117
ripple::jtLEDGER_DATA
@ jtLEDGER_DATA
Definition: Job.h:48
ripple::Job::getCancelCallback
CancelCallback getCancelCallback() const
Definition: Job.cpp:59
ripple::jtBATCH
@ jtBATCH
Definition: Job.h:53
ripple::jtTXN_DATA
@ jtTXN_DATA
Definition: Job.h:56
ripple::jtTRANSACTION_l
@ jtTRANSACTION_l
Definition: Job.h:45
ripple::jtPUBOLDLEDGER
@ jtPUBOLDLEDGER
Definition: Job.h:43
ripple::jtDISK
@ jtDISK
Definition: Job.h:69
ripple::jtTXN_PROC
@ jtTXN_PROC
Definition: Job.h:70
ripple::Job::Job
Job()
Default constructor.
Definition: Job.cpp:26
ripple::jtPROPOSAL_t
@ jtPROPOSAL_t
Definition: Job.h:61
ripple::jtNETOP_TIMER
@ jtNETOP_TIMER
Definition: Job.h:64
ripple::Job::shouldCancel
bool shouldCancel() const
Returns true if the running job should make a best-effort cancel.
Definition: Job.cpp:70
ripple::jtGENERIC
@ jtGENERIC
Definition: Job.h:75
ripple::jtVALIDATION_t
@ jtVALIDATION_t
Definition: Job.h:58
ripple::jtINVALID
@ jtINVALID
Definition: Job.h:36
ripple::jtOB_SETUP
@ jtOB_SETUP
Definition: Job.h:71
ripple::Job::m_cancelCallback
CancelCallback m_cancelCallback
Definition: Job.h:140
ripple::jtRPC
@ jtRPC
Definition: Job.h:50
ripple::Job
Definition: Job.h:83
std::uint64_t
ripple::LoadMonitor
Definition: LoadMonitor.h:35
ripple::jtPUBLEDGER
@ jtPUBLEDGER
Definition: Job.h:55
ripple::jtPEER
@ jtPEER
Definition: Job.h:68
ripple::Job::mType
JobType mType
Definition: Job.h:141
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:90
ripple::jtVALIDATION_ut
@ jtVALIDATION_ut
Definition: Job.h:44
ripple::jtWAL
@ jtWAL
Definition: Job.h:57
ripple::jtPROPOSAL_ut
@ jtPROPOSAL_ut
Definition: Job.h:47
ripple::JobType
JobType
Definition: Job.h:33
ripple::Job::getType
JobType getType() const
Definition: Job.cpp:54
ripple::Job::operator>
bool operator>(const Job &j) const
Definition: Job.cpp:95
ripple::jtADVANCE
@ jtADVANCE
Definition: Job.h:54
ripple::Job::doJob
void doJob()
Definition: Job.cpp:77
ripple::Job::m_queue_time
clock_type::time_point m_queue_time
Definition: Job.h:146
ripple::Job::m_loadEvent
std::shared_ptr< LoadEvent > m_loadEvent
Definition: Job.h:144
ripple::jtNS_ASYNC_READ
@ jtNS_ASYNC_READ
Definition: Job.h:79
ripple::jtLEDGER_REQ
@ jtLEDGER_REQ
Definition: Job.h:46