[PDML] discover seq no reorder under pdml and report new error
This commit is contained in:
		@ -1072,6 +1072,7 @@ int ObQueryRetryCtrl::init()
 | 
			
		||||
  ERR_RETRY_FUNC("TRX",      OB_GTS_NOT_READY,                   short_wait_retry_proc,      short_wait_retry_proc,                                nullptr);
 | 
			
		||||
  ERR_RETRY_FUNC("TRX",      OB_GTI_NOT_READY,                   short_wait_retry_proc,      short_wait_retry_proc,                                nullptr);
 | 
			
		||||
  ERR_RETRY_FUNC("TRX",      OB_TRANS_WEAK_READ_VERSION_NOT_READY, short_wait_retry_proc,    short_wait_retry_proc,                                nullptr);
 | 
			
		||||
  ERR_RETRY_FUNC("TRX",      OB_SEQ_NO_REORDER_UNDER_PDML,       short_wait_retry_proc,      short_wait_retry_proc,                                nullptr);
 | 
			
		||||
 | 
			
		||||
  /* sql */
 | 
			
		||||
  ERR_RETRY_FUNC("SQL",      OB_ERR_INSUFFICIENT_PX_WORKER,      px_thread_not_enough_proc,  short_wait_retry_proc,                                nullptr);
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -1840,6 +1840,7 @@ DEFINE_ERROR(OB_CLOG_DISK_HANG, -6325, -1, "HY000", "ob clog disk hang");
 | 
			
		||||
DEFINE_ERROR(OB_TABLE_LOCK_SPLIT_TWICE, -6326, -1, "HY000", "table lock has been splitted before, can not be splitted again")
 | 
			
		||||
DEFINE_ERROR(OB_TABLE_LOCK_IS_SPLITTING, -6327, -1, "HY000", "table lock is being splitted, can not be splitted again")
 | 
			
		||||
DEFINE_ERROR(OB_TABLE_LOCK_SPLIT_FAIL, -6328, -1, "HY000", "table lock splitting failed")
 | 
			
		||||
DEFINE_ERROR(OB_SEQ_NO_REORDER_UNDER_PDML, -6329, -1, "HY000", "pdml sql need retry under sequence number reorder")
 | 
			
		||||
 | 
			
		||||
// 余留位置
 | 
			
		||||
////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
@ -1386,6 +1386,7 @@ constexpr int OB_CLOG_DISK_HANG = -6325;
 | 
			
		||||
constexpr int OB_TABLE_LOCK_SPLIT_TWICE = -6326;
 | 
			
		||||
constexpr int OB_TABLE_LOCK_IS_SPLITTING = -6327;
 | 
			
		||||
constexpr int OB_TABLE_LOCK_SPLIT_FAIL = -6328;
 | 
			
		||||
constexpr int OB_SEQ_NO_REORDER_UNDER_PDML = -6329;
 | 
			
		||||
constexpr int OB_ELECTION_WARN_LOGBUF_FULL = -7000;
 | 
			
		||||
constexpr int OB_ELECTION_WARN_LOGBUF_EMPTY = -7001;
 | 
			
		||||
constexpr int OB_ELECTION_WARN_NOT_RUNNING = -7002;
 | 
			
		||||
@ -3476,6 +3477,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
 | 
			
		||||
#define OB_TABLE_LOCK_SPLIT_TWICE__USER_ERROR_MSG "table lock has been splitted before, can not be splitted again"
 | 
			
		||||
#define OB_TABLE_LOCK_IS_SPLITTING__USER_ERROR_MSG "table lock is being splitted, can not be splitted again"
 | 
			
		||||
#define OB_TABLE_LOCK_SPLIT_FAIL__USER_ERROR_MSG "table lock splitting failed"
 | 
			
		||||
#define OB_SEQ_NO_REORDER_UNDER_PDML__USER_ERROR_MSG "pdml sql need retry under sequence number reorder"
 | 
			
		||||
#define OB_ELECTION_WARN_LOGBUF_FULL__USER_ERROR_MSG "The log buffer is full"
 | 
			
		||||
#define OB_ELECTION_WARN_LOGBUF_EMPTY__USER_ERROR_MSG "The log buffer is empty"
 | 
			
		||||
