Example #1
0
/*
 * This routine is called once for each pmFetch(3) operation, so is a
 * good place to do once-per-fetch functions, such as value caching or
 * instance domain evaluation.
 */
static int
pmda_ctdb_fetch(int numpmid, pmID pmidlist[], pmResult **resp, pmdaExt *pmda)
{
	int ret;
	TDB_DATA data;
	int32_t res;
	struct timeval ctdb_timeout;

	if (ctdb == NULL) {
		fprintf(stderr, "attempting reconnect to ctdbd\n");
		ret = pmda_ctdb_daemon_connect();
		if (ret < 0) {
			fprintf(stderr, "reconnect failed\n");
			return PM_ERR_VALUE;
		}
	}

	ctdb_timeout = timeval_current_ofs(1, 0);
	ret = ctdb_control(ctdb, ctdb->pnn, 0,
			   CTDB_CONTROL_STATISTICS, 0, tdb_null,
			   ctdb, &data, &res, &ctdb_timeout, NULL);

	if (ret != 0 || res != 0) {
		fprintf(stderr, "ctdb control for statistics failed, reconnecting\n");
		pmda_ctdb_daemon_disconnect();
		ret = PM_ERR_VALUE;
		goto err_out;
	}

	stats = (struct ctdb_statistics *)data.dptr;

	if (data.dsize != sizeof(struct ctdb_statistics)) {
		fprintf(stderr, "incorrect statistics size %zu - not %zu\n",
			data.dsize, sizeof(struct ctdb_statistics));
		ret = PM_ERR_VALUE;
		goto err_stats;
	}

	ret = pmdaFetch(numpmid, pmidlist, resp, pmda);

err_stats:
	talloc_free(stats);
err_out:
	return ret;
}
Example #2
0
static void store_records(struct ctdb_context *ctdb, struct event_context *ev)
{
    TDB_DATA key, data;
    struct ctdb_db_context *ctdb_db;
    TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
    int ret;
    struct ctdb_record_handle *h;
    uint32_t i=0;

    ctdb_db = ctdb_db_handle(ctdb, "test.tdb");

    srandom(time(NULL) ^ getpid());

    start_timer();

    printf("working with %d records\n", num_records);
    while (1) {
        unsigned r = random() % num_records;
        key.dptr = (uint8_t *)&r;
        key.dsize = sizeof(r);

        h = ctdb_fetch_lock(ctdb_db, tmp_ctx, key, &data);
        if (h == NULL) {
            printf("Failed to fetch record '%s' on node %d\n",
                   (const char *)key.dptr, ctdb_get_pnn(ctdb));
            talloc_free(tmp_ctx);
            return;
        }

        if (random() % 100 < delete_pct) {
            data.dptr = NULL;
            data.dsize = 0;
        } else {
            data.dptr = talloc_zero_size(h, data.dsize + sizeof(r));
            data.dsize += sizeof(r);
        }

        ret = ctdb_record_store(h, data);
        if (ret != 0) {
            printf("Failed to store record\n");
        }

        if (data.dptr == NULL && data.dsize == 0) {
            struct ctdb_control_schedule_for_deletion *dd;
            TDB_DATA indata;
            int32_t status;

            indata.dsize = offsetof(struct ctdb_control_schedule_for_deletion, key) + key.dsize;
            indata.dptr = talloc_zero_array(ctdb, uint8_t, indata.dsize);
            if (indata.dptr == NULL) {
                printf("out of memory\n");
                exit(1);
            }
            dd = (struct ctdb_control_schedule_for_deletion *)(void *)indata.dptr;
            dd->db_id = ctdb_db->db_id;
            dd->hdr = *ctdb_header_from_record_handle(h);
            dd->keylen = key.dsize;
            memcpy(dd->key, key.dptr, key.dsize);

            ret = ctdb_control(ctdb,
                               CTDB_CURRENT_NODE,
                               ctdb_db->db_id,
                               CTDB_CONTROL_SCHEDULE_FOR_DELETION,
                               0, /* flags */
                               indata,
                               NULL, /* mem_ctx */
                               NULL, /* outdata */
                               &status,
                               NULL, /* timeout : NULL == wait forever */
                               NULL); /* error message */

            talloc_free(indata.dptr);

            if (ret != 0 || status != 0) {
                DEBUG(DEBUG_ERR, (__location__ " Error sending "
                                  "SCHEDULE_FOR_DELETION "
                                  "control.\n"));
            }
        }

        talloc_free(h);

        if (i % 1000 == 0) {
            printf("%7.0f recs/second   %u total\r", 1000.0 / end_timer(), i);
            fflush(stdout);
            start_timer();
        }
        i++;
    }

    talloc_free(tmp_ctx);
}