static int test_block_manager () { SeafBlockManager *mgr = seaf->block_mgr; char *block_id = "c882e263e9d02c63ca6b61c68508761cbc74c358"; char wr_buf[1024], rd_buf[1024]; BlockHandle *handle; BlockMetadata *md; int n; printf ("\n=== Test block manager\n\n"); memset (wr_buf, 1, sizeof(wr_buf)); handle = seaf_block_manager_open_block (mgr, block_id, BLOCK_WRITE); g_assert (handle != NULL); n = seaf_block_manager_write_block (mgr, handle, wr_buf, sizeof(wr_buf)); g_assert (n == sizeof(wr_buf)); md = seaf_block_manager_stat_block_by_handle (mgr, handle); g_assert (md->size == sizeof(wr_buf)); g_free (md); g_assert (seaf_block_manager_close_block(mgr, handle) == 0); g_assert (seaf_block_manager_commit_block(mgr, handle) == 0); seaf_block_manager_block_handle_free (mgr, handle); handle = seaf_block_manager_open_block (mgr, block_id, BLOCK_READ); g_assert (handle != NULL); n = seaf_block_manager_read_block (mgr, handle, rd_buf, sizeof(rd_buf)); g_assert (n == sizeof(rd_buf)); md = seaf_block_manager_stat_block_by_handle (mgr, handle); g_assert (md->size == sizeof(wr_buf)); g_free (md); g_assert (seaf_block_manager_close_block(mgr, handle) == 0); seaf_block_manager_block_handle_free (mgr, handle); g_assert (memcmp (wr_buf, rd_buf, sizeof(wr_buf)) == 0); md = seaf_block_manager_stat_block (mgr, block_id); g_assert (strcmp (md->id, block_id) == 0); g_assert (md->size == sizeof(wr_buf)); g_free (md); return 0; }
static int save_block_content_cb (char *content, int clen, int end, void *cbarg) { BlockTxClient *client = cbarg; TransferTask *task = client->info->task; int n; n = seaf_block_manager_write_block (seaf->block_mgr, client->block, content, clen); if (n < 0) { seaf_warning ("Failed to write block %s.\n", client->curr_block_id); client->info->result = BLOCK_CLIENT_FAILED; return -1; } /* Update global transferred bytes. */ g_atomic_int_add (&(task->tx_bytes), clen); g_atomic_int_add (&(seaf->sync_mgr->recv_bytes), clen); while (1) { gint recv_bytes = g_atomic_int_get (&(seaf->sync_mgr->recv_bytes)); if (seaf->sync_mgr->download_limit > 0 && recv_bytes > seaf->sync_mgr->download_limit) { G_USLEEP (100000); } else { break; } } if (end) { seaf_block_manager_close_block (seaf->block_mgr, client->block); if (seaf_block_manager_commit_block (seaf->block_mgr, client->block) < 0) { seaf_warning ("Failed to commit block %s.\n", client->curr_block_id); client->info->result = BLOCK_CLIENT_FAILED; return -1; } seaf_block_manager_block_handle_free (seaf->block_mgr, client->block); /* Set this handle to invalid. */ client->block = NULL; seaf_debug ("Get block %s succeeded.\n", client->curr_block_id); if (transfer_next_block (client) < 0) return -1; } return 0; }
static int save_block_content_cb (char *content, int clen, int end, void *cbarg) { BlockTxServer *server = cbarg; int n; n = seaf_block_manager_write_block (seaf->block_mgr, server->block, content, clen); if (n < 0) { seaf_warning ("Failed to write block %s.\n", server->curr_block_id); send_block_response_header (server, STATUS_INTERNAL_SERVER_ERROR); return -1; } if (end) { if (seaf_block_manager_close_block (seaf->block_mgr, server->block) < 0) { seaf_warning ("Failed to close block %s.\n", server->curr_block_id); send_block_response_header (server, STATUS_INTERNAL_SERVER_ERROR); return -1; } if (seaf_block_manager_commit_block (seaf->block_mgr, server->block) < 0) { seaf_warning ("Failed to commit block %s.\n", server->curr_block_id); send_block_response_header (server, STATUS_INTERNAL_SERVER_ERROR); return -1; } seaf_block_manager_block_handle_free (seaf->block_mgr, server->block); /* Set this handle to invalid. */ server->block = NULL; send_block_response_header (server, STATUS_OK); seaf_debug ("Receive block %s done.\n", server->curr_block_id); seaf_debug ("recv_state set to HEADER.\n"); server->recv_state = RECV_STATE_HEADER; } return 0; }