*/
ssize_t para_write_all(int fd, const void *buf, size_t size)
{
- PARA_DEBUG_LOG("writing %zu bytes\n", size);
+// PARA_DEBUG_LOG("writing %zu bytes\n", size);
const char *b = buf;
while (size) {
ssize_t ret = para_write(fd, b, size);
- PARA_DEBUG_LOG("ret: %d\n", ret);
+// PARA_DEBUG_LOG("ret: %zd\n", ret);
if (ret < 0)
return ret;
b += ret;
{
int ret, fd;
- PARA_DEBUG_LOG("appending %zu + %zu bytes\n", header_size, data_size);
+// PARA_DEBUG_LOG("appending %zu + %zu bytes\n", header_size, data_size);
ret = para_open(filename, O_WRONLY | O_CREAT | O_APPEND, 0644);
if (ret < 0)
return ret;
struct osl_table *t = para_calloc(sizeof(*t));
int i, ret = -E_BAD_TABLE_DESC, have_disk_storage_name_column = 0;
- PARA_INFO_LOG("creating table structure for '%s' from table "
- "description\n", desc->name);
if (!desc)
goto err;
+ PARA_DEBUG_LOG("creating table structure for '%s' from table "
+ "description\n", desc->name);
ret = -E_NO_COLUMN_DESC;
if (!desc->column_descriptions)
goto err;
if (!t->num_rbtrees)
goto err;
/* success */
- PARA_INFO_LOG("OK. Index entry size: %u\n", t->index_entry_size);
+ PARA_DEBUG_LOG("OK. Index entry size: %u\n", t->index_entry_size);
ret = init_column_descriptions(t);
if (ret < 0)
goto err;
ret = -E_SHORT_TABLE;
if (map->size < offset + MIN_IDX_COLUMN_DESCRIPTION_SIZE) {
- PARA_ERROR_LOG("map size = %u < %u = offset + min desc size\n",
+ PARA_ERROR_LOG("map size = %zu < %u = offset + min desc size\n",
map->size, offset + MIN_IDX_COLUMN_DESCRIPTION_SIZE);
goto err;
}
if (strcmp(cd1->name, cd2->name))
goto out;
}
- PARA_INFO_LOG("table description of '%s' matches on-disk data, good\n",
+ PARA_DEBUG_LOG("table description of '%s' matches on-disk data, good\n",
t->desc->name);
ret = 1;
out:
write_u8(buf, read_u8(buf) & 0xfe);
}
+static void unmap_column(struct osl_table *t, unsigned col_num)
+{
+ struct osl_object map = t->columns[col_num].data_map;
+ int ret;
+ if (!map.data)
+ return;
+ ret = para_munmap(map.data, map.size);
+ assert(ret > 0);
+ map.data = NULL;
+}
+
/**
* Unmap all mapped files of an osl table.
*
if (!t->num_mapped_columns) /* can this ever happen? */
return 1;
- PARA_INFO_LOG("unmapping table '%s'\n", t->desc->name);
+ PARA_DEBUG_LOG("unmapping table '%s'\n", t->desc->name);
if (!t->index_map.data)
return -E_NOT_MAPPED;
if (flags & OSL_MARK_CLEAN)
t->index_map.data = NULL;
if (!t->num_rows)
return 1;
- FOR_EACH_MAPPED_COLUMN(i, t, cd) {
- struct osl_object map = t->columns[i].data_map;
- if (!map.data)
- continue;
- ret = para_munmap(map.data, map.size);
- if (ret < 0)
- return ret;
- map.data = NULL;
- }
+ FOR_EACH_MAPPED_COLUMN(i, t, cd)
+ unmap_column(t, i);
return 1;
}
+static int map_column(struct osl_table *t, unsigned col_num)
+{
+ struct stat statbuf;
+ char *filename = column_filename(t, col_num);
+ int ret = -E_STAT;
+ if (stat(filename, &statbuf) < 0) {
+ free(filename);
+ return ret;
+ }
+ if (!(S_IFREG & statbuf.st_mode)) {
+ free(filename);
+ return ret;
+ }
+ ret = mmap_full_file(filename, O_RDWR,
+ &t->columns[col_num].data_map);
+ free(filename);
+ return ret;
+}
+
/**
* Map the index file and all columns of type \p OSL_MAPPED_STORAGE into memory.
*
return num_rows;
/* map data files */
FOR_EACH_MAPPED_COLUMN(i, t, cd) {
- struct stat statbuf;
- filename = column_filename(t, i);
- ret = -E_STAT;
- if (stat(filename, &statbuf) < 0) {
- free(filename);
- goto err;
- }
- if (!(S_IFREG & statbuf.st_mode)) {
- free(filename);
- goto err;
- }
- ret = mmap_full_file(filename, O_RDWR,
- &t->columns[i].data_map);
- free(filename);
+ ret = map_column(t, i);
if (ret < 0)
goto err;
}
return ret;
offset = read_u32(index_entry);
obj->size = read_u32(index_entry + 4) - 1;
- PARA_DEBUG_LOG("index_entry: %p\n", index_entry);
header = col->data_map.data + offset;
obj->data = header + 1;
if (read_u8(header) == 0xff) {
obj->size, offset);
return -E_INVALID_OBJECT;
}
- PARA_DEBUG_LOG("mapped obj row_num: %u, col %u, size: %d\n", row_num,
- col_num, obj->size);
return 1;
}
struct osl_row *row = allocate_row(t->num_rbtrees);
const struct osl_column_description *cd;
- PARA_DEBUG_LOG("row: %p, id: %u\n", row, id);
row->id = id;
row->volatile_objects = volatile_objs;
FOR_EACH_RBTREE_COLUMN(i, t, cd) {
} else { /* volatile */
const struct osl_object *obj
= volatile_objs + t->columns[i].volatile_num;
- PARA_DEBUG_LOG("inserting %p\n", obj->data);
ret = insert_rbtree(t, i, row, obj);
}
if (ret < 0)
int ret;
char header = 0; /* zero means valid object */
- PARA_DEBUG_LOG("appending %zu + 1 byte\n", obj->size);
+// PARA_DEBUG_LOG("appending %zu + 1 byte\n", obj->size);
ret = append_file(filename, &header, 1, obj->data, obj->size,
new_size);
free(filename);
if (!t->num_mapped_columns)
return 1;
filename = index_filename(t->desc);
- PARA_DEBUG_LOG("appending %zu bytes\n", t->index_entry_size);
+// PARA_DEBUG_LOG("appending %u bytes\n", t->index_entry_size);
ret = append_file(filename, NULL, 0, new_index_entry,
t->index_entry_size, NULL);
free(filename);
if (t->num_mapped_columns)
new_index_entry = para_malloc(t->index_entry_size);
/* pass 1: sanity checks */
- PARA_DEBUG_LOG("sanity tests: %p:%p\n", objects[0].data,
- objects[1].data);
+// PARA_DEBUG_LOG("sanity tests: %p:%p\n", objects[0].data,
+// objects[1].data);
FOR_EACH_COLUMN(i, t->desc, cd) {
enum osl_storage_type st = cd->storage_type;
enum osl_storage_flags sf = cd->storage_flags;
if (sf & OSL_RBTREE) {
unsigned rbtree_num = t->columns[i].rbtree_num;
ret = -E_RB_KEY_EXISTS;
- PARA_DEBUG_LOG("checking whether %p exists\n",
- objects[i].data);
+// PARA_DEBUG_LOG("checking whether %p exists\n",
+// objects[i].data);
if (search_rbtree(objects + i, t, i,
&rb_parents[rbtree_num],
&rb_links[rbtree_num]) > 0)
goto out;
}
if (sf & OSL_FIXED_SIZE) {
- PARA_DEBUG_LOG("fixed size. need: %d, have: %d\n",
- objects[i].size, cd->data_size);
+// PARA_DEBUG_LOG("fixed size. need: %zu, have: %d\n",
+// objects[i].size, cd->data_size);
ret = -E_BAD_DATA_SIZE;
if (objects[i].size != cd->data_size)
goto out;
ret = unmap_table(t, OSL_MARK_CLEAN);
if (ret < 0)
goto out;
- PARA_DEBUG_LOG("sanity tests passed%s\n", "");
+// PARA_DEBUG_LOG("sanity tests passed%s\n", "");
/* pass 2: create data files, append map data */
FOR_EACH_COLUMN(i, t->desc, cd) {
enum osl_storage_type st = cd->storage_type;
if (st == OSL_MAPPED_STORAGE) {
uint32_t new_size;
struct osl_column *col = &t->columns[i];
- PARA_DEBUG_LOG("appending object of size %zu\n",
- objects[i].size);
+// PARA_DEBUG_LOG("appending object of size %zu\n",
+// objects[i].size);
ret = append_map_file(t, i, objects + i, &new_size);
if (ret < 0)
goto rollback;
volatile_objs[t->columns[i].volatile_num] = objects[i];
}
t->num_rows++;
- PARA_DEBUG_LOG("adding new entry as row #%d\n", t->num_rows - 1);
+// PARA_DEBUG_LOG("adding new entry as row #%d\n", t->num_rows - 1);
ret = add_row_to_rbtrees(t, t->num_rows - 1, volatile_objs, row);
if (ret < 0)
goto out;
- PARA_DEBUG_LOG("added new entry as row #%d\n", t->num_rows - 1);
+// PARA_DEBUG_LOG("added new entry as row #%d\n", t->num_rows - 1);
ret = 1;
goto out;
rollback: /* rollback all changes made, ignore further errors */
ret = mark_mapped_object_invalid(t, r->id, col_num);
if (ret < 0)
return ret;
+ unmap_column(t, col_num);
ret = append_map_file(t, col_num, obj,
&new_data_map_size);
+ if (ret < 0)
+ return ret;
+ ret = map_column(t, col_num);
if (ret < 0)
return ret;
update_index_entry(index_entry, col, new_data_map_size,