Initialize column name hash *after* table version is known.
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 19 Apr 2017 12:43:08 +0000 (14:43 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Wed, 17 Jun 2020 20:30:31 +0000 (22:30 +0200)
We use hash_function() to determine the path of the file/directory
which corresponds to columns of type MAPPED_STORAGE or
DISK_STORAGE. Currently this happens before the index has been
mapped, so we don't know the table version at this point.

Future versions of osl will support multiple hash functions, and the
hash function to use will be determined from the table version. At
this point the modifications of this patch become necessary. At the
moment the patch has no visible effect.

osl.c

diff --git a/osl.c b/osl.c
index 5f58488..b9c2339 100644 (file)
--- a/osl.c
+++ b/osl.c
@@ -205,7 +205,6 @@ static int init_column_descriptions(struct osl_table *t)
        /* the size of the index header without column descriptions */
        t->index_header_size = IDX_COLUMN_DESCRIPTIONS;
        FOR_EACH_COLUMN(i, t->desc, cd) {
-               struct osl_column *col = t->columns + i;
                if (cd->storage_flags & OSL_RBTREE) {
                        if (!cd->compare_function)
                                return -E_OSL_NO_COMPARE_FUNC;
@@ -219,7 +218,6 @@ static int init_column_descriptions(struct osl_table *t)
                if (ret < 0)
                        goto err;
                t->index_header_size += index_column_description_size(cd->name);
-               column_name_hash(cd->name, col->name_hash);
                ret = -E_OSL_DUPLICATE_COL_NAME;
                for (j = i + 1; j < t->desc->num_columns; j++) {
                        const char *name2 = get_column_description(t->desc,
@@ -553,6 +551,7 @@ __export int osl_create_table(const struct osl_table_description *desc)
                        if (ret < 0)
                                goto out;
                }
+               column_name_hash(cd->name, t->columns[i].name_hash);
                ret = -E_OSL_NOMEM;
                filename = column_filename(t, i);
                if (!filename)
@@ -719,13 +718,16 @@ int map_table(struct osl_table *t, enum map_table_flags flags)
        }
        mark_table_dirty(t);
        num_rows = table_num_rows(t);
-       if (!num_rows)
-               return num_rows;
        /* map data files */
-       FOR_EACH_MAPPED_COLUMN(i, t, cd) {
-               ret = map_column(t, i);
-               if (ret < 0)
-                       goto err;
+       FOR_EACH_COLUMN(i, t->desc, cd) {
+               if (cd->storage_type == OSL_NO_STORAGE)
+                       continue;
+               column_name_hash(cd->name, t->columns[i].name_hash);
+               if (num_rows > 0 && cd->storage_type == OSL_MAPPED_STORAGE) {
+                       ret = map_column(t, i);
+                       if (ret < 0)
+                               goto err;
+               }
        }
        return num_rows;
 err:   /* unmap what is already mapped */