int DBGP_NAME (page_wait_access) (DBGP_PARAMS it_cursor_t * itc, dp_addr_t dp, buffer_desc_t * buf_from, buffer_desc_t ** buf_ret, int mode, int max_change) { buffer_desc_t decoy; buffer_desc_t *buf; dp_addr_t phys_dp; itc->itc_to_reset = RWG_NO_WAIT; itc->itc_max_transit_change = max_change; itc->itc_must_kill_trx = 0; if (!dp) GPF_T1 ("Zero DP in page_fault_map_sem"); if (buf_from) { ITC_IN_TRANSIT (itc, dp, buf_from->bd_page); } else ASSERT_IN_MAP (itc->itc_tree, dp); buf = IT_DP_TO_BUF (itc->itc_tree, dp); if (!buf) { ra_req_t * ra = NULL; IT_DP_REMAP (itc->itc_tree, dp, phys_dp); #ifdef MTX_DEBUG em_check_dp (itc->itc_tree->it_extent_map, phys_dp); if (phys_dp != dp) em_check_dp (itc->itc_tree->it_extent_map, dp); #endif if ((DP_DELETED == phys_dp || dbs_is_free_page (itc->itc_tree->it_storage, phys_dp)) && !strchr (wi_inst.wi_open_mode, 'a')) { log_error ("Reference to page with free remap dp = %ld, remap = %ld", (long) phys_dp, (long) dp); if (0 && DBS_PAGE_IN_RANGE (itc->itc_tree->it_storage, phys_dp)) dbs_page_allocated (itc->itc_tree->it_storage, phys_dp); else { *buf_ret = PF_OF_DELETED; itc->itc_must_kill_trx = 1; itc->itc_to_reset = RWG_WAIT_ANY; ITC_LEAVE_MAPS (itc); return RWG_WAIT_ANY; } } memset (&decoy, 0, sizeof (buffer_desc_t)); decoy.bd_being_read = 1; if (PA_READ == mode) decoy.bd_readers = 1; else BD_SET_IS_WRITE (&decoy, 1); sethash (DP_ADDR2VOID (dp), &IT_DP_MAP (itc->itc_tree, dp)->itm_dp_to_buf, (void*)&decoy); ITC_LEAVE_MAPS (itc); buf = bp_get_buffer (NULL, BP_BUF_REQUIRED); is_read_pending++; buf->bd_being_read = 1; buf->bd_page = dp; buf->bd_storage = itc->itc_tree->it_storage; buf->bd_physical_page = phys_dp; BD_SET_IS_WRITE (buf, 0); buf->bd_write_waiting = NULL; if (buf_from && !itc->itc_landed) ra = itc_read_aside (itc, buf_from, dp); itc->itc_n_reads++; ITC_MARK_READ (itc); buf->bd_tree = itc->itc_tree; buf_disk_read (buf); is_read_pending--; if (ra) itc_read_ahead_blob (itc, ra, RAB_SPECULATIVE); if (buf_from) { ITC_IN_TRANSIT (itc, dp, buf_from->bd_page) } else
void it_cache_check (index_tree_t * it, int mode) { long remap; int error = 0, gpf_on_error = 0; short l; int inx; for (inx = 0; inx < IT_N_MAPS; inx++) { it_map_t * itm = &it->it_maps[inx]; dk_hash_iterator_t hit; ptrlong dp; buffer_desc_t * buf; mutex_enter (&itm->itm_mtx); dk_hash_iterator (&hit, &itm->itm_dp_to_buf); while (dk_hit_next (&hit, (void**) &dp, (void**) &buf)) { if (!buf->bd_buffer) continue; /* this is a decoy holding a place while real buffer being read */ if (buf->bd_is_write || buf->bd_readers) { log_error ("Buffer %p occupied in cpt\n", buf); /* This can be legitimate if a thread is in freeze mode and one itc is on a table scan and another is in order by or hash fill, so that the freeze is in the temp space operation . */ /* error = 1; */ } if (dbs_cache_check_enable && DPF_INDEX == SHORT_REF (buf->bd_buffer + DP_FLAGS) && IT_CHECK_FAST != mode) pg_check_map_1 (buf); if (buf->bd_is_dirty && !gethash (DP_ADDR2VOID (buf->bd_page), &itm->itm_remap)) { log_error ("Buffer %p dirty but no remap, tree %s", buf, it->it_key ? it->it_key->key_name : "no key"); dbg_page_map_log (buf, "missed_flush.txt", "Dirty page with no remap"); } if (((dp_addr_t) dp) != buf->bd_page) { log_error ("*** Buffer %p cache dp %ld buf dp %ld \n", (void *)buf, dp, (unsigned long) buf->bd_page); error = 1; } if (IT_CHECK_POST == mode && dbs_is_free_page (it->it_storage, (dp_addr_t) dp)) { log_error ("*** buffer with free dp L=%ld buf=%p \n", dp, (void *)buf); error = 1; } if (IT_CHECK_POST != mode && dbs_is_free_page (it->it_storage, (dp_addr_t) dp)) { short fl = SHORT_REF (buf->bd_buffer + DP_FLAGS); if (fl != DPF_BLOB && fl != DPF_BLOB_DIR) { log_error ("*** In cpt, suspect to have buffer with free dp L=%ld buf=%p while it is neither blob or blob dir, which may be free at this point if uncommitted.\n", dp, (void *)buf); error = 1; } } if (((dp_addr_t) dp) != buf->bd_physical_page && dbs_is_free_page (it->it_storage, buf->bd_physical_page)) { log_error ("*** buffer with free remap dp L=%ld P=%ld buf=%p \n", dp, (unsigned long) buf->bd_physical_page, (void *)buf); error = 1; } remap = (long) (ptrlong) gethash (DP_ADDR2VOID (dp), &itm->itm_remap); if (!remap) remap = (long) (ptrlong) gethash (DP_ADDR2VOID (buf->bd_page), it->it_storage->dbs_cpt_remap); if ((remap && buf->bd_physical_page != (dp_addr_t) remap) || (((dp_addr_t)dp) != buf->bd_physical_page && ((dp_addr_t) remap) != buf->bd_physical_page)) { log_error ("*** Inconsistent remap L=%ld buf P=%ld isp P=%ld \n", dp, (unsigned long) buf->bd_physical_page, remap); error = 1; } l=SHORT_REF (buf->bd_buffer + DP_FLAGS); if (dp != buf->bd_physical_page && (DPF_BLOB == l || DPF_BLOB_DIR == l )) { log_error ("*** Blob not to be remapped L=%ld P=%ld \n", dp, (unsigned long) buf->bd_physical_page); } if (error && IT_CHECK_FAST == mode) log_error ("it_cache_check got errors but will not stop in mid cpt"); else if (error && gpf_on_error) GPF_T1 ("Buffer cache consistency check failed."); } if (error) { gpf_on_error = 1; error = 0; mutex_leave (&itm->itm_mtx); continue; /* loop again, this time gpf on first error. */ } mutex_leave (&itm->itm_mtx); } }