mirror of
https://github.com/haiwen/seafile.git
synced 2025-01-09 04:17:30 +08:00
Use same connection when get file blocks
This commit is contained in:
parent
e96a93c6e0
commit
547bcdaa36
@ -243,6 +243,7 @@ checkout_blk_error:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The user_conn needs to be returned before free aux.
|
||||||
void
|
void
|
||||||
free_checkout_block_aux (CheckoutBlockAux *aux)
|
free_checkout_block_aux (CheckoutBlockAux *aux)
|
||||||
{
|
{
|
||||||
|
@ -180,6 +180,7 @@ struct _CheckoutBlockAux {
|
|||||||
const char *token;
|
const char *token;
|
||||||
gboolean use_fileserver_port;
|
gboolean use_fileserver_port;
|
||||||
void *task;
|
void *task;
|
||||||
|
void *user_conn;
|
||||||
};
|
};
|
||||||
typedef struct _CheckoutBlockAux CheckoutBlockAux;
|
typedef struct _CheckoutBlockAux CheckoutBlockAux;
|
||||||
|
|
||||||
|
@ -274,6 +274,22 @@ connection_pool_return_connection (ConnectionPool *pool, Connection *conn)
|
|||||||
pthread_mutex_unlock (&pool->lock);
|
pthread_mutex_unlock (&pool->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
http_tx_manager_return_connection (const char *host, void *conn)
|
||||||
|
{
|
||||||
|
HttpTxPriv *priv = seaf->http_tx_mgr->priv;
|
||||||
|
ConnectionPool *pool;
|
||||||
|
|
||||||
|
pool = find_connection_pool (priv, host);
|
||||||
|
if (!pool) {
|
||||||
|
seaf_warning ("Failed to create connection pool for host %s.\n", host);
|
||||||
|
connection_free (conn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_pool_return_connection (pool, conn);
|
||||||
|
}
|
||||||
|
|
||||||
#define LOCKED_ERROR_PATTERN "File (.+) is locked"
|
#define LOCKED_ERROR_PATTERN "File (.+) is locked"
|
||||||
#define FOLDER_PERM_ERROR_PATTERN "Update to path (.+) is not allowed by folder permission settings"
|
#define FOLDER_PERM_ERROR_PATTERN "Update to path (.+) is not allowed by folder permission settings"
|
||||||
#define TOO_MANY_FILES_ERROR_PATTERN "Too many files in library"
|
#define TOO_MANY_FILES_ERROR_PATTERN "Too many files in library"
|
||||||
@ -4755,7 +4771,8 @@ http_tx_manager_get_block (HttpTxManager *manager,
|
|||||||
gboolean use_fileserver_port,
|
gboolean use_fileserver_port,
|
||||||
int *error_id,
|
int *error_id,
|
||||||
HttpRecvCallback get_blk_cb,
|
HttpRecvCallback get_blk_cb,
|
||||||
void *user_data)
|
void *user_data,
|
||||||
|
void **user_conn)
|
||||||
{
|
{
|
||||||
HttpTxPriv *priv = seaf->http_tx_mgr->priv;
|
HttpTxPriv *priv = seaf->http_tx_mgr->priv;
|
||||||
ConnectionPool *pool;
|
ConnectionPool *pool;
|
||||||
@ -4765,6 +4782,7 @@ http_tx_manager_get_block (HttpTxManager *manager,
|
|||||||
int status;
|
int status;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (*user_conn == NULL) {
|
||||||
pool = find_connection_pool (priv, host);
|
pool = find_connection_pool (priv, host);
|
||||||
if (!pool) {
|
if (!pool) {
|
||||||
*error_id = SYNC_ERROR_ID_NOT_ENOUGH_MEMORY;
|
*error_id = SYNC_ERROR_ID_NOT_ENOUGH_MEMORY;
|
||||||
@ -4778,6 +4796,10 @@ http_tx_manager_get_block (HttpTxManager *manager,
|
|||||||
seaf_warning ("Failed to get connection to host %s.\n", host);
|
seaf_warning ("Failed to get connection to host %s.\n", host);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
*user_conn = conn;
|
||||||
|
}
|
||||||
|
|
||||||
|
conn = *user_conn;
|
||||||
|
|
||||||
curl = conn->curl;
|
curl = conn->curl;
|
||||||
|
|
||||||
@ -4806,7 +4828,6 @@ http_tx_manager_get_block (HttpTxManager *manager,
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
g_free (url);
|
g_free (url);
|
||||||
connection_pool_return_connection (pool, conn);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,6 +115,9 @@ http_tx_manager_new (struct _SeafileSession *seaf);
|
|||||||
int
|
int
|
||||||
http_tx_manager_start (HttpTxManager *mgr);
|
http_tx_manager_start (HttpTxManager *mgr);
|
||||||
|
|
||||||
|
void
|
||||||
|
http_tx_manager_return_connection (const char *host, void *conn);
|
||||||
|
|
||||||
int
|
int
|
||||||
http_tx_manager_add_download (HttpTxManager *manager,
|
http_tx_manager_add_download (HttpTxManager *manager,
|
||||||
const char *repo_id,
|
const char *repo_id,
|
||||||
@ -330,7 +333,8 @@ http_tx_manager_get_block (HttpTxManager *manager,
|
|||||||
gboolean use_fileserver_port,
|
gboolean use_fileserver_port,
|
||||||
int *error_id,
|
int *error_id,
|
||||||
HttpRecvCallback get_blk_cb,
|
HttpRecvCallback get_blk_cb,
|
||||||
void *user_data);
|
void *user_data,
|
||||||
|
void **user_conn);
|
||||||
|
|
||||||
int
|
int
|
||||||
http_tx_manager_get_file_block_map (HttpTxManager *manager,
|
http_tx_manager_get_file_block_map (HttpTxManager *manager,
|
||||||
|
@ -4837,7 +4837,7 @@ checkout_block_cb (const char *repo_id, const char *block_id, int fd, SeafileCry
|
|||||||
block_id, user_data->host,
|
block_id, user_data->host,
|
||||||
user_data->token, user_data->use_fileserver_port,
|
user_data->token, user_data->use_fileserver_port,
|
||||||
&error_id,
|
&error_id,
|
||||||
update_block_cb, &aux) < 0) {
|
update_block_cb, &aux, &user_data->user_conn) < 0) {
|
||||||
if (task->state == HTTP_TASK_STATE_CANCELED) {
|
if (task->state == HTTP_TASK_STATE_CANCELED) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto out;
|
goto out;
|
||||||
@ -5165,9 +5165,13 @@ checkout_file_http (FileTxData *data,
|
|||||||
seaf_filelock_manager_lock_wt_file (seaf->filelock_mgr,
|
seaf_filelock_manager_lock_wt_file (seaf->filelock_mgr,
|
||||||
repo_id, de->name);
|
repo_id, de->name);
|
||||||
|
|
||||||
|
if (aux->user_conn)
|
||||||
|
http_tx_manager_return_connection (aux->host, aux->user_conn);
|
||||||
free_checkout_block_aux (aux);
|
free_checkout_block_aux (aux);
|
||||||
return error_id;
|
return error_id;
|
||||||
}
|
}
|
||||||
|
if (aux->user_conn)
|
||||||
|
http_tx_manager_return_connection (aux->host, aux->user_conn);
|
||||||
free_checkout_block_aux (aux);
|
free_checkout_block_aux (aux);
|
||||||
|
|
||||||
if (locked_on_server)
|
if (locked_on_server)
|
||||||
|
@ -2053,6 +2053,8 @@ check_locked_files (void *vdata)
|
|||||||
if (success)
|
if (success)
|
||||||
g_hash_table_iter_remove (&iter);
|
g_hash_table_iter_remove (&iter);
|
||||||
}
|
}
|
||||||
|
if (aux->user_conn)
|
||||||
|
http_tx_manager_return_connection (aux->host, aux->user_conn);
|
||||||
free_checkout_block_aux (aux);
|
free_checkout_block_aux (aux);
|
||||||
|
|
||||||
discard_index (&istate);
|
discard_index (&istate);
|
||||||
|
Loading…
Reference in New Issue
Block a user