[SCM] CTDB repository - branch 1.2 updated - ctdb-1.0.114-272-g1d33782
Ronnie Sahlberg
sahlberg at samba.org
Mon Aug 23 22:01:24 MDT 2010
The branch, 1.2 has been updated
via 1d33782334f83aa768d6effc5fa207a52cd29177 (commit)
via 661fed9055ffd20a75b15e243e52ef70da4c6b59 (commit)
via 134c313a959adab9e45e314c10a74c3b8c2f5a9a (commit)
via 2e152bb932655170530a3c5357edfa339b33c896 (commit)
from d59920238ffacc71b338c6f52b22323fb1c977bf (commit)
http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=1.2
- Log -----------------------------------------------------------------
commit 1d33782334f83aa768d6effc5fa207a52cd29177
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Aug 24 13:55:38 2010 +1000
add a command to write a record to a persistent database
"ctdb pstore <db> <key> <file containing possibly binary data>"
commit 661fed9055ffd20a75b15e243e52ef70da4c6b59
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Aug 24 13:35:33 2010 +1000
get rid of two compiler warnings
commit 134c313a959adab9e45e314c10a74c3b8c2f5a9a
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Tue Aug 24 13:34:09 2010 +1000
Add a command "ctdb pfetch <db> <record>" to read a record from
a persistent database.
commit 2e152bb932655170530a3c5357edfa339b33c896
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Mon Aug 23 16:10:17 2010 +1000
bump to -2 after fixing the specfile bug with wrong dependencies
-----------------------------------------------------------------------
Summary of changes:
packaging/RPM/ctdb.spec.in | 2 +-
tools/ctdb.c | 172 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 171 insertions(+), 3 deletions(-)
Changeset truncated at 500 lines:
diff --git a/packaging/RPM/ctdb.spec.in b/packaging/RPM/ctdb.spec.in
index 782dea2..9c23a13 100644
--- a/packaging/RPM/ctdb.spec.in
+++ b/packaging/RPM/ctdb.spec.in
@@ -4,7 +4,7 @@ Summary: Clustered TDB
Vendor: Samba Team
Packager: Samba Team <samba at samba.org>
Version: 1.2
-Release: 1GITHASH
+Release: 2GITHASH
Epoch: 0
License: GNU GPL version 3
Group: System Environment/Daemons
diff --git a/tools/ctdb.c b/tools/ctdb.c
index b465615..37bb557 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -2818,6 +2818,172 @@ static int control_catdb(struct ctdb_context *ctdb, int argc, const char **argv)
}
+/*
+ fetch a record from a persistent database
+ */
+static int control_pfetch(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+ const char *db_name;
+ struct ctdb_db_context *ctdb_db;
+ TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
+ struct ctdb_transaction_handle *h;
+ TDB_DATA key, data;
+ int ret;
+
+ if (argc < 2) {
+ talloc_free(tmp_ctx);
+ usage();
+ }
+
+ db_name = argv[0];
+
+
+ if (db_exists(ctdb, db_name)) {
+ DEBUG(DEBUG_ERR,("Database '%s' does not exist\n", db_name));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ ctdb_db = ctdb_attach(ctdb, db_name, true, 0);
+
+ if (ctdb_db == NULL) {
+ DEBUG(DEBUG_ERR,("Unable to attach to database '%s'\n", db_name));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ h = ctdb_transaction_start(ctdb_db, tmp_ctx);
+ if (h == NULL) {
+ DEBUG(DEBUG_ERR,("Failed to start transaction on database %s\n", db_name));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ key.dptr = discard_const(argv[1]);
+ key.dsize = strlen(argv[1]);
+ ret = ctdb_transaction_fetch(h, tmp_ctx, key, &data);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR,("Failed to fetch record\n"));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ if (data.dsize == 0 || data.dptr == NULL) {
+ DEBUG(DEBUG_ERR,("Record is empty\n"));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ fwrite(data.dptr, data.dsize, 1, stdout);
+
+ /* abort the transaction */
+ talloc_free(h);
+
+
+ talloc_free(tmp_ctx);
+ return 0;
+}
+
+/*
+ write a record to a persistent database
+ */
+static int control_pstore(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+ const char *db_name;
+ struct ctdb_db_context *ctdb_db;
+ TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
+ struct ctdb_transaction_handle *h;
+ struct stat st;
+ TDB_DATA key, data;
+ int fd, ret;
+
+ if (argc < 3) {
+ talloc_free(tmp_ctx);
+ usage();
+ }
+
+ fd = open(argv[2], O_RDONLY);
+ if (fd == -1) {
+ DEBUG(DEBUG_ERR,("Failed to open file containing record data : %s %s\n", argv[2], strerror(errno)));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ ret = fstat(fd, &st);
+ if (ret == -1) {
+ DEBUG(DEBUG_ERR,("fstat of file %s failed: %s\n", argv[2], strerror(errno)));
+ close(fd);
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ if (!S_ISREG(st.st_mode)) {
+ DEBUG(DEBUG_ERR,("Not a regular file %s\n", argv[2]));
+ close(fd);
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ data.dsize = st.st_size;
+ if (data.dsize == 0) {
+ data.dptr = NULL;
+ } else {
+ data.dptr = talloc_size(tmp_ctx, data.dsize);
+ if (data.dptr == NULL) {
+ DEBUG(DEBUG_ERR,("Failed to talloc %d of memory to store record data\n", (int)data.dsize));
+ close(fd);
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+ ret = read(fd, data.dptr, data.dsize);
+ if (ret != data.dsize) {
+ DEBUG(DEBUG_ERR,("Failed to read %d bytes of record data\n", (int)data.dsize));
+ close(fd);
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+ }
+ close(fd);
+
+
+ db_name = argv[0];
+
+ ctdb_db = ctdb_attach(ctdb, db_name, true, 0);
+
+ if (ctdb_db == NULL) {
+ DEBUG(DEBUG_ERR,("Unable to attach to database '%s'\n", db_name));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ h = ctdb_transaction_start(ctdb_db, tmp_ctx);
+ if (h == NULL) {
+ DEBUG(DEBUG_ERR,("Failed to start transaction on database %s\n", db_name));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ key.dptr = discard_const(argv[1]);
+ key.dsize = strlen(argv[1]);
+ ret = ctdb_transaction_store(h, key, data);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR,("Failed to store record\n"));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+ ret = ctdb_transaction_commit(h);
+ if (ret != 0) {
+ DEBUG(DEBUG_ERR,("Failed to commit transaction\n"));
+ talloc_free(tmp_ctx);
+ return -1;
+ }
+
+
+ talloc_free(tmp_ctx);
+ return 0;
+}
+
static void log_handler(struct ctdb_context *ctdb, uint64_t srvid,
TDB_DATA data, void *private_data)
{
@@ -3708,9 +3874,9 @@ static int control_restoredb(struct ctdb_context *ctdb, int argc, const char **a
return -1;
}
- dbname = dbhdr.name;
+ dbname = discard_const(dbhdr.name);
if (argc == 2) {
- dbname = argv[1];
+ dbname = discard_const(argv[1]);
}
outdata.dsize = dbhdr.size;
@@ -4493,6 +4659,8 @@ static const struct {
{ "msglisten", control_msglisten, false, false, "Listen on a srvid port for messages", "<msg srvid>"},
{ "msgsend", control_msgsend, false, false, "Send a message to srvid", "<srvid> <message>"},
{ "sync", control_ipreallocate, true, false, "wait until ctdbd has synced all state changes" },
+ { "pfetch", control_pfetch, true, false, "fetch a record from a persistent database", "<db> <key>" },
+ { "pstore", control_pstore, true, false, "write a record to a persistent database", "<db> <key> <file containing record>" },
};
/*
--
CTDB repository
More information about the samba-cvs
mailing list