#define OB_ELECTION_WARN_NOT_RUNNING__USER_ERROR_MSG "The object is not running"
 | 
			
		||||
@ -5697,6 +5699,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
 | 
			
		||||
#define OB_TABLE_LOCK_SPLIT_TWICE__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -6326, table lock has been splitted before, can not be splitted again"
 | 
			
		||||
#define OB_TABLE_LOCK_IS_SPLITTING__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -6327, table lock is being splitted, can not be splitted again"
 | 
			
		||||
#define OB_TABLE_LOCK_SPLIT_FAIL__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -6328, table lock splitting failed"
 | 
			
		||||
#define OB_SEQ_NO_REORDER_UNDER_PDML__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -6329, pdml sql need retry under sequence number reorder"
 | 
			
		||||
#define OB_ELECTION_WARN_LOGBUF_FULL__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -7000, The log buffer is full"
 | 
			
		||||
#define OB_ELECTION_WARN_LOGBUF_EMPTY__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -7001, The log buffer is empty"
 | 
			
		||||
#define OB_ELECTION_WARN_NOT_RUNNING__ORA_USER_ERROR_MSG "ORA-00600: internal error code, arguments: -7002, The object is not running"
 | 
			
		||||
@ -6300,7 +6303,7 @@ constexpr int OB_ERR_INVALID_DATE_MSG_FMT_V2 = -4219;
 | 
			
		||||
#define OB_ERR_DATA_TOO_LONG_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-12899: value too large for column %.*s (actual: %ld, maximum: %ld)"
 | 
			
		||||
#define OB_ERR_INVALID_DATE_MSG_FMT_V2__ORA_USER_ERROR_MSG "ORA-01861: Incorrect datetime value for column '%.*s' at row %ld"
 | 
			
		||||
 | 
			
		||||
extern int g_all_ob_errnos[2217];
 | 
			
		||||
extern int g_all_ob_errnos[2218];
 | 
			
		||||
 | 
			
		||||
  const char *ob_error_name(const int oberr);
 | 
			
		||||
  const char* ob_error_cause(const int oberr);
 | 
			
		||||
 | 
			
		||||
@ -73,6 +73,7 @@ int check_sequence_set_violation(const concurrent_control::ObWriteFlag write_fla
 | 
			
		||||
      // it). We use the common idea that all operations split in the storage
 | 
			
		||||
      // layer will use same sequence number, so we bypass the check if the writer
 | 
			
		||||
      // sequence number is equal to the locker sequence number.
 | 
			
		||||
 | 
			
		||||
      // } else if (writer_seq_no == locker_seq_no &&
 | 
			
		||||
      //            (blocksstable::ObDmlFlag::DF_UPDATE == writer_dml_flag
 | 
			
		||||
      //             && blocksstable::ObDmlFlag::DF_LOCK == locker_dml_flag)) {
 | 
			
		||||
@ -153,8 +154,13 @@ int check_sequence_set_violation(const concurrent_control::ObWriteFlag write_fla
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (OB_SUCC(ret) && writer_seq_no < locker_seq_no) {
 | 
			
		||||
      // We need guarantee the right sequence of the same txn operations
 | 
			
		||||
      ret = OB_ERR_UNEXPECTED;
 | 
			
		||||
      // Under the PDML scenario, there exists a case where a row may be
 | 
			
		||||
      // concurrently modified by both a delete and an insert operation
 | 
			
		||||
      // (consider a scenario like 'a = a + 1'). In such a situation, there is a
 | 
			
		||||
      // possibility of sequence numbers becoming out of order on the row which
 | 
			
		||||
      // may break the promise of the memtable semantics. We need to be aware of
 | 
			
		||||
      // this situation and retry the entire SQL statement in such cases.
 | 
			
		||||
      ret = OB_SEQ_NO_REORDER_UNDER_PDML;
 | 
			
		||||
      TRANS_LOG(ERROR, "wrong row of sequence on one row found", K(reader_seq_no),
 | 
			
		||||
                K(writer_tx_id), K(writer_dml_flag), K(writer_seq_no),
 | 
			
		||||
                K(locker_tx_id), K(locker_dml_flag), K(locker_seq_no));
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user