Skip to content

Commit

Permalink
Merge branch 'bkl'
Browse files Browse the repository at this point in the history
  • Loading branch information
jengelh committed May 10, 2024
2 parents f7359bc + c264d74 commit 5bb765d
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 118 deletions.
44 changes: 13 additions & 31 deletions exch/exmdb/db_engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -441,17 +441,15 @@ void db_base::handle_spares(sqlite3 *main, sqlite3 *eph)
}

db_conn::db_conn(db_base &base) :
m_base(&base),
m_lock(base.giant_lock, std::defer_lock) // will be acquired during open()
m_base(&base)
{
++base.reference;
}

db_conn::db_conn(db_conn &&o) :
psqlite(std::move(o.psqlite)),
m_sqlite_eph(std::move(o.m_sqlite_eph)),
m_base(std::move(o.m_base)),
m_lock(std::move(o.m_lock))
m_base(std::move(o.m_base))
{
o.psqlite = o.m_sqlite_eph = nullptr;
o.m_base = nullptr;
Expand Down Expand Up @@ -485,7 +483,6 @@ db_conn &db_conn::operator=(db_conn &&o)
bool db_conn::open(const char *dir) try
{
m_base->get_dbs(dir, psqlite, m_sqlite_eph);
m_lock.lock();
return psqlite && m_sqlite_eph;
} catch (const std::bad_alloc &) {
mlog(LV_ERR, "E-1349: ENOMEM");
Expand Down Expand Up @@ -568,20 +565,9 @@ static void *db_expiry_thread(void *param)
return nullptr;
}

static bool db_reload(db_conn_ptr &pdb, const char *dir)
{
pdb.reset();
exmdb_server::free_env();
if (g_exmdb_search_yield)
std::this_thread::yield(); /* +2 to +3% walltime */
exmdb_server::build_env(EM_PRIVATE, dir);
pdb = db_engine_get_db(dir);
return !!pdb;
}

static BOOL db_engine_search_folder(const char *dir, cpid_t cpid,
uint64_t search_fid, uint64_t scope_fid, const RESTRICTION *prestriction,
db_conn_ptr &pdb, db_base &dbase)
db_conn_ptr &pdb)
{
char sql_string[128];
auto sql_transact = gx_sql_begin_trans(pdb->psqlite, false); // ends before writes take place
Expand Down Expand Up @@ -627,15 +613,7 @@ static BOOL db_engine_search_folder(const char *dir, cpid_t cpid,
for (size_t i = 0, count = 0; i < pmessage_ids->count; ++i, ++count) {
if (g_notify_stop)
break;
auto t_msg = tp_now();
if (count >= g_exmdb_search_pacing ||
(t_msg - t_start) >= std::chrono::nanoseconds(g_exmdb_search_pacing_time)) {
if (!db_reload(pdb, dir))
return false;
count = 0;
t_start = tp_now();
}
auto sql_transact1 = gx_sql_begin_trans(pdb->psqlite, false);
auto sql_transact1 = gx_sql_begin_trans(pdb->psqlite, false); // ends before writes take place
if (!sql_transact1)
return false;
if (!cu_eval_msg_restriction(pdb->psqlite,
Expand All @@ -658,12 +636,14 @@ static BOOL db_engine_search_folder(const char *dir, cpid_t cpid,
* have a search folder have a scope containing another search
* folder; exmdb_provider only does a descendant check).
*/
auto dbase = pdb->lock_base_wr();
pdb->proc_dynamic_event(cpid, dynamic_event::new_msg,
search_fid, pmessage_ids->pids[i], 0, dbase);
search_fid, pmessage_ids->pids[i], 0, *dbase);
/*
* Regular notifications
*/
pdb->notify_link_creation(search_fid, pmessage_ids->pids[i], dbase);
pdb->notify_link_creation(search_fid, pmessage_ids->pids[i], *dbase);
dbase.reset();
if (sql_transact1.commit() != SQLITE_OK)
return false;
}
Expand Down Expand Up @@ -822,17 +802,17 @@ static void *sf_popul_thread(void *param)
auto pdb = db_engine_get_db(psearch->dir.c_str());
if (!pdb)
goto NEXT_SEARCH;
db_base *dbase = pdb->m_base;
for (size_t i = 0; i < pfolder_ids->count; ++i) {
if (g_notify_stop)
break;
if (!db_engine_search_folder(psearch->dir.c_str(),
psearch->cpid, psearch->folder_id,
pfolder_ids->pids[i], psearch->prestriction, pdb, *dbase))
pfolder_ids->pids[i], psearch->prestriction, pdb))
break;
}
if (g_notify_stop)
break;
auto dbase = pdb->lock_base_wr();
/* Stop animation (does nothing else in OL really) */
dbeng_notify_search_completion(*dbase, psearch->folder_id);
pdb->notify_folder_modification(common_util_get_folder_parent_fid(
Expand All @@ -850,6 +830,7 @@ static void *sf_popul_thread(void *param)
if (t.type == table_type::content &&
psearch->folder_id == t.folder_id)
table_ids.push_back(t.table_id);
dbase.reset();
pdb.reset();
/*
* reload_ct triggers a table_change notification, and the
Expand Down Expand Up @@ -3957,7 +3938,7 @@ void db_conn::begin_batch_mode(db_base &dbase)
dbase.tables.b_batch = true;
}

void db_conn::commit_batch_mode_release(db_conn_ptr &&pdb, db_base *dbase)
void db_conn::commit_batch_mode_release(db_conn_ptr &&pdb, db_base_wr_ptr &&dbase)
{
auto table_num = dbase->tables.table_list.size();
auto ptable_ids = table_num > 0 ? cu_alloc<uint32_t>(table_num) : nullptr;
Expand All @@ -3972,6 +3953,7 @@ void db_conn::commit_batch_mode_release(db_conn_ptr &&pdb, db_base *dbase)
}
}
dbase->tables.b_batch = false;
dbase.reset();
pdb.reset();
auto dir = exmdb_server::get_dir();
while (table_num-- > 0)
Expand Down
5 changes: 3 additions & 2 deletions exch/exmdb/db_engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ struct db_conn {
void transport_new_mail(uint64_t folder_id, uint64_t msg_id, uint32_t msg_flags, const char *klass, const db_base &);
void begin_batch_mode(db_base &);
/* pdb will also be put */
static void commit_batch_mode_release(std::optional<db_conn> &&pdb, db_base *);
static void commit_batch_mode_release(std::optional<db_conn> &&pdb, db_base_wr_ptr &&base);
void cancel_batch_mode(db_base &);
std::unique_ptr<prepared_statements> begin_optim();

Expand All @@ -200,8 +200,9 @@ struct db_conn {
inline uint32_t next_table_id() { return ++m_base->tables.last_id; }

sqlite3 *psqlite = nullptr, *m_sqlite_eph = nullptr;

private:
db_base *m_base = nullptr;
std::unique_lock<std::shared_mutex> m_lock;
};
using db_conn_ptr = std::optional<db_conn>;

Expand Down
36 changes: 20 additions & 16 deletions exch/exmdb/folder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ BOOL exmdb_server::create_folder(const char *dir, cpid_t cpid,
PR_HIER_REV, &nt_time, &b_result);
cu_set_property(MAPI_FOLDER, folder_id, CP_ACP, pdb->psqlite,
PR_HIER_REV, &nt_time, &b_result);
pdb->notify_folder_creation(parent_id, folder_id, *pdb->m_base);
pdb->notify_folder_creation(parent_id, folder_id, *pdb->lock_base_rd());
if (sql_transact.commit() != 0)
return false;
*pfolder_id = rop_util_make_eid_ex(1, folder_id);
Expand Down Expand Up @@ -543,7 +543,7 @@ BOOL exmdb_server::set_folder_properties(const char *dir, cpid_t cpid,
fid_val, cpid, pdb->psqlite, pproperties, pproblems))
return FALSE;
pdb->notify_folder_modification(common_util_get_folder_parent_fid(
pdb->psqlite, fid_val), fid_val, *pdb->m_base);
pdb->psqlite, fid_val), fid_val, *pdb->lock_base_rd());
if (sql_transact.commit() != 0)
return false;
return TRUE;
Expand All @@ -563,7 +563,7 @@ BOOL exmdb_server::remove_folder_properties(const char *dir,
fid_val, pdb->psqlite, pproptags))
return FALSE;
pdb->notify_folder_modification(common_util_get_folder_parent_fid(
pdb->psqlite, fid_val), fid_val, *pdb->m_base);
pdb->psqlite, fid_val), fid_val, *pdb->lock_base_rd());
if (sql_transact.commit() != 0)
return false;
return TRUE;
Expand Down Expand Up @@ -842,7 +842,7 @@ BOOL exmdb_server::delete_folder(const char *dir, cpid_t cpid,
*pb_result = FALSE;
return TRUE;
}
db_base *dbase = pdb->m_base;
auto dbase = pdb->lock_base_wr();
if (!b_search) {
snprintf(sql_string, std::size(sql_string), "SELECT count(*) FROM "
"folders WHERE parent_id=%llu", LLU{fid_val});
Expand Down Expand Up @@ -874,7 +874,7 @@ BOOL exmdb_server::delete_folder(const char *dir, cpid_t cpid,
pdb->proc_dynamic_event(cpid, dynamic_event::del_msg,
fid_val, pstmt.col_int64(0), 0, *dbase);
pstmt.finalize();
pdb->delete_dynamic(fid_val, dbase);
pdb->delete_dynamic(fid_val, dbase.get());
}
auto parent_id = common_util_get_folder_parent_fid(pdb->psqlite, fid_val);
if (b_search) {
Expand All @@ -892,7 +892,7 @@ BOOL exmdb_server::delete_folder(const char *dir, cpid_t cpid,
if (!folder_empty_folder(pdb, cpid, nullptr, fid_val,
DELETE_HARD_DELETE | DEL_MESSAGES | DEL_ASSOCIATED | DEL_FOLDERS,
&b_partial, &normal_size, &fai_size,
nullptr, nullptr, dbase) || b_partial ||
nullptr, nullptr, dbase.get()) || b_partial ||
!cu_adjust_store_size(pdb->psqlite, ADJ_DECREASE, normal_size, fai_size))
return FALSE;
snprintf(sql_string, std::size(sql_string), "DELETE FROM folders"
Expand Down Expand Up @@ -938,6 +938,7 @@ BOOL exmdb_server::delete_folder(const char *dir, cpid_t cpid,
if (pdb->exec(sql_string) != SQLITE_OK)
return FALSE;
pdb->notify_folder_deletion(parent_id, fid_val, *dbase);
dbase.reset();
snprintf(sql_string, std::size(sql_string), "UPDATE folder_properties SET"
" propval=propval+1 WHERE folder_id=%llu AND "
"proptag=%u", LLU{parent_id}, PR_DELETED_FOLDER_COUNT);
Expand Down Expand Up @@ -991,11 +992,12 @@ BOOL exmdb_server::empty_folder(const char *dir, cpid_t cpid,
auto sql_transact = gx_sql_begin_trans(pdb->psqlite);
if (!sql_transact)
return false;
auto dbase = pdb->m_base;
auto dbase = pdb->lock_base_wr();
if (!folder_empty_folder(pdb, cpid, username, fid_val, flags,
pb_partial, &normal_size, &fai_size,
&message_count, &folder_count, dbase))
&message_count, &folder_count, dbase.get()))
return FALSE;
dbase.reset();
if (message_count > 0) {
snprintf(sql_string, std::size(sql_string), "UPDATE folder_properties SET "
"propval=propval+%u WHERE folder_id=%llu AND "
Expand Down Expand Up @@ -1514,11 +1516,12 @@ BOOL exmdb_server::copy_folder_internal(const char *dir, cpid_t cpid,
uint32_t folder_count = 0;
uint64_t normal_size = 0, fai_size = 0;
BOOL b_partial = false;
auto dbase = pdb->m_base;
auto dbase = pdb->lock_base_wr();
if (!folder_copy_folder_internal(pdb, cpid, b_guest, username, src_val,
b_normal, b_fai, b_sub, dst_val, &b_partial, &normal_size,
&fai_size, &folder_count, dbase))
&fai_size, &folder_count, dbase.get()))
return FALSE;
dbase.reset();
if (folder_count > 0) {
snprintf(sql_string, std::size(sql_string), "UPDATE folder_properties SET "
"propval=propval+1 WHERE folder_id=%llu AND "
Expand Down Expand Up @@ -1604,7 +1607,7 @@ BOOL exmdb_server::movecopy_folder(const char *dir, cpid_t cpid, BOOL b_guest,
return TRUE;
}
}
auto dbase = pdb->m_base;
auto dbase = pdb->lock_base_wr();
if (!b_copy) {
snprintf(sql_string, std::size(sql_string), "UPDATE folders SET parent_id=%llu"
" WHERE folder_id=%llu", LLU{dst_val}, LLU{src_val});
Expand Down Expand Up @@ -1649,7 +1652,7 @@ BOOL exmdb_server::movecopy_folder(const char *dir, cpid_t cpid, BOOL b_guest,
return FALSE;
if (folder_type == FOLDER_SEARCH) {
if (!folder_copy_search_folder(pdb, cpid,
b_guest, username, src_val, dst_val, &fid_val, dbase))
b_guest, username, src_val, dst_val, &fid_val, dbase.get()))
return FALSE;
} else {
if (!folder_copy_generic_folder(pdb->psqlite,
Expand All @@ -1671,7 +1674,7 @@ BOOL exmdb_server::movecopy_folder(const char *dir, cpid_t cpid, BOOL b_guest,
BOOL b_partial = false;
if (!folder_copy_folder_internal(pdb, cpid, b_guest,
username, src_val, TRUE, TRUE, TRUE, fid_val,
&b_partial, &normal_size, &fai_size, nullptr, dbase))
&b_partial, &normal_size, &fai_size, nullptr, dbase.get()))
return FALSE;
if (!cu_adjust_store_size(pdb->psqlite, ADJ_INCREASE,
normal_size, fai_size))
Expand All @@ -1695,6 +1698,7 @@ BOOL exmdb_server::movecopy_folder(const char *dir, cpid_t cpid, BOOL b_guest,
if (pdb->exec(sql_string) != SQLITE_OK)
return FALSE;
pdb->notify_folder_movecopy(b_copy, dst_val, fid_val, parent_val, src_val, *dbase);
dbase.reset();
if (sql_transact.commit() != 0)
return false;
*errcode = ecSuccess;
Expand Down Expand Up @@ -1913,8 +1917,8 @@ BOOL exmdb_server::set_search_criteria(const char *dir, cpid_t cpid,
}
BOOL b_recursive = (search_flags & RECURSIVE_SEARCH) ? TRUE : false;
BOOL b_update = false, b_populate = false;
auto dbase = pdb->m_base;
if (!folder_clear_search_folder(pdb, cpid, fid_val, dbase))
auto dbase = pdb->lock_base_wr();
if (!folder_clear_search_folder(pdb, cpid, fid_val, dbase.get()))
return false;
if (search_flags & RESTART_SEARCH) {
b_populate = TRUE;
Expand All @@ -1925,7 +1929,7 @@ BOOL exmdb_server::set_search_criteria(const char *dir, cpid_t cpid,
pdb->update_dynamic(fid_val, search_flags,
prestriction, &folder_ids, *dbase);
else
pdb->delete_dynamic(fid_val, dbase);
pdb->delete_dynamic(fid_val, dbase.get());
if (sql_transact.commit() != 0)
return false;

Expand Down
Loading

0 comments on commit 5bb765d

Please sign in to comment.