Changeset: c484c1dd579f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c484c1dd579f Branch: nospare Log Message:
merged diffs (176 lines): diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c --- a/sql/storage/objectset.c +++ b/sql/storage/objectset.c @@ -321,45 +321,20 @@ static void os_atmc_set_state(objectvers ov->state = state; } -static void os_rollback_id_based_terminal_decendant(objectversion *ov, sqlstore *store); -static void os_rollback_name_based_terminal_decendant(objectversion *ov, sqlstore *store); - static void -os_rollback_os_id_based_cascading(objectversion *ov, sqlstore *store) { - bte state = os_atmc_get_state(ov); - assert(state & id_based_rollbacked); - - if (ov->id_based_older) { - if (ov->ts != ov->id_based_older->ts) { - // older is last committed state or belongs to parent transaction. - // In any case, we restore versionhead pointer to that. - // TODO START ATOMIC SET - ov->id_based_head->ov = ov->id_based_older; - } - else { - if (!(state & name_based_rollbacked)) - os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store); - state = os_atmc_get_state(ov->id_based_older); +_os_rollback(objectversion *ov, sqlstore *store) +{ + assert(ov->ts >= TRANSACTION_ID_BASE); - state |= id_based_rollbacked; - os_atmc_set_state(ov->id_based_older, state); - - // id based cascaded rollback along the parents - os_rollback_os_id_based_cascading(ov->id_based_older, store); - } + bte state = os_atmc_get_state(ov); + if (state & under_destruction) { + return; } - else { - // this is a terminal node. i.e. this objectversion does not have id based committed history - os_remove_id_based_chain(ov->os, store, ov->id_based_head); - } -} -static void -os_rollback_os_name_based_cascading(objectversion *ov, sqlstore *store) { - bte state = os_atmc_get_state(ov); - assert(state & name_based_rollbacked); + state |= under_destruction; + os_atmc_set_state(ov, state); - if (ov->name_based_older) { + if (ov->name_based_older && !(os_atmc_get_state(ov->name_based_older) & under_destruction)) { if (ov->ts != ov->name_based_older->ts) { // older is last committed state or belongs to parent transaction. // In any case, we restore versionhead pointer to that. @@ -367,69 +342,43 @@ os_rollback_os_name_based_cascading(obje ov->name_based_head->ov = ov->name_based_older; } else { - if (!(state & id_based_rollbacked)) - os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store); - state = os_atmc_get_state(ov->name_based_older); - - state |= name_based_rollbacked; - os_atmc_set_state(ov->name_based_older, state); - - // name based cascaded rollback along the parents - os_rollback_os_name_based_cascading(ov->name_based_older, store); + _os_rollback(ov->name_based_older, store); } } - else { + else if (!ov->name_based_older) { // this is a terminal node. i.e. this objectversion does not have name based committed history - os_remove_name_based_chain(ov->os, store, ov->name_based_head); - } -} - -static void -os_rollback_name_based_terminal_decendant(objectversion *ov, sqlstore *store) -{ - assert(ov->ts >= TRANSACTION_ID_BASE); - - bte state = os_atmc_get_state(ov); - if (state & name_based_rollbacked) { - return; + if (ov->name_based_head) // The oposite can happen during an early conflict in os_add or os_del. + os_remove_name_based_chain(ov->os, store, ov->name_based_head); } - state |= name_based_rollbacked; - os_atmc_set_state(ov, state); - - if (!(state & id_based_rollbacked)) - os_rollback_id_based_terminal_decendant(ov->id_based_head->ov, store); - - os_rollback_os_name_based_cascading(ov, store); -} - -static void -os_rollback_id_based_terminal_decendant(objectversion *ov, sqlstore *store) -{ - assert(ov->ts >= TRANSACTION_ID_BASE); - - bte state = os_atmc_get_state(ov); - if (state & id_based_rollbacked) { - return; + if (ov->id_based_older && !(os_atmc_get_state(ov->id_based_older) & under_destruction)) { + if (ov->ts != ov->id_based_older->ts) { + // older is last committed state or belongs to parent transaction. + // In any case, we restore versionhead pointer to that. + // TODO START ATOMIC SET + ov->id_based_head->ov = ov->id_based_older; + } + else if (ov->id_based_older != ov->name_based_older) + _os_rollback(ov->id_based_older, store); + } + else if (!ov->id_based_older) { + // this is a terminal node. i.e. this objectversion does not have id based committed history + os_remove_id_based_chain(ov->os, store, ov->id_based_head); } - state |= id_based_rollbacked; - os_atmc_set_state(ov, state); + if (ov->name_based_newer && !(os_atmc_get_state(ov->name_based_newer) & under_destruction)) { + _os_rollback(ov->id_based_older, store); + } - if (!(state & name_based_rollbacked)) - os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store); - - os_rollback_os_id_based_cascading(ov, store); + if (ov->id_based_newer && ov->id_based_newer != ov->name_based_newer && !(os_atmc_get_state(ov->id_based_newer) & under_destruction)) { + _os_rollback(ov->id_based_older, store); + } } static int os_rollback(objectversion *ov, sqlstore *store) { - if (ov->state & name_based_rollbacked) { - return LOG_OK; - } - - os_rollback_name_based_terminal_decendant(ov->name_based_head->ov, store); + _os_rollback(ov, store); return LOG_OK; } @@ -857,10 +806,7 @@ os_add(objectset *os, struct sql_trans * } if (os_add_name_based(os, tr, name, ov)) { - bte state = os_atmc_get_state(ov); - state |= name_based_rollbacked; - os_atmc_set_state(ov, state); - os_rollback_id_based_terminal_decendant(ov, tr->store); + trans_add(tr, b, ov, &tc_gc_objectversion, &tc_commit_objectversion, NULL); return -1; } @@ -948,10 +894,7 @@ os_del(objectset *os, struct sql_trans * } if (os_del_name_based(os, tr, name, ov)) { - bte state = os_atmc_get_state(ov); - state |= name_based_rollbacked; - os_atmc_set_state(ov, state); - os_rollback_id_based_terminal_decendant(ov, tr->store); + trans_add(tr, b, ov, &tc_gc_objectversion, &tc_commit_objectversion, NULL); return -1; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list