]>
Commit | Line | Data |
---|---|---|
b4e8d170 | 1 | /* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. |
f85f8ebb BP |
2 | * |
3 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
4 | * you may not use this file except in compliance with the License. | |
5 | * You may obtain a copy of the License at: | |
6 | * | |
7 | * http://www.apache.org/licenses/LICENSE-2.0 | |
8 | * | |
9 | * Unless required by applicable law or agreed to in writing, software | |
10 | * distributed under the License is distributed on an "AS IS" BASIS, | |
11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 | * See the License for the specific language governing permissions and | |
13 | * limitations under the License. | |
14 | */ | |
15 | ||
16 | #include <config.h> | |
17 | ||
18 | #include "trigger.h" | |
19 | ||
f85f8ebb BP |
20 | #include <limits.h> |
21 | ||
ee89ea7b | 22 | #include "openvswitch/json.h" |
f85f8ebb BP |
23 | #include "jsonrpc.h" |
24 | #include "ovsdb.h" | |
25 | #include "poll-loop.h" | |
e317253b | 26 | #include "server.h" |
f85f8ebb | 27 | |
e317253b | 28 | static bool ovsdb_trigger_try(struct ovsdb_trigger *, long long int now); |
f85f8ebb BP |
29 | static void ovsdb_trigger_complete(struct ovsdb_trigger *); |
30 | ||
31 | void | |
b4e8d170 | 32 | ovsdb_trigger_init(struct ovsdb_session *session, struct ovsdb *db, |
e317253b | 33 | struct ovsdb_trigger *trigger, |
e51879e9 AZ |
34 | struct json *request, long long int now, |
35 | bool read_only) | |
f85f8ebb | 36 | { |
e317253b | 37 | trigger->session = session; |
b4e8d170 | 38 | trigger->db = db; |
417e7e66 | 39 | ovs_list_push_back(&trigger->db->triggers, &trigger->node); |
f85f8ebb BP |
40 | trigger->request = request; |
41 | trigger->result = NULL; | |
42 | trigger->created = now; | |
43 | trigger->timeout_msec = LLONG_MAX; | |
e51879e9 | 44 | trigger->read_only = read_only; |
e317253b | 45 | ovsdb_trigger_try(trigger, now); |
f85f8ebb BP |
46 | } |
47 | ||
48 | void | |
49 | ovsdb_trigger_destroy(struct ovsdb_trigger *trigger) | |
50 | { | |
417e7e66 | 51 | ovs_list_remove(&trigger->node); |
f85f8ebb BP |
52 | json_destroy(trigger->request); |
53 | json_destroy(trigger->result); | |
54 | } | |
55 | ||
56 | bool | |
57 | ovsdb_trigger_is_complete(const struct ovsdb_trigger *trigger) | |
58 | { | |
59 | return trigger->result != NULL; | |
60 | } | |
61 | ||
62 | struct json * | |
63 | ovsdb_trigger_steal_result(struct ovsdb_trigger *trigger) | |
64 | { | |
65 | struct json *result = trigger->result; | |
66 | trigger->result = NULL; | |
67 | return result; | |
68 | } | |
69 | ||
70 | void | |
71 | ovsdb_trigger_run(struct ovsdb *db, long long int now) | |
72 | { | |
73 | struct ovsdb_trigger *t, *next; | |
74 | bool run_triggers; | |
75 | ||
76 | run_triggers = db->run_triggers; | |
77 | db->run_triggers = false; | |
4e8e4213 | 78 | LIST_FOR_EACH_SAFE (t, next, node, &db->triggers) { |
f85f8ebb | 79 | if (run_triggers || now - t->created >= t->timeout_msec) { |
e317253b | 80 | ovsdb_trigger_try(t, now); |
f85f8ebb BP |
81 | } |
82 | } | |
83 | } | |
84 | ||
85 | void | |
86 | ovsdb_trigger_wait(struct ovsdb *db, long long int now) | |
87 | { | |
88 | if (db->run_triggers) { | |
89 | poll_immediate_wake(); | |
90 | } else { | |
91 | long long int deadline = LLONG_MAX; | |
92 | struct ovsdb_trigger *t; | |
93 | ||
4e8e4213 | 94 | LIST_FOR_EACH (t, node, &db->triggers) { |
f85f8ebb BP |
95 | if (t->created < LLONG_MAX - t->timeout_msec) { |
96 | long long int t_deadline = t->created + t->timeout_msec; | |
97 | if (deadline > t_deadline) { | |
98 | deadline = t_deadline; | |
99 | if (now >= deadline) { | |
100 | break; | |
101 | } | |
102 | } | |
103 | } | |
104 | } | |
105 | ||
106 | if (deadline < LLONG_MAX) { | |
7cf8b266 | 107 | poll_timer_wait_until(deadline); |
f85f8ebb BP |
108 | } |
109 | } | |
110 | } | |
111 | ||
112 | static bool | |
e317253b | 113 | ovsdb_trigger_try(struct ovsdb_trigger *t, long long int now) |
f85f8ebb | 114 | { |
b4e8d170 | 115 | t->result = ovsdb_execute(t->db, t->session, |
e51879e9 AZ |
116 | t->request, t->read_only, |
117 | now - t->created, &t->timeout_msec); | |
f85f8ebb BP |
118 | if (t->result) { |
119 | ovsdb_trigger_complete(t); | |
120 | return true; | |
121 | } else { | |
122 | return false; | |
123 | } | |
124 | } | |
125 | ||
126 | static void | |
127 | ovsdb_trigger_complete(struct ovsdb_trigger *t) | |
128 | { | |
cb22974d | 129 | ovs_assert(t->result != NULL); |
417e7e66 BW |
130 | ovs_list_remove(&t->node); |
131 | ovs_list_push_back(&t->session->completions, &t->node); | |
f85f8ebb | 132 | } |