Browse Source

tdb2: log allocation failures in tdb1 backend.

The TDB2 tests are stricter about this; they want every error logged.
Rusty Russell 14 years ago
parent
commit
670ba98f74
4 changed files with 30 additions and 12 deletions
  1. 7 4
      ccan/tdb2/tdb1_check.c
  2. 3 0
      ccan/tdb2/tdb1_io.c
  3. 17 7
      ccan/tdb2/tdb1_open.c
  4. 3 1
      ccan/tdb2/tdb1_tdb.c

+ 7 - 4
ccan/tdb2/tdb1_check.c

@@ -339,6 +339,7 @@ int tdb1_check(struct tdb_context *tdb,
 	bool found_recovery = false;
 	bool found_recovery = false;
 	tdb1_len_t dead;
 	tdb1_len_t dead;
 	bool locked;
 	bool locked;
+	size_t alloc_len;
 
 
 	/* We may have a write lock already, so don't re-lock. */
 	/* We may have a write lock already, so don't re-lock. */
 	if (tdb->file->allrecord_lock.count != 0) {
 	if (tdb->file->allrecord_lock.count != 0) {
@@ -364,11 +365,13 @@ int tdb1_check(struct tdb_context *tdb,
 	}
 	}
 
 
 	/* One big malloc: pointers then bit arrays. */
 	/* One big malloc: pointers then bit arrays. */
-	hashes = (unsigned char **)calloc(
-			1, sizeof(hashes[0]) * (1+tdb->tdb1.header.hash_size)
-			+ BITMAP_BITS / CHAR_BIT * (1+tdb->tdb1.header.hash_size));
+	alloc_len = sizeof(hashes[0]) * (1+tdb->tdb1.header.hash_size)
+		+ BITMAP_BITS / CHAR_BIT * (1+tdb->tdb1.header.hash_size);
+	hashes = (unsigned char **)calloc(1, alloc_len);
 	if (!hashes) {
 	if (!hashes) {
-		tdb->last_error = TDB_ERR_OOM;
+		tdb->last_error = tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
+					     "tdb_check: could not allocate %zu",
+					     alloc_len);
 		goto unlock;
 		goto unlock;
 	}
 	}
 
 

+ 3 - 0
ccan/tdb2/tdb1_io.c

@@ -370,6 +370,9 @@ int tdb1_expand(struct tdb_context *tdb, tdb1_off_t size)
 		char *new_map_ptr = (char *)realloc(tdb->file->map_ptr,
 		char *new_map_ptr = (char *)realloc(tdb->file->map_ptr,
 						    tdb->file->map_size);
 						    tdb->file->map_size);
 		if (!new_map_ptr) {
 		if (!new_map_ptr) {
+			tdb->last_error = tdb_logerr(tdb, TDB_ERR_OOM,
+						     TDB_LOG_ERROR,
+						     "tdb1_expand: no memory");
 			tdb->file->map_size -= size;
 			tdb->file->map_size -= size;
 			goto fail;
 			goto fail;
 		}
 		}

+ 17 - 7
ccan/tdb2/tdb1_open.c

@@ -74,7 +74,7 @@ enum TDB_ERROR tdb1_new_database(struct tdb_context *tdb,
 	struct tdb1_header *newdb;
 	struct tdb1_header *newdb;
 	size_t size;
 	size_t size;
 	int hash_size = TDB1_DEFAULT_HASH_SIZE;
 	int hash_size = TDB1_DEFAULT_HASH_SIZE;
-	enum TDB_ERROR ret = TDB_ERR_IO;
+	enum TDB_ERROR ret;
 
 
 	tdb_context_init(tdb, max_dead);
 	tdb_context_init(tdb, max_dead);
 
 
@@ -88,7 +88,8 @@ enum TDB_ERROR tdb1_new_database(struct tdb_context *tdb,
 	/* We make it up in memory, then write it out if not internal */
 	/* We make it up in memory, then write it out if not internal */
 	size = sizeof(struct tdb1_header) + (hash_size+1)*sizeof(tdb1_off_t);
 	size = sizeof(struct tdb1_header) + (hash_size+1)*sizeof(tdb1_off_t);
 	if (!(newdb = (struct tdb1_header *)calloc(size, 1))) {
 	if (!(newdb = (struct tdb1_header *)calloc(size, 1))) {
-		return TDB_ERR_OOM;
+		return tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
+				  "Could not allocate new database header");
 	}
 	}
 
 
 	/* Fill in the header */
 	/* Fill in the header */
@@ -113,15 +114,24 @@ enum TDB_ERROR tdb1_new_database(struct tdb_context *tdb,
 		tdb->file->map_ptr = (char *)newdb;
 		tdb->file->map_ptr = (char *)newdb;
 		return TDB_SUCCESS;
 		return TDB_SUCCESS;
 	}
 	}
-	if (lseek(tdb->file->fd, 0, SEEK_SET) == -1)
+	if (lseek(tdb->file->fd, 0, SEEK_SET) == -1) {
+		ret = tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
+				 "tdb1_new_database: lseek failed");
 		goto fail;
 		goto fail;
+	}
 
 
-	if (ftruncate(tdb->file->fd, 0) == -1)
+	if (ftruncate(tdb->file->fd, 0) == -1) {
+		ret = tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
+				 "tdb1_new_database: ftruncate failed");
 		goto fail;
 		goto fail;
+	}
 
 
-	/* we still have "ret == TDB_ERR_IO" here */
-	if (tdb1_write_all(tdb->file->fd, newdb, size))
-		ret = TDB_SUCCESS;
+	if (!tdb1_write_all(tdb->file->fd, newdb, size)) {
+		ret = tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
+				 "tdb1_new_database: write failed");
+		goto fail;
+	}
+	ret = TDB_SUCCESS;
 
 
   fail:
   fail:
 	SAFE_FREE(newdb);
 	SAFE_FREE(newdb);

+ 3 - 1
ccan/tdb2/tdb1_tdb.c

@@ -498,7 +498,9 @@ static int _tdb1_store(struct tdb_context *tdb, TDB_DATA key,
 	   fails and we are left with a dead spot in the tdb. */
 	   fails and we are left with a dead spot in the tdb. */
 
 
 	if (!(p = (char *)malloc(key.dsize + dbuf.dsize))) {
 	if (!(p = (char *)malloc(key.dsize + dbuf.dsize))) {
-		tdb->last_error = TDB_ERR_OOM;
+		tdb->last_error = tdb_logerr(tdb, TDB_ERR_OOM, TDB_LOG_ERROR,
+					     "tdb1_store: out of memory"
+					     " allocating copy");
 		goto fail;
 		goto fail;
 	}
 	}