Skip to content

Commit f9c4715

Browse files
author
Aakash Arayambeth
committed
initialize generic sharding information from llmeta separately instead on relying on an alias to exist
Signed-off-by: Aakash Arayambeth <[email protected]>
1 parent acb2764 commit f9c4715

File tree

3 files changed

+114
-4
lines changed

3 files changed

+114
-4
lines changed

bdb/bdb_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2499,4 +2499,4 @@ void llmeta_collect_tablename_alias(void);
24992499
int bdb_set_genshard(tran_type *, const char *, char *, int *);
25002500
int bdb_clear_genshard(tran_type *, const char *, int *);
25012501
int bdb_get_genshard(tran_type *, const char *, char **, int *, int *);
2502-
2502+
int bdb_get_genshard_names(tran_type *t, char **names, int *num);

bdb/llmeta.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11636,3 +11636,33 @@ int bdb_get_genshard(tran_type *tran, const char *table, char **str, int *size,
1163611636
return bdb_lite_exact_var_fetch_tran(llmeta_bdb_state, tran, key, (void **)str, size, bdberr);
1163711637
}
1163811638

11639+
struct llmeta_gen_shard_key {
11640+
int file_type;
11641+
char tablename[LLMETA_TBLLEN];
11642+
};
11643+
11644+
/* Fetch all generic shard names */
11645+
int bdb_get_genshard_names(tran_type *t, char **names, int *num)
11646+
{
11647+
union {
11648+
struct llmeta_gen_shard_key key;
11649+
uint8_t buf[LLMETA_IXLEN];
11650+
} * *shards;
11651+
int rc, n, bdberr;
11652+
llmetakey_t k;
11653+
11654+
k = htonl(LLMETA_GEN_SHARD);
11655+
rc = kv_get_keys(t, &k, sizeof(k), (void ***)&shards, &n, &bdberr);
11656+
if (rc || (n == 0)) {
11657+
*num = 0;
11658+
return rc;
11659+
}
11660+
11661+
for (int i = 0; i < n; ++i) {
11662+
names[i] = strdup(shards[i]->key.tablename);
11663+
free(shards[i]);
11664+
}
11665+
free(shards);
11666+
*num = n;
11667+
return rc;
11668+
}

db/comdb2.c

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ static void *purge_old_files_thread(void *arg);
208208
static int lrllinecmp(char *lrlline, char *cmpto);
209209
static void ttrap(struct timer_parm *parm);
210210
int clear_temp_tables(void);
211-
211+
int gen_shard_deserialize_shard(uint32_t *numdbs, char ***dbnames, uint32_t *numcols, char ***columns, char ***shardnames, char *serializedStr);
212212
pthread_key_t comdb2_open_key;
213213

214214
/*---GLOBAL SETTINGS---*/
@@ -2294,6 +2294,79 @@ int llmeta_load_views(struct dbenv *dbenv, void *tran)
22942294
return rc;
22952295
}
22962296

2297+
int llmeta_load_genshards(struct dbenv *dbenv, void *tran) {
2298+
int rc = 0;
2299+
int bdberr = 0;
2300+
/* allow as many generic sharded tables as regular tables (?) */
2301+
char *tablenames[MAX_NUM_TABLES];
2302+
char *shard_info = NULL;
2303+
char **dbnames = NULL, **columns = NULL, **shardnames = NULL;
2304+
int table_count = 0, size = 0;
2305+
uint32_t numdbs=0, numcols=0;
2306+
struct dbtable *db = NULL;
2307+
/* load the tables from the low level metatable */
2308+
if (bdb_get_genshard_names(tran, (char **)tablenames, &table_count)) {
2309+
logmsg(
2310+
LOGMSG_ERROR,
2311+
"couldn't load generic shard names from low level meta table (bdberr: %d)\n",
2312+
bdberr);
2313+
return 1;
2314+
}
2315+
2316+
for (int i = 0; i < table_count; i++) {
2317+
if (bdb_get_genshard(tran, tablenames[i], &shard_info, &size, &bdberr)) {
2318+
logmsg(LOGMSG_ERROR,
2319+
"couldn't load view definition from low level meta table "
2320+
"(bdberr: %d)\n",
2321+
bdberr);
2322+
goto err;
2323+
}
2324+
2325+
if (gen_shard_deserialize_shard(&numdbs, &dbnames, &numcols, &columns, &shardnames, shard_info)) {
2326+
logmsg(LOGMSG_ERROR, "Failed to deserialize llmeta str for generic shard %s\n", tablenames[i]);
2327+
}
2328+
2329+
for(int i=0;i<numdbs;i++){
2330+
db = get_dbtable_by_name(shardnames[i]);
2331+
if (db) {
2332+
/*update the table object*/
2333+
db->numdbs = numdbs;
2334+
db->dbnames = dbnames;
2335+
db->numcols = numcols;
2336+
db->columns = columns;
2337+
db->shardnames = shardnames;
2338+
} else {
2339+
logmsg(LOGMSG_ERROR, "FAILED TO UPDATE GENERIC SHARDING METADATA FOR TABLE %s\n", tablenames[i]);
2340+
}
2341+
}
2342+
}
2343+
return rc;
2344+
err:
2345+
for (int i = 0; i < table_count; i++) {
2346+
free(tablenames[i]);
2347+
}
2348+
2349+
if (dbnames) {
2350+
for(int i=0;i<numdbs;i++){
2351+
free(dbnames[i]);
2352+
}
2353+
free(dbnames);
2354+
}
2355+
2356+
if (columns) {
2357+
for(int i=0;i<numcols;i++){
2358+
free(columns[i]);
2359+
}
2360+
}
2361+
2362+
if (shardnames) {
2363+
for(int i=0;i<numdbs;i++) {
2364+
free(shardnames[i]);
2365+
}
2366+
}
2367+
return rc;
2368+
}
2369+
22972370
static inline int db_get_alias(void *tran, dbtable *tbl)
22982371
{
22992372
char *sqlalias = NULL;
@@ -2412,12 +2485,12 @@ static int llmeta_load_tables(struct dbenv *dbenv, void *tran)
24122485
/* A shard of a partitioned table has the partition name as an alias.
24132486
* Read the sharded table metadata.
24142487
*/
2415-
if (tbl->sqlaliasname) {
2488+
/*if (tbl->sqlaliasname) {
24162489
rc = gen_shard_update_inmem_db(tran, tbl, tbl->sqlaliasname);
24172490
if (rc) {
24182491
logmsg(LOGMSG_USER, "NOT UPDATING SHARD METADATA FOR TABLE %s\n", tbl->tablename);
24192492
}
2420-
}
2493+
}*/
24212494
/* We only want to load older schema versions for ODH databases. ODH
24222495
* information is stored in the meta table (not the llmeta table), so
24232496
* it's not loaded yet.
@@ -4225,6 +4298,13 @@ static int init(int argc, char **argv)
42254298
return -1;
42264299
}
42274300

4301+
if (llmeta_load_genshards(thedb, NULL)) {
4302+
logmsg(LOGMSG_FATAL, "could not load generic shards from the low level meta "
4303+
"table\n");
4304+
unlock_schema_lk();
4305+
return -1;
4306+
}
4307+
42284308
if (llmeta_load_timepart(thedb)) {
42294309
logmsg(LOGMSG_ERROR, "could not load time partitions\n");
42304310
unlock_schema_lk();

0 commit comments

Comments
 (0)