fix check_row_lock bug
This commit is contained in:
		| @ -252,45 +252,62 @@ int ObMicroBlockGetReader::check_row_locked_(ObIRowReader* row_reader_ptr, memta | ||||
|       const int64_t sql_sequence_col_idx = | ||||
|           ObMultiVersionRowkeyHelpper::get_sql_sequence_col_store_index(rowkey_cnt, extra_multi_version_col_cnt); | ||||
|  | ||||
|       if (OB_FAIL(row_reader_ptr->setup_row( | ||||
|               data_begin_, index_data_[row_idx_ + 1], index_data_[row_idx_], header_->column_count_, &trans_id))) { | ||||
|         LOG_WARN("fail to setup row", K(ret)); | ||||
|       } else if (OB_FAIL(row_reader_ptr->get_row_header(row_header))) {  // get row header | ||||
|         LOG_WARN("fail to get row header", K(ret)); | ||||
|       } else if (OB_ISNULL(row_header)) { | ||||
|         ret = OB_ERR_UNEXPECTED; | ||||
|         LOG_WARN("row header is null", K(ret)); | ||||
|       } else if (OB_FAIL(row_reader_ptr->read_column(version_column_meta, | ||||
|                      allocator_, | ||||
|                      trans_version_col_idx, | ||||
|                      version_cell))) {  // read trans version | ||||
|         LOG_WARN("fail to read version column", K(ret)); | ||||
|       } else if (OB_FAIL(version_cell.get_int(lock_state.trans_version_))) { | ||||
|         LOG_WARN("fail to convert version cell to int", K(ret), K(version_cell)); | ||||
|       } else { | ||||
|         lock_state.trans_version_ = -lock_state.trans_version_; | ||||
|       } | ||||
|       if (OB_SUCC(ret)) { | ||||
|         flag.flag_ = row_header->get_row_type_flag(); | ||||
|         // check if row is uncommitted | ||||
|         if (flag.is_uncommitted_row()) { | ||||
|           lock_state.trans_version_ = INT64_MAX; | ||||
|           if (OB_FAIL(row_reader_ptr->read_column(sql_sequence_meta, | ||||
|                   allocator_, | ||||
|                   sql_sequence_col_idx, | ||||
|                   sql_sequence_cell))) {  // read sql sequence | ||||
|             LOG_WARN("fail to read version column", K(ret)); | ||||
|           } else if (OB_FAIL(sql_sequence_cell.get_int(sql_sequence))) { | ||||
|             LOG_WARN("fail to convert sql_sequence cell to int32", K(ret), K(sql_sequence_cell)); | ||||
|           } else { | ||||
|             sql_sequence = -sql_sequence; | ||||
|             ret = const_cast<transaction::ObTransStateTableGuard&>(trans_table_guard) | ||||
|                       .get_trans_state_table() | ||||
|                       .check_row_locked(rowkey, ctx, read_trans_id, trans_id, sql_sequence, lock_state); | ||||
|           } | ||||
|       while (OB_SUCC(ret) && row_idx_ < header_->row_count_) { | ||||
|         if (OB_FAIL(row_reader_ptr->setup_row( | ||||
|                 data_begin_, index_data_[row_idx_ + 1], index_data_[row_idx_], header_->column_count_, &trans_id))) { | ||||
|           LOG_WARN("fail to setup row", K(ret)); | ||||
|         } else if (OB_FAIL(row_reader_ptr->get_row_header(row_header))) {  // get row header | ||||
|           LOG_WARN("fail to get row header", K(ret)); | ||||
|         } else if (OB_ISNULL(row_header)) { | ||||
|           ret = OB_ERR_UNEXPECTED; | ||||
|           LOG_WARN("row header is null", K(ret)); | ||||
|         } else if (OB_FAIL(row_reader_ptr->read_column(version_column_meta, | ||||
|                        allocator_, | ||||
|                        trans_version_col_idx, | ||||
|                        version_cell))) {  // read trans version | ||||
|           LOG_WARN("fail to read version column", K(ret)); | ||||
|         } else if (OB_FAIL(version_cell.get_int(lock_state.trans_version_))) { | ||||
|           LOG_WARN("fail to convert version cell to int", K(ret), K(version_cell)); | ||||
|         } else { | ||||
|           lock_state.trans_version_ = -lock_state.trans_version_; | ||||
|         } | ||||
|         if (OB_SUCC(ret)) { | ||||
|           flag.flag_ = row_header->get_row_type_flag(); | ||||
|           // check if row is uncommitted | ||||
|           if (flag.is_uncommitted_row()) { | ||||
|             lock_state.trans_version_ = INT64_MAX; | ||||
|             if (OB_FAIL(row_reader_ptr->read_column(sql_sequence_meta, | ||||
|                     allocator_, | ||||
|                     sql_sequence_col_idx, | ||||
|                     sql_sequence_cell))) {  // read sql sequence | ||||
|               LOG_WARN("fail to read version column", K(ret)); | ||||
|             } else if (OB_FAIL(sql_sequence_cell.get_int(sql_sequence))) { | ||||
|               LOG_WARN("fail to convert sql_sequence cell to int32", K(ret), K(sql_sequence_cell)); | ||||
|             } else { | ||||
|               sql_sequence = -sql_sequence; | ||||
|               ret = const_cast<transaction::ObTransStateTableGuard &>(trans_table_guard) | ||||
|                         .get_trans_state_table() | ||||
|                         .check_row_locked(rowkey, ctx, read_trans_id, trans_id, sql_sequence, lock_state); | ||||
|               if (flag.is_last_multi_version_row()   // meet last row | ||||
|                   || 0 != lock_state.trans_version_  // trans is commit or abort | ||||
|                   || lock_state.is_locked_) { | ||||
|                 break; | ||||
|               } | ||||
|             } | ||||
|           } else {  // meet committed row, should break | ||||
|             break; | ||||
|           } | ||||
|           ++row_idx_; | ||||
|  | ||||
|           STORAGE_LOG(DEBUG, | ||||
|               "check row lock", | ||||
|               K(ret), | ||||
|               K(rowkey), | ||||
|               K(read_trans_id), | ||||
|               K(trans_id), | ||||
|               K(sql_sequence), | ||||
|               K(lock_state)); | ||||
|         } | ||||
|         STORAGE_LOG( | ||||
|             DEBUG, "check row lock", K(ret), K(rowkey), K(read_trans_id), K(trans_id), K(sql_sequence), K(lock_state)); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @ -1740,6 +1740,7 @@ int ObSSTableRowIterator::check_row_locked(ObSSTableReadHandle& read_handle, ObS | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|   lock_state.is_locked_ = false; | ||||
|   lock_state.trans_version_ = 0; | ||||
|  | ||||
|   switch (read_handle.state_) { | ||||
|     case ObSSTableRowState::NOT_EXIST: | ||||
| @ -1778,7 +1779,11 @@ int ObSSTableRowIterator::check_block_row_lock(ObSSTableReadHandle& read_handle, | ||||
|   } | ||||
|  | ||||
|   if (OB_SUCC(ret)) { | ||||
|     for (int64_t i = read_handle.micro_begin_idx_; OB_SUCC(ret) && i <= read_handle.micro_end_idx_; ++i) { | ||||
|     // there is only one trans in one sstable, | ||||
|     // when 0 != lock_state.trans_version_ means cur trans is commit or abort, no need loop | ||||
|     for (int64_t i = read_handle.micro_begin_idx_; | ||||
|          OB_SUCC(ret) && i <= read_handle.micro_end_idx_ && !lock_state.is_locked_ && 0 == lock_state.trans_version_; | ||||
|          ++i) { | ||||
|       if (OB_FAIL(get_block_data(i, block_data))) { | ||||
|         STORAGE_LOG(WARN, "Fail to get block data, ", K(ret), K(read_handle)); | ||||
|       } else { | ||||
|  | ||||
| @ -11206,6 +11206,7 @@ int ObPartTransCtx::check_row_locked_(const ObTransStatusInfo& trans_info, | ||||
| { | ||||
|   int ret = OB_SUCCESS; | ||||
|  | ||||
|   // when lock_state.trans_version_ != 0 means cur trans is commit or abort | ||||
|   switch (trans_info.status_) { | ||||
|     case ObTransTableStatusType::COMMIT: { | ||||
|       lock_state.is_locked_ = false; | ||||
| @ -11219,7 +11220,7 @@ int ObPartTransCtx::check_row_locked_(const ObTransStatusInfo& trans_info, | ||||
|     } | ||||
|     case ObTransTableStatusType::ABORT: { | ||||
|       lock_state.is_locked_ = false; | ||||
|       lock_state.trans_version_ = 0; | ||||
|       lock_state.trans_version_ = OB_INVALID_VERSION; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 lx0
					lx0