コード例 #1
0
ファイル: seaf-test.c プロジェクト: 2bj/seafile
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;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: block-tx-server.c プロジェクト: HenryChenV/seafile
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;
}