CTDB和SAMBA数据库备份代码分析



recdb_add_traverse

db_open_ctdb
db_open_file

函数调用栈:
db_open
db_open_ctdb // 仅仅是增加 db_ctdb_fetch_locked 回调函数
db_ctdb_fetch_locked
fetch_locked_internal
db_ctdb_store
db_ctdb_ltdb_store
ctdbd_backup : write_data_iov //发送数据

write_data_iov //发送数据
ctdb_read_req

messaging_ctdbd_connection

db_open_ctdb 函数://为了初始化
{
db_ctdb->wtdb = tdb_wrap_open(db_ctdb, db_path, hash_size,
				      lpcfg_tdb_flags(lp_ctx, tdb_flags),
				      O_RDWR, 0);
					  
					  
result->private_data = (void *)db_ctdb;
result->fetch_locked = db_ctdb_fetch_locked; //设置回调函数
result->try_fetch_locked = db_ctdb_try_fetch_locked;
}

fetch_locked 在哪里调用的?	

struct db_record *dbwrap_fetch_locked(struct db_context *db,
				      TALLOC_CTX *mem_ctx,
				      TDB_DATA key)
{
	return dbwrap_fetch_locked_internal(db, mem_ctx, key,
					    db->fetch_locked); //db_ctdb_fetch_locked
}


db_open_ctdb 和 dbwrap_fetch_locked 函数的调用关系?

初始化:
smbXsrv_open_global_init -> db_open_ctdb //初始化函数指针
db_open_ctdb: result->fetch_locked = db_ctdb_fetch_locked;

使用: 
smbd_smb2_create_send-> file_new-> smbXsrv_open_create-> smbXsrv_open_local_fetch_locked-> dbwrap_fetch_locked

db_ctdb_fetch_locked 调用的 fetch_locked_internal :

fetch_locked_internal 函数:里面有db_ctdb_can_use_local_copy 函数和 ctdbd_migrate 函数。如果本地有,则使用本地,否则发起migrate。

问题1:
db_ctdb_can_use_local_hdr 函数里面的 dmaster 从哪里获取的?ltdb_initial_header 函数初始化dmaster为lmaster

dbwrap_fetch_locked 被很多函数调用,如 smbXsrv_open_local_fetch_locked 函数 

//key的产生
static TDB_DATA smbXsrv_open_local_id_to_key(uint32_t id,
					     uint8_t *key_buf)
{
	TDB_DATA key;

	RSIVAL(key_buf, 0, id);

	key = make_tdb_data(key_buf, SMBXSRV_OPEN_LOCAL_TDB_KEY_SIZE);

	return key;
}
 

猜你喜欢

转载自my.oschina.net/itfanr/blog/1627569