Fix transfer create empty sstable with INT64_MAX upper trans version bug.
This commit is contained in:
		@ -690,7 +690,7 @@ int ObSharedMacroBlockMgr::rebuild_sstable(
 | 
				
			|||||||
    LOG_WARN("fail to close sstable index builder", K(ret));
 | 
					    LOG_WARN("fail to close sstable index builder", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(create_new_sstable(allocator, res, old_sstable, block_info, new_sstable))) {
 | 
					  } else if (OB_FAIL(create_new_sstable(allocator, res, old_sstable, block_info, new_sstable))) {
 | 
				
			||||||
    LOG_WARN("fail to create new sstable", K(ret), K(tablet.get_tablet_meta()), K(old_sstable));
 | 
					    LOG_WARN("fail to create new sstable", K(ret), K(tablet.get_tablet_meta()), K(old_sstable));
 | 
				
			||||||
  } else if (OB_FAIL(new_sstable.set_upper_trans_version(old_sstable.get_upper_trans_version()))) {
 | 
					  } else if (OB_FAIL(new_sstable.set_upper_trans_version(old_sstable.get_upper_trans_version(), false/*force_update*/))) {
 | 
				
			||||||
    LOG_WARN("fail to update upper trans version", K(ret), K(old_sstable.get_upper_trans_version()));
 | 
					    LOG_WARN("fail to update upper trans version", K(ret), K(old_sstable.get_upper_trans_version()));
 | 
				
			||||||
  } else if (OB_FAIL(new_sstable.get_meta(new_meta_handle))) {
 | 
					  } else if (OB_FAIL(new_sstable.get_meta(new_meta_handle))) {
 | 
				
			||||||
    LOG_WARN("get meta handle fail", K(ret), K(new_sstable));
 | 
					    LOG_WARN("get meta handle fail", K(ret), K(new_sstable));
 | 
				
			||||||
 | 
				
			|||||||
@ -949,18 +949,23 @@ int ObSSTable::check_row_locked(
 | 
				
			|||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ObSSTable::set_upper_trans_version(const int64_t upper_trans_version)
 | 
					int ObSSTable::set_upper_trans_version(
 | 
				
			||||||
 | 
					    const int64_t upper_trans_version,
 | 
				
			||||||
 | 
					    const bool force_update)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const int64_t old_val = ATOMIC_LOAD(&meta_cache_.upper_trans_version_);
 | 
					  const int64_t old_val = ATOMIC_LOAD(&meta_cache_.upper_trans_version_);
 | 
				
			||||||
  // only set once
 | 
					  // only set once
 | 
				
			||||||
  if (INT64_MAX == old_val && INT64_MAX != upper_trans_version) {
 | 
					  if (INT64_MAX == old_val && INT64_MAX != upper_trans_version) {
 | 
				
			||||||
    const int64_t new_val = std::max(upper_trans_version, meta_cache_.max_merged_trans_version_);
 | 
					    int64_t new_val = upper_trans_version;
 | 
				
			||||||
 | 
					    if (OB_LIKELY(!force_update)) {
 | 
				
			||||||
 | 
					      new_val = std::max(new_val, meta_cache_.max_merged_trans_version_);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    ATOMIC_CAS(&meta_cache_.upper_trans_version_, old_val, new_val);
 | 
					    ATOMIC_CAS(&meta_cache_.upper_trans_version_, old_val, new_val);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LOG_INFO("succeed to set upper trans version", K(key_),
 | 
					  LOG_INFO("succeed to set upper trans version", K(force_update), K(key_),
 | 
				
			||||||
      K(upper_trans_version), K(meta_cache_.upper_trans_version_));
 | 
					      K(upper_trans_version), K(meta_cache_.upper_trans_version_));
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -202,7 +202,7 @@ public:
 | 
				
			|||||||
      storage::ObTableAccessContext &context,
 | 
					      storage::ObTableAccessContext &context,
 | 
				
			||||||
      share::SCN &max_trans_version,
 | 
					      share::SCN &max_trans_version,
 | 
				
			||||||
      ObRowsInfo &rows_info);
 | 
					      ObRowsInfo &rows_info);
 | 
				
			||||||
  int set_upper_trans_version(const int64_t upper_trans_version);
 | 
					  int set_upper_trans_version(const int64_t upper_trans_version, const bool force_update);
 | 
				
			||||||
  virtual int64_t get_upper_trans_version() const override
 | 
					  virtual int64_t get_upper_trans_version() const override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    return meta_cache_.upper_trans_version_;
 | 
					    return meta_cache_.upper_trans_version_;
 | 
				
			||||||
 | 
				
			|||||||
@ -425,7 +425,7 @@ int ObTXTransferUtils::build_empty_minor_sstable_param_(
 | 
				
			|||||||
    param.table_key_.tablet_id_ = tablet_id;
 | 
					    param.table_key_.tablet_id_ = tablet_id;
 | 
				
			||||||
    param.table_key_.scn_range_.start_scn_ = start_scn;
 | 
					    param.table_key_.scn_range_.start_scn_ = start_scn;
 | 
				
			||||||
    param.table_key_.scn_range_.end_scn_ = end_scn;
 | 
					    param.table_key_.scn_range_.end_scn_ = end_scn;
 | 
				
			||||||
    param.max_merged_trans_version_ = INT64_MAX; //Set max merged trans version avoild sstable recycle;
 | 
					    param.max_merged_trans_version_ = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    param.schema_version_ = table_schema.get_schema_version();
 | 
					    param.schema_version_ = table_schema.get_schema_version();
 | 
				
			||||||
    param.create_snapshot_version_ = 0;
 | 
					    param.create_snapshot_version_ = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -3667,7 +3667,14 @@ int ObTablet::update_upper_trans_version(ObLS &ls, bool &is_updated)
 | 
				
			|||||||
        LOG_WARN("unexpected error, table is nullptr", K(ret), KPC(table));
 | 
					        LOG_WARN("unexpected error, table is nullptr", K(ret), KPC(table));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        ObSSTable *sstable = reinterpret_cast<ObSSTable *>(table);
 | 
					        ObSSTable *sstable = reinterpret_cast<ObSSTable *>(table);
 | 
				
			||||||
        if (INT64_MAX == sstable->get_upper_trans_version()) {
 | 
					        if (INT64_MAX != sstable->get_upper_trans_version()) {
 | 
				
			||||||
 | 
					        } else if (0 == sstable->get_data_macro_block_count() && INT64_MAX == sstable->get_max_merged_trans_version()) {
 | 
				
			||||||
 | 
					          if (OB_FAIL(sstable->set_upper_trans_version(0, true/*force_update*/))) {
 | 
				
			||||||
 | 
					            LOG_WARN("failed to force set upper trans version", K(ret), KPC(sstable));
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            FLOG_INFO("sstable has no data but max merged version is INT64_MAX, force set upper trans version", K(ret), KPC(sstable));
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
          int64_t max_trans_version = INT64_MAX;
 | 
					          int64_t max_trans_version = INT64_MAX;
 | 
				
			||||||
          SCN tmp_scn = SCN::max_scn();
 | 
					          SCN tmp_scn = SCN::max_scn();
 | 
				
			||||||
          if (OB_FAIL(ls.get_upper_trans_version_before_given_scn(sstable->get_end_scn(), tmp_scn))) {
 | 
					          if (OB_FAIL(ls.get_upper_trans_version_before_given_scn(sstable->get_end_scn(), tmp_scn))) {
 | 
				
			||||||
@ -3681,7 +3688,7 @@ int ObTablet::update_upper_trans_version(ObLS &ls, bool &is_updated)
 | 
				
			|||||||
              FLOG_INFO("get max_trans_version = 0, maybe all the trans have been rollbacked", K(ret), K(ls_id), K(tablet_id),
 | 
					              FLOG_INFO("get max_trans_version = 0, maybe all the trans have been rollbacked", K(ret), K(ls_id), K(tablet_id),
 | 
				
			||||||
                  K(max_trans_version), KPC(sstable));
 | 
					                  K(max_trans_version), KPC(sstable));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (OB_FAIL(sstable->set_upper_trans_version(max_trans_version))) {
 | 
					            if (OB_FAIL(sstable->set_upper_trans_version(max_trans_version, false/*force_update*/))) {
 | 
				
			||||||
              LOG_WARN("failed to set_upper_trans_version", K(ret), KPC(sstable));
 | 
					              LOG_WARN("failed to set_upper_trans_version", K(ret), KPC(sstable));
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
              is_updated = true;
 | 
					              is_updated = true;
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user