Class: Promiscuous::Publisher::Operation::Atomic
- Inherits:
-
Base
- Object
- Base
- Promiscuous::Publisher::Operation::Atomic
show all
- Defined in:
- lib/promiscuous/publisher/operation/atomic.rb
Instance Attribute Summary collapse
Attributes inherited from Base
#operation
Instance Method Summary
collapse
Methods inherited from Base
_acquire_lock, #dependencies_for, #dependency_for_op_lock, #ensure_op_still_locked, #execute, #explain_operation, #generate_payload, #get_new_op_lock, #increment_dependencies, lock_options, #on_rabbitmq_confirm, #payload_for, #publish_payload_in_rabbitmq_async, #publish_payload_in_redis, rabbitmq_staging_set_key, #record_timestamp, #recover_db_operation, recover_locks, recover_operation, recover_operation_from_lock, recover_payloads_for_rabbitmq, #recovering?, #recovery_payload, register_recovery_mechanism, #release_op_lock, run_recovery_mechanisms, #should_instrument_query?, #trace_operation, #write_dependencies
Constructor Details
#initialize(options = {}) ⇒ Atomic
Returns a new instance of Atomic.
5
6
7
8
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 5
def initialize(options={})
super
@instance = options[:instance]
end
|
Instance Attribute Details
#instance ⇒ Object
XXX instance can be a selector representation.
3
4
5
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 3
def instance
@instance
end
|
Instance Method Details
#acquire_op_lock ⇒ Object
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 10
def acquire_op_lock
unless dependency_for_op_lock
return unless reload_instance
end
loop do
instance_dep = dependency_for_op_lock
super
return if operation == :create
return unless reload_instance
return if instance_dep == dependency_for_op_lock
release_op_lock
end
end
|
#do_database_query(query) ⇒ Object
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 38
def do_database_query(query)
case operation
when :create
when :update
increment_version_in_document
use_id_selector(:use_atomic_version_selector => true)
when :destroy
use_id_selector
end
query.call_and_remember_result(:instrumented)
if query.failed?
return if recoverable_failure?(query.exception)
@instance = nil
end
end
|
#execute_instrumented(query) ⇒ Object
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 73
def execute_instrumented(query)
if recovering?
yell_about_missing_instance if @instance.nil?
else
acquire_op_lock
if @instance.nil?
query.call_and_remember_result(:non_instrumented)
return
end
end
increment_dependencies
do_database_query(query) unless @instance.nil?
record_timestamp
ensure_op_still_locked
generate_payload
publish_payload_in_redis
release_op_lock
publish_payload_in_rabbitmq_async
end
|
#fetch_instance ⇒ Object
151
152
153
154
155
156
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 151
def fetch_instance
@instance.reload if @instance.respond_to?(:reload)
@instance
end
|
#increment_version_in_document ⇒ Object
162
163
164
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 162
def increment_version_in_document
end
|
#operation_payloads ⇒ Object
143
144
145
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 143
def operation_payloads
@instance.nil? ? [] : [payload_for(@instance)]
end
|
#query_dependencies ⇒ Object
147
148
149
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 147
def query_dependencies
dependencies_for(@instance)
end
|
#recoverable_failure?(exception) ⇒ Boolean
172
173
174
175
176
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 172
def recoverable_failure?(exception)
raise
end
|
#reload_instance ⇒ Object
158
159
160
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 158
def reload_instance
@instance = fetch_instance
end
|
#use_id_selector(options = {}) ⇒ Object
166
167
168
169
170
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 166
def use_id_selector(options={})
end
|
#yell_about_missing_instance ⇒ Object
66
67
68
69
70
71
|
# File 'lib/promiscuous/publisher/operation/atomic.rb', line 66
def yell_about_missing_instance
err = "Cannot find document. Database had a dataloss?. Proceeding anyways. #{@recovery_data}"
e = Promiscuous::Error::Recovery.new(err)
Promiscuous.warn "[recovery] #{e}"
Promiscuous::Config.error_notifier.call(e)
end
|