From 16dd4be348f575574d5f186ad7c8ab1fd0b925aa Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 4 Aug 2019 12:10:03 +0200 Subject: [PATCH 1/5] tdb: Rename tdb_oob() to tdb_notrans_oob() tdb_oob() will become a public function encapsulating the pointer dereferences. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit 885ba572efaac6c20388b8e119315c837e8f5236) --- lib/tdb/common/io.c | 6 +++--- lib/tdb/test/run-3G-file.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index df4601761597..06492b1407d7 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -136,8 +136,8 @@ static int tdb_fstat(struct tdb_context *tdb, struct stat *buf) see if the database has been expanded by someone else and expand if necessary */ -static int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, - int probe) +static int tdb_notrans_oob( + struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) { struct stat st; if (len + off < len) { @@ -782,7 +782,7 @@ static const struct tdb_methods io_methods = { tdb_read, tdb_write, tdb_next_hash_chain, - tdb_oob, + tdb_notrans_oob, tdb_expand_file, }; diff --git a/lib/tdb/test/run-3G-file.c b/lib/tdb/test/run-3G-file.c index 748c972284a7..79e291b294e8 100644 --- a/lib/tdb/test/run-3G-file.c +++ b/lib/tdb/test/run-3G-file.c @@ -48,7 +48,7 @@ static const struct tdb_methods large_io_methods = { tdb_read, tdb_write, tdb_next_hash_chain, - tdb_oob, + tdb_notrans_oob, tdb_expand_file_sparse }; -- 2.17.1 From 27d85b66edec644ce9f00f0b6dee0ce39a1ae1b5 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 4 Aug 2019 12:15:14 +0200 Subject: [PATCH 2/5] tdb: Introduce tdb_oob() Initially just encapsulate the pointer dereferences Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit 5a388453e0cb038fa3ed5fb46f972470f7793566) --- lib/tdb/common/check.c | 6 +++--- lib/tdb/common/freelist.c | 2 +- lib/tdb/common/io.c | 22 ++++++++++++++-------- lib/tdb/common/open.c | 6 +++--- lib/tdb/common/rescue.c | 4 ++-- lib/tdb/common/tdb_private.h | 1 + lib/tdb/common/transaction.c | 2 +- lib/tdb/common/traverse.c | 3 +-- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/lib/tdb/common/check.c b/lib/tdb/common/check.c index 3a5c8b8ba949..d7741f6b2f9d 100644 --- a/lib/tdb/common/check.c +++ b/lib/tdb/common/check.c @@ -94,7 +94,7 @@ static bool tdb_check_record(struct tdb_context *tdb, off, rec->next)); goto corrupt; } - if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0)) + if (tdb_oob(tdb, rec->next, sizeof(*rec), 0)) goto corrupt; /* Check rec_len: similar to rec->next, implies next record. */ @@ -112,7 +112,7 @@ static bool tdb_check_record(struct tdb_context *tdb, goto corrupt; } /* OOB allows "right at the end" access, so this works for last rec. */ - if (tdb->methods->tdb_oob(tdb, off, sizeof(*rec)+rec->rec_len, 0)) + if (tdb_oob(tdb, off, sizeof(*rec)+rec->rec_len, 0)) goto corrupt; /* Check tailer. */ @@ -362,7 +362,7 @@ _PUBLIC_ int tdb_check(struct tdb_context *tdb, } /* Make sure we know true size of the underlying file. */ - tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1); + tdb_oob(tdb, tdb->map_size, 1, 1); /* Header must be OK: also gets us the recovery ptr, if any. */ if (!tdb_check_header(tdb, &recovery_start)) diff --git a/lib/tdb/common/freelist.c b/lib/tdb/common/freelist.c index 37a4c168533b..046c747cf9b3 100644 --- a/lib/tdb/common/freelist.c +++ b/lib/tdb/common/freelist.c @@ -50,7 +50,7 @@ int tdb_rec_free_read(struct tdb_context *tdb, tdb_off_t off, struct tdb_record rec->magic, off)); return -1; } - if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0) != 0) + if (tdb_oob(tdb, rec->next, sizeof(*rec), 0) != 0) return -1; return 0; } diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index 06492b1407d7..f3ea7bf9856c 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -216,7 +216,7 @@ static int tdb_write(struct tdb_context *tdb, tdb_off_t off, return -1; } - if (tdb->methods->tdb_oob(tdb, off, len, 0) != 0) + if (tdb_oob(tdb, off, len, 0) != 0) return -1; if (tdb->map_ptr) { @@ -271,7 +271,7 @@ void *tdb_convert(void *buf, uint32_t size) static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf, tdb_len_t len, int cv) { - if (tdb->methods->tdb_oob(tdb, off, len, 0) != 0) { + if (tdb_oob(tdb, off, len, 0) != 0) { return -1; } @@ -596,7 +596,7 @@ int tdb_expand(struct tdb_context *tdb, tdb_off_t size) } /* must know about any previous expansions by another process */ - tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1); + tdb_oob(tdb, tdb->map_size, 1, 1); /* * Note: that we don't care about tdb->hdr_ofs != 0 here @@ -662,6 +662,12 @@ int tdb_expand(struct tdb_context *tdb, tdb_off_t size) return -1; } +int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) +{ + int ret = tdb->methods->tdb_oob(tdb, off, len, probe); + return ret; +} + /* read/write a tdb_off_t */ int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d) { @@ -714,7 +720,7 @@ int tdb_parse_data(struct tdb_context *tdb, TDB_DATA key, * Optimize by avoiding the malloc/memcpy/free, point the * parser directly at the mmap area. */ - if (tdb->methods->tdb_oob(tdb, offset, len, 0) != 0) { + if (tdb_oob(tdb, offset, len, 0) != 0) { return -1; } data.dptr = offset + (unsigned char *)tdb->map_ptr; @@ -756,20 +762,20 @@ int tdb_rec_read(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *r return -1; } - ret = tdb->methods->tdb_oob(tdb, offset, rec->key_len, 1); + ret = tdb_oob(tdb, offset, rec->key_len, 1); if (ret == -1) { return -1; } - ret = tdb->methods->tdb_oob(tdb, offset, rec->data_len, 1); + ret = tdb_oob(tdb, offset, rec->data_len, 1); if (ret == -1) { return -1; } - ret = tdb->methods->tdb_oob(tdb, offset, rec->rec_len, 1); + ret = tdb_oob(tdb, offset, rec->rec_len, 1); if (ret == -1) { return -1; } - return tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0); + return tdb_oob(tdb, rec->next, sizeof(*rec), 0); } int tdb_rec_write(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *rec) diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c index dd5783ef8bc9..f7f65b0e2379 100644 --- a/lib/tdb/common/open.c +++ b/lib/tdb/common/open.c @@ -655,7 +655,7 @@ _PUBLIC_ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int td * As this skips tdb->hdr_ofs. */ tdb->map_size = 0; - ret = tdb->methods->tdb_oob(tdb, 0, 1, 0); + ret = tdb_oob(tdb, 0, 1, 0); if (ret == -1) { errno = EIO; goto fail; @@ -677,7 +677,7 @@ _PUBLIC_ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int td goto fail; } - ret = tdb->methods->tdb_oob(tdb, FREELIST_TOP, 4*tdb->hash_size, 1); + ret = tdb_oob(tdb, FREELIST_TOP, 4*tdb->hash_size, 1); if (ret == -1) { TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: " "hash size %"PRIu32" does not fit\n", tdb->hash_size)); @@ -895,7 +895,7 @@ static int tdb_reopen_internal(struct tdb_context *tdb, bool active_lock) * As this skips tdb->hdr_ofs. */ tdb->map_size = 0; - if (tdb->methods->tdb_oob(tdb, 0, 1, 0) != 0) { + if (tdb_oob(tdb, 0, 1, 0) != 0) { goto fail; } #endif /* fake pread or pwrite */ diff --git a/lib/tdb/common/rescue.c b/lib/tdb/common/rescue.c index e608db41deab..7a85ebc9311c 100644 --- a/lib/tdb/common/rescue.c +++ b/lib/tdb/common/rescue.c @@ -60,7 +60,7 @@ static bool looks_like_valid_record(struct tdb_context *tdb, if (rec->next > 0 && rec->next < TDB_DATA_START(tdb->hash_size)) return false; - if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 1)) + if (tdb_oob(tdb, rec->next, sizeof(*rec), 1)) return false; key->dsize = rec->key_len; @@ -228,7 +228,7 @@ _PUBLIC_ int tdb_rescue(struct tdb_context *tdb, } /* Make sure we know true size of the underlying file. */ - tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1); + tdb_oob(tdb, tdb->map_size, 1, 1); /* Suppress logging, since we anticipate errors. */ tdb->log.log_fn = logging_suppressed; diff --git a/lib/tdb/common/tdb_private.h b/lib/tdb/common/tdb_private.h index 42aaac62f59c..2bed8200f94a 100644 --- a/lib/tdb/common/tdb_private.h +++ b/lib/tdb/common/tdb_private.h @@ -304,6 +304,7 @@ void *tdb_convert(void *buf, uint32_t size); int tdb_free(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *rec); tdb_off_t tdb_allocate(struct tdb_context *tdb, int hash, tdb_len_t length, struct tdb_record *rec); +int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe); int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d); int tdb_ofs_write(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d); int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off); diff --git a/lib/tdb/common/transaction.c b/lib/tdb/common/transaction.c index e9b0b26ea59b..b22624820d7e 100644 --- a/lib/tdb/common/transaction.c +++ b/lib/tdb/common/transaction.c @@ -524,7 +524,7 @@ static int _tdb_transaction_start(struct tdb_context *tdb, /* make sure we know about any file expansions already done by anyone else */ - tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1); + tdb_oob(tdb, tdb->map_size, 1, 1); tdb->transaction->old_map_size = tdb->map_size; /* finally hook the io methods, replacing them with diff --git a/lib/tdb/common/traverse.c b/lib/tdb/common/traverse.c index 54a69dc8d03f..d69e7dff2854 100644 --- a/lib/tdb/common/traverse.c +++ b/lib/tdb/common/traverse.c @@ -453,8 +453,7 @@ _PUBLIC_ int tdb_traverse_chain(struct tdb_context *tdb, if ((tdb->transaction == NULL) && (tdb->map_ptr != NULL)) { - ret = tdb->methods->tdb_oob( - tdb, key_ofs, full_len, 0); + ret = tdb_oob(tdb, key_ofs, full_len, 0); if (ret == -1) { goto fail; } -- 2.17.1 From 3bccfe4ff18912f2af68056d706654937338369e Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 4 Aug 2019 12:18:19 +0200 Subject: [PATCH 3/5] tdb: Speed up tdb_oob() This is common between both implementations of tdb_oob(). It's faster if we don't have to dereference function pointers. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit 897bffa8166f643eb9063a848bb0c02455663317) --- lib/tdb/common/io.c | 13 ++++++++++++- lib/tdb/common/transaction.c | 5 +++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index f3ea7bf9856c..28e808143a2d 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -150,6 +150,11 @@ static int tdb_notrans_oob( return -1; } + /* + * This duplicates functionality from tdb_oob(). Don't remove: + * we still have direct callers of tdb->methods->tdb_oob() + * inside transaction.c. + */ if (off + len <= tdb->map_size) return 0; if (tdb->flags & TDB_INTERNAL) { @@ -664,7 +669,13 @@ int tdb_expand(struct tdb_context *tdb, tdb_off_t size) int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) { - int ret = tdb->methods->tdb_oob(tdb, off, len, probe); + int ret; + + if (likely((off + len >= off) && (off + len <= tdb->map_size))) { + return 0; + } + + ret = tdb->methods->tdb_oob(tdb, off, len, probe); return ret; } diff --git a/lib/tdb/common/transaction.c b/lib/tdb/common/transaction.c index b22624820d7e..4f8d1f8cdccc 100644 --- a/lib/tdb/common/transaction.c +++ b/lib/tdb/common/transaction.c @@ -378,6 +378,11 @@ static void transaction_next_hash_chain(struct tdb_context *tdb, uint32_t *chain static int transaction_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) { + /* + * This duplicates functionality from tdb_oob(). Don't remove: + * we still have direct callers of tdb->methods->tdb_oob() + * inside transaction.c. + */ if (off + len >= off && off + len <= tdb->map_size) { return 0; } -- 2.17.1 From 8bedf3402292a39f034c5b4dc13dddf7f280223f Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sun, 4 Aug 2019 18:26:05 +0200 Subject: [PATCH 4/5] tdb: Inline the common part of tdb_oob When you set in tdbtorture.c to make it more similar to locking.tdb use, bin/tdbtorture -m -n 1 -l 100000 -s becomes twice as fast. This is a pretty extreme case, but all other tests that I did improve significantly as well. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison (cherry picked from commit f5735e2c666a5a494131c1d25f7ba5c7fbeae923) --- lib/tdb/common/io.c | 10 ++-------- lib/tdb/common/tdb_private.h | 14 +++++++++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/tdb/common/io.c b/lib/tdb/common/io.c index 28e808143a2d..0de0dabd8276 100644 --- a/lib/tdb/common/io.c +++ b/lib/tdb/common/io.c @@ -667,15 +667,9 @@ int tdb_expand(struct tdb_context *tdb, tdb_off_t size) return -1; } -int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) +int _tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) { - int ret; - - if (likely((off + len >= off) && (off + len <= tdb->map_size))) { - return 0; - } - - ret = tdb->methods->tdb_oob(tdb, off, len, probe); + int ret = tdb->methods->tdb_oob(tdb, off, len, probe); return ret; } diff --git a/lib/tdb/common/tdb_private.h b/lib/tdb/common/tdb_private.h index 2bed8200f94a..297904342117 100644 --- a/lib/tdb/common/tdb_private.h +++ b/lib/tdb/common/tdb_private.h @@ -304,7 +304,19 @@ void *tdb_convert(void *buf, uint32_t size); int tdb_free(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *rec); tdb_off_t tdb_allocate(struct tdb_context *tdb, int hash, tdb_len_t length, struct tdb_record *rec); -int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe); + +int _tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe); + +static inline int tdb_oob( + struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe) +{ + if (likely((off + len >= off) && (off + len <= tdb->map_size))) { + return 0; + } + return _tdb_oob(tdb, off, len, probe); +} + + int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d); int tdb_ofs_write(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d); int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off); -- 2.17.1 From 4fa21724f8d183b6ad40b789b049bb9f2ad445da Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 20 Aug 2019 14:55:27 +0200 Subject: [PATCH 5/5] tdb: Release tdb 1.4.2 * Build fixes * Improve the performance by inlining the tdb_oob() checks Signed-off-by: Stefan Metzmacher Reviewed-by: Ralph Boehme Autobuild-User(master): Stefan Metzmacher Autobuild-Date(master): Tue Aug 20 14:45:41 UTC 2019 on sn-devel-184 (cherry picked from commit 60cba7b3a17104da1543d59609f50c6638880dd1) --- lib/tdb/ABI/tdb-1.4.2.sigs | 73 ++++++++++++++++++++++++++++++++++++++ lib/tdb/wscript | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 lib/tdb/ABI/tdb-1.4.2.sigs diff --git a/lib/tdb/ABI/tdb-1.4.2.sigs b/lib/tdb/ABI/tdb-1.4.2.sigs new file mode 100644 index 000000000000..e2b0427c3475 --- /dev/null +++ b/lib/tdb/ABI/tdb-1.4.2.sigs @@ -0,0 +1,73 @@ +tdb_add_flags: void (struct tdb_context *, unsigned int) +tdb_append: int (struct tdb_context *, TDB_DATA, TDB_DATA) +tdb_chainlock: int (struct tdb_context *, TDB_DATA) +tdb_chainlock_mark: int (struct tdb_context *, TDB_DATA) +tdb_chainlock_nonblock: int (struct tdb_context *, TDB_DATA) +tdb_chainlock_read: int (struct tdb_context *, TDB_DATA) +tdb_chainlock_read_nonblock: int (struct tdb_context *, TDB_DATA) +tdb_chainlock_unmark: int (struct tdb_context *, TDB_DATA) +tdb_chainunlock: int (struct tdb_context *, TDB_DATA) +tdb_chainunlock_read: int (struct tdb_context *, TDB_DATA) +tdb_check: int (struct tdb_context *, int (*)(TDB_DATA, TDB_DATA, void *), void *) +tdb_close: int (struct tdb_context *) +tdb_delete: int (struct tdb_context *, TDB_DATA) +tdb_dump_all: void (struct tdb_context *) +tdb_enable_seqnum: void (struct tdb_context *) +tdb_error: enum TDB_ERROR (struct tdb_context *) +tdb_errorstr: const char *(struct tdb_context *) +tdb_exists: int (struct tdb_context *, TDB_DATA) +tdb_fd: int (struct tdb_context *) +tdb_fetch: TDB_DATA (struct tdb_context *, TDB_DATA) +tdb_firstkey: TDB_DATA (struct tdb_context *) +tdb_freelist_size: int (struct tdb_context *) +tdb_get_flags: int (struct tdb_context *) +tdb_get_logging_private: void *(struct tdb_context *) +tdb_get_seqnum: int (struct tdb_context *) +tdb_hash_size: int (struct tdb_context *) +tdb_increment_seqnum_nonblock: void (struct tdb_context *) +tdb_jenkins_hash: unsigned int (TDB_DATA *) +tdb_lock_nonblock: int (struct tdb_context *, int, int) +tdb_lockall: int (struct tdb_context *) +tdb_lockall_mark: int (struct tdb_context *) +tdb_lockall_nonblock: int (struct tdb_context *) +tdb_lockall_read: int (struct tdb_context *) +tdb_lockall_read_nonblock: int (struct tdb_context *) +tdb_lockall_unmark: int (struct tdb_context *) +tdb_log_fn: tdb_log_func (struct tdb_context *) +tdb_map_size: size_t (struct tdb_context *) +tdb_name: const char *(struct tdb_context *) +tdb_nextkey: TDB_DATA (struct tdb_context *, TDB_DATA) +tdb_null: dptr = 0xXXXX, dsize = 0 +tdb_open: struct tdb_context *(const char *, int, int, int, mode_t) +tdb_open_ex: struct tdb_context *(const char *, int, int, int, mode_t, const struct tdb_logging_context *, tdb_hash_func) +tdb_parse_record: int (struct tdb_context *, TDB_DATA, int (*)(TDB_DATA, TDB_DATA, void *), void *) +tdb_printfreelist: int (struct tdb_context *) +tdb_remove_flags: void (struct tdb_context *, unsigned int) +tdb_reopen: int (struct tdb_context *) +tdb_reopen_all: int (int) +tdb_repack: int (struct tdb_context *) +tdb_rescue: int (struct tdb_context *, void (*)(TDB_DATA, TDB_DATA, void *), void *) +tdb_runtime_check_for_robust_mutexes: bool (void) +tdb_set_logging_function: void (struct tdb_context *, const struct tdb_logging_context *) +tdb_set_max_dead: void (struct tdb_context *, int) +tdb_setalarm_sigptr: void (struct tdb_context *, volatile sig_atomic_t *) +tdb_store: int (struct tdb_context *, TDB_DATA, TDB_DATA, int) +tdb_storev: int (struct tdb_context *, TDB_DATA, const TDB_DATA *, int, int) +tdb_summary: char *(struct tdb_context *) +tdb_transaction_active: bool (struct tdb_context *) +tdb_transaction_cancel: int (struct tdb_context *) +tdb_transaction_commit: int (struct tdb_context *) +tdb_transaction_prepare_commit: int (struct tdb_context *) +tdb_transaction_start: int (struct tdb_context *) +tdb_transaction_start_nonblock: int (struct tdb_context *) +tdb_transaction_write_lock_mark: int (struct tdb_context *) +tdb_transaction_write_lock_unmark: int (struct tdb_context *) +tdb_traverse: int (struct tdb_context *, tdb_traverse_func, void *) +tdb_traverse_chain: int (struct tdb_context *, unsigned int, tdb_traverse_func, void *) +tdb_traverse_key_chain: int (struct tdb_context *, TDB_DATA, tdb_traverse_func, void *) +tdb_traverse_read: int (struct tdb_context *, tdb_traverse_func, void *) +tdb_unlock: int (struct tdb_context *, int, int) +tdb_unlockall: int (struct tdb_context *) +tdb_unlockall_read: int (struct tdb_context *) +tdb_validate_freelist: int (struct tdb_context *, int *) +tdb_wipe_all: int (struct tdb_context *) diff --git a/lib/tdb/wscript b/lib/tdb/wscript index ece44f82e337..1ab0e8d334aa 100644 --- a/lib/tdb/wscript +++ b/lib/tdb/wscript @@ -1,7 +1,7 @@ #!/usr/bin/env python APPNAME = 'tdb' -VERSION = '1.4.1' +VERSION = '1.4.2' import sys, os -- 2.17.1