CUBRID Engine  latest
log_system_tran.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 //
20 // System transactions - can make changes to storage without modifying the database view; it requires logging.
21 //
22 
23 #include "log_system_tran.hpp"
24 
25 #include "log_impl.h"
26 #include "thread_entry.hpp"
27 #include "thread_manager.hpp"
28 
29 #include <forward_list>
30 #include <mutex>
31 
33 std::forward_list<log_tdes *> systb_Free_tdes_list;
35 
36 // recovery - simulate the system workers from runtime
37 std::map<TRANID, log_tdes *> systb_System_tdes;
38 
39 static log_tdes *
41 {
42  log_tdes *tdes = new log_tdes ();
44  return tdes;
45 }
46 
47 static void
49 {
50  auto it = systb_System_tdes.find (trid);
51  if (it != systb_System_tdes.end ())
52  {
53  (void) systb_System_tdes.erase (it);
54  }
55  else
56  {
57  assert (false);
58  }
59 }
60 
61 static void
63 {
64  std::unique_lock<std::mutex> ulock (systb_Mutex);
65  if (tdes != NULL)
66  {
67  logtb_clear_tdes (NULL, tdes);
68  systb_Free_tdes_list.push_front (tdes);
69 
71  tdes = NULL;
72  }
73 }
74 
75 log_tdes *
77 {
78  assert (LOG_ISRESTARTED ()); // Recovery should not reuse tdeses
79  std::unique_lock<std::mutex> ulock (systb_Mutex);
80  log_tdes *tdes = NULL;
81 
82  if (systb_Free_tdes_list.empty ())
83  {
84  // generate new log_tdes
85  tdes = systdes_create_tdes ();
86  tdes->trid = systb_Next_tranid;
88  }
89  else
90  {
91  tdes = systb_Free_tdes_list.front ();
92  systb_Free_tdes_list.pop_front ();
93  }
94  assert (tdes->trid < NULL_TRANID && tdes->trid > systb_Next_tranid);
95 
96  tdes->state = TRAN_ACTIVE;
97  systb_System_tdes[tdes->trid] = tdes;
98 
99  return tdes;
100 }
101 
103  : m_tdes (NULL)
104 {
105  if (LOG_ISRESTARTED ())
106  {
108  }
109  else
110  {
112  }
113 }
114 
116 {
117  if (LOG_ISRESTARTED ())
118  {
120  }
121  else
122  {
124  delete m_tdes;
125  m_tdes = NULL;
126  }
127 }
128 
130  : m_tdes (tdes)
131 {
132 
133 }
134 
135 log_tdes *
137 {
138  return m_tdes;
139 }
140 
141 void
143 {
144  assert (m_tdes != NULL);
145  if (m_tdes->topops.last < 0)
146  {
147  assert (m_tdes->topops.last == -1);
154  }
155 }
156 
157 void
159 {
160  assert (m_tdes != NULL);
161  if (m_tdes->topops.last < 0)
162  {
163  assert (m_tdes->topops.last == -1);
168  }
169 }
170 
171 void
173 {
174  auto it = systb_System_tdes.find (trid);
175  if (it == systb_System_tdes.end ())
176  {
177  assert (false);
178  }
179  else
180  {
181  cubthread::entry &thread_r = cubthread::get_entry ();
182  thread_r.set_system_tdes (new log_system_tdes (it->second));
183  }
184 }
185 
186 void
188 {
189  cubthread::entry &thread_r = cubthread::get_entry ();
190  thread_r.reset_system_tdes ();
191 }
192 
193 void
195 {
196  // nothing to do so far
197 }
198 
199 void
201 {
202  log_tdes *tdes;
203  std::lock_guard<std::mutex> lg (systb_Mutex);
204 
205  while (!systb_Free_tdes_list.empty ())
206  {
207  tdes = systb_Free_tdes_list.front ();
208  systb_Free_tdes_list.pop_front ();
209 
210  logtb_finalize_tdes (NULL, tdes);
211  delete tdes;
212  }
213  assert (systb_System_tdes.empty ());
214 }
215 
216 log_tdes *
218 {
219  auto it = systb_System_tdes.find (trid);
220  if (it != systb_System_tdes.end ())
221  {
222  return it->second;
223  }
224  else
225  {
226  return NULL;
227  }
228 }
229 
230 log_tdes *
232 {
233  log_tdes *tdes = rv_get_tdes (trid);
234  if (tdes == NULL)
235  {
236  log_tdes *tdes = systdes_create_tdes ();
238  tdes->trid = trid;
239  systb_System_tdes[trid] = tdes;
240  return tdes;
241  }
242  else
243  {
244  assert (tdes->trid == trid);
245  return tdes;
246  }
247 }
248 
249 void
251 {
252  std::lock_guard<std::mutex> lg (systb_Mutex);
253  for (auto &el : systb_System_tdes)
254  {
255  log_tdes *tdes = el.second;
256  assert (tdes != NULL);
257  func (*tdes);
258  }
259 }
260 
261 void
263 {
264  for (auto it = systb_System_tdes.begin (); it != systb_System_tdes.end ();)
265  {
266  if (func (* (it->second)))
267  {
268  it = systb_System_tdes.erase (it);
269  }
270  else
271  {
272  ++it;
273  }
274  }
275 }
276 
277 void
279 {
280  auto it = systb_System_tdes.find (trid);
281  if (it != systb_System_tdes.end ())
282  {
283  (void) systb_System_tdes.erase (it);
284  }
285  else
286  {
287  assert (false);
288  }
289 }
290 
291 void
293 {
294  assert (systb_System_tdes.empty ());
296 }
static void rv_delete_all_tdes_if(const rv_delete_if_func &func)
log_tdes * get_tdes()
static log_tdes * systdes_create_tdes()
void reset_system_tdes(void)
int TRANID
LOG_LSA sysop_start_postpone_lsa
Definition: log_impl.h:448
static API_MUTEX mutex
Definition: api_util.c:72
log_tdes * systdes_claim_tdes()
const int LOG_SYSTEM_TRAN_INDEX
#define NULL_TRANID
static void rv_final()
void logtb_clear_tdes(THREAD_ENTRY *thread_p, LOG_TDES *tdes)
LOG_LSA tail_lsa
Definition: log_impl.h:473
std::map< TRANID, log_tdes * > systb_System_tdes
static void init_system_transations()
const int LOG_SYSTEM_WORKER_INCR_TRANID
Definition: log_impl.h:225
LOG_LSA tail_topresult_lsa
Definition: log_impl.h:480
static void destroy_system_transactions()
void set_system_tdes(log_system_tdes *sys_tdes)
#define assert(x)
LOG_LSA undo_nxlsa
Definition: log_impl.h:474
std::forward_list< log_tdes * > systb_Free_tdes_list
static void rv_end_simulation()
static log_tdes * rv_get_or_alloc_tdes(TRANID trid)
#define NULL
Definition: freelistheap.h:34
static void rv_simulate_system_tdes(TRANID trid)
LOG_LSA head_lsa
Definition: log_impl.h:472
static void systdes_remove_tdes_from_map(TRANID trid)
void logtb_initialize_tdes(LOG_TDES *tdes, int tran_index)
static void rv_delete_tdes(TRANID trid)
static void systdes_retire_tdes(log_tdes *tdes)
std::function< void(log_tdes &)> map_func
static log_tdes * rv_get_tdes(TRANID trid)
TRANID systb_Next_tranid
LOG_TOPOPS_STACK topops
Definition: log_impl.h:486
#define LOG_ISRESTARTED()
Definition: log_impl.h:232
void LSA_SET_NULL(log_lsa *lsa_ptr)
Definition: log_lsa.hpp:146
std::function< bool(const log_tdes &)> rv_delete_if_func
TRANID trid
Definition: log_impl.h:466
LOG_RCV_TDES rcv
Definition: log_impl.h:541
const TRANID LOG_SYSTEM_WORKER_FIRST_TRANID
Definition: log_impl.h:224
std::mutex systb_Mutex
TRAN_STATE state
Definition: log_impl.h:469
entry & get_entry(void)
LOG_LSA tran_start_postpone_lsa
Definition: log_impl.h:450
void logtb_finalize_tdes(THREAD_ENTRY *thread_p, LOG_TDES *tdes)
static void map_all_tdes(const map_func &func)