Changeset: f031ede634bc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f031ede634bc
Modified Files:
        sql/include/sql_catalog.h
        sql/storage/objectset.c
        sql/storage/store.c
Branch: Jul2021
Log Message:

fixing leaks


diffs (truncated from 442 to 300 lines):

diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -247,7 +247,7 @@ typedef int (*tc_commit_fptr) (struct sq
 typedef int (*tc_cleanup_fptr) (sql_store store, struct sql_change *c, ulng 
commit_ts, ulng oldest);   /* garbage collection, ie cleanup structures when 
possible */
 typedef void (*destroy_fptr)(sql_store store, sql_base *b);
 
-extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary, bool unique);
+extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary, bool unique, sql_store store);
 extern struct objectset *os_dup(struct objectset *os);
 extern void os_destroy(struct objectset *os, sql_store store);
 extern int /*ok, error (name existed) and conflict (added before) */ 
os_add(struct objectset *os, struct sql_trans *tr, const char *name, sql_base 
*b);
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -61,6 +61,7 @@ typedef struct objectset {
        struct sql_hash *id_map;
        bool temporary;
        bool unique;    /* names are unique */
+       sql_store store;
 } objectset;
 
 static int
@@ -614,7 +615,7 @@ tc_commit_objectversion(sql_trans *tr, s
 }
 
 objectset *
-os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique)
+os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique, 
sql_store store)
 {
        objectset *os = SA_NEW(sa, objectset);
        *os = (objectset) {
@@ -622,7 +623,8 @@ os_new(sql_allocator *sa, destroy_fptr d
                .sa = sa,
                .destroy = destroy,
                .temporary = temporary,
-               .unique = unique
+               .unique = unique,
+               .store = store
        };
        os->destroy = destroy;
        MT_rwlock_init(&os->rw_lock, "sa_readers_lock");
@@ -850,6 +852,8 @@ os_add_(objectset *os, struct sql_trans 
        ov->os = os;
 
        if ((res = os_add_id_based(os, tr, b->id, ov))) {
+               if (os->destroy)
+                       os->destroy(os->store, ov->b);
                _DELETE(ov);
                return res;
        }
@@ -946,6 +950,8 @@ os_del_(objectset *os, struct sql_trans 
        ov->os = os;
 
        if ((res = os_del_id_based(os, tr, b->id, ov))) {
+               if (os->destroy)
+                       os->destroy(os->store, ov->b);
                _DELETE(ov);
                return res;
        }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -726,7 +726,6 @@ load_table(sql_trans *tr, sql_schema *s,
 
                ol_add(t->idxs, &i->base);
                if (os_add(s->idxs, tr, i->base.name, dup_base(&i->base))) {
-                       idx_destroy(store, i);
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
                        return NULL;
@@ -742,7 +741,6 @@ load_table(sql_trans *tr, sql_schema *s,
                ol_add(t->keys, &k->base);
                if (os_add(s->keys, tr, k->base.name, dup_base(&k->base)) ||
                        os_add(tr->cat->objects, tr, k->base.name, 
dup_base(&k->base))) {
-                       key_destroy(store, k);
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
                        return NULL;
@@ -757,7 +755,6 @@ load_table(sql_trans *tr, sql_schema *s,
 
                ol_add(t->triggers, &k->base);
                if (os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
-                       trigger_destroy(store, k);
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
                }
@@ -1001,14 +998,14 @@ load_schema(sql_trans *tr, oid rid)
                s->system = (bit) store->table_api.column_find_bte(tr, 
find_sql_column(ss, "system"), rid);
                s->owner = store->table_api.column_find_sqlid(tr, 
find_sql_column(ss, "owner"), rid);
 
-               s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
false, true);
-               s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, 
false);
-               s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, 
false);
-               s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, 
true);
-               s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, 
true);
-               s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, 
true);
-               s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
false, true);
-               s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, 
false);
+               s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
false, true, store);
+               s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, 
false, store);
+               s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, 
false, store);
+               s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, 
true, store);
+               s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, 
true, store);
+               s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, 
true, store);
+               s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
false, true, store);
+               s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, 
false, store);
        }
 
        TRC_DEBUG(SQL_STORE, "Load schema: %s %d\n", s->base.name, s->base.id);
@@ -1022,7 +1019,6 @@ load_schema(sql_trans *tr, oid rid)
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_type *t = load_type(tr, s, rid);
                if (os_add(s->types, tr, t->base.name, &t->base)) {
-                       type_destroy(store, t);
                        schema_destroy(store, s);
                        store->table_api.rids_destroy(rs);
                        return NULL;
@@ -1052,7 +1048,6 @@ load_schema(sql_trans *tr, oid rid)
                                        return NULL;
                                }
                                if (os_add(s->tables, tr, t->base.name, 
&t->base)) {
-                                       table_destroy(store, t);
                                        schema_destroy(store, s);
                                        return NULL;
                                }
@@ -1085,7 +1080,6 @@ load_schema(sql_trans *tr, oid rid)
                                return NULL;
                        }
                        if (os_add(s->funcs, tr, f->base.name, &f->base)) {
-                               func_destroy(store, f);
                                schema_destroy(store, s);
                                return NULL;
                        }
@@ -1104,7 +1098,6 @@ load_schema(sql_trans *tr, oid rid)
                        if (os_add(s->funcs, tr, f->base.name, &f->base)) {
                                store->table_api.subrids_destroy(nrs);
                                store->table_api.rids_destroy(rs);
-                               func_destroy(store, f);
                                schema_destroy(store, s);
                                return NULL;
                        }
@@ -1120,7 +1113,6 @@ load_schema(sql_trans *tr, oid rid)
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_sequence *seq = load_seq(tr, s, rid);
                if (os_add(s->seqs, tr, seq->base.name, &seq->base)) {
-                       seq_destroy(store, seq);
                        schema_destroy(store, s);
                        store->table_api.rids_destroy(rs);
                        return NULL;
@@ -1147,7 +1139,6 @@ load_schema(sql_trans *tr, oid rid)
                                        load_value_partition(tr, syss, pt);
                                }
                                if (os_add(s->parts, tr, pt->base.name, 
dup_base(&pt->base))) {
-                                       part_destroy(store, pt);
                                        schema_destroy(store, s);
                                        store->table_api.rids_destroy(rs);
                                        return NULL;
@@ -1519,13 +1510,11 @@ bootstrap_create_table(sql_trans *tr, sq
        t->base.flags = s->base.flags;
        t->query = NULL;
        t->s = s;
-       if (os_add(s->tables, tr, name, &t->base)) {
+       if (isTable(t) && store->storage_api.create_del(tr, t) != LOG_OK) {
                table_destroy(store, t);
                return NULL;
        }
-
-       if (isTable(t) && store->storage_api.create_del(tr, t) != LOG_OK) {
-               table_destroy(store, t);
+       if (os_add(s->tables, tr, name, &t->base)) {
                return NULL;
        }
        return t;
@@ -1549,16 +1538,15 @@ bootstrap_create_schema(sql_trans *tr, c
        s->auth_id = auth_id;
        s->owner = owner;
        s->system = TRUE;
-       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true);
-       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, false);
-       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false);
-       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true);
-       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true);
-       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true);
-       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false, 
true);
-       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false);
+       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true, 
store);
+       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, false, 
store);
+       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false, 
store);
+       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true, 
store);
+       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true, 
store);
+       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true, 
store);
+       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false, 
true, store);
+       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false, 
store);
        if (os_add(tr->cat->schemas, tr, s->base.name, &s->base)) {
-               schema_destroy(store, s);
                return NULL;
        }
        if (isTempSchema(s))
@@ -2654,7 +2642,6 @@ key_dup(sql_trans *tr, sql_key *k, sql_t
        if (isGlobal(t) &&
                        ((res = os_add(t->s->keys, tr, nk->base.name, 
dup_base(&nk->base))) ||
                         (res = os_add(tr->cat->objects, tr, nk->base.name, 
dup_base(&nk->base))))) {
-               key_destroy(tr->store, nk);
                return res;
        }
        *kres = nk;
@@ -2693,7 +2680,6 @@ idx_dup(sql_trans *tr, sql_idx * i, sql_
                list_append(ni->columns, kc_dup(tr, okc, t));
        }
        if (isGlobal(t) && (res = os_add(t->s->idxs, tr, ni->base.name, 
dup_base(&ni->base)))) {
-               idx_destroy(store, ni);
                return res;
        }
        *ires = ni;
@@ -2731,7 +2717,6 @@ part_dup(sql_trans *tr, sql_part *op, sq
                }
        }
        if ((res = os_add(mt->s->parts, tr, p->base.name, dup_base(&p->base)))) 
{
-               part_destroy(tr->store, p);
                return res;
        }
        *pres = p;
@@ -2767,7 +2752,6 @@ trigger_dup(sql_trans *tr, sql_trigger *
                list_append(nt->columns, kc_dup(tr, okc, t));
        }
        if (isGlobal(t) && (res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base)))) {
-               trigger_destroy(tr->store, nt);
                return res;
        }
        *tres = nt;
@@ -2867,7 +2851,6 @@ table_dup(sql_trans *tr, sql_table *ot, 
 
 cleanup:
        if (res) {
-               table_destroy(store, t);
                t = NULL;
        }
        *tres = t;
@@ -2992,10 +2975,6 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        }
        if ((res = ol_add(t->idxs, &ni->base)))
                return res;
-       if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base)))) 
{
-               idx_destroy(store, ni);
-               return res;
-       }
 
        if (isDeclaredTable(i->t))
                if (!isDeclaredTable(t) && isTable(ni->t) && 
idx_has_column(ni->type))
@@ -3008,6 +2987,11 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
                        idx_destroy(store, ni);
                        return res;
                }
+
+       if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base)))) 
{
+               return res;
+       }
+
        if (ires)
                *ires = ni;
        return res;
@@ -3052,10 +3036,6 @@ sql_trans_copy_trigger( sql_trans *tr, s
        }
        if ((res = ol_add(t->triggers, &nt->base)))
                return res;
-       if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base)))) {
-               trigger_destroy(store, nt);
-               return res;
-       }
 
        if (!isDeclaredTable(t))
                if ((res = store->table_api.table_insert(tr, systr, 
&nt->base.id, &nt->base.name, &t->base.id, &nt->time, &nt->orientation,
@@ -3064,6 +3044,11 @@ sql_trans_copy_trigger( sql_trans *tr, s
                        trigger_destroy(store, nt);
                        return res;
                }
+
+       if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base)))) {
+               return res;
+       }
+
        if (tres)
                *tres = nt;
        return res;
@@ -3288,7 +3273,6 @@ sql_trans_rollback(sql_trans *tr)
                if (tr->localtmps.nelm) {
                        for(node *n=tr->localtmps.nelm; n; ) {
                                node *next = n->next;
-                               //sql_table *tt = n->data;
                                list_remove_node(tr->localtmps.set, store, n);
                                n = next;
                        }
@@ -3332,7 +3316,6 @@ sql_trans_create_(sqlstore *store, sql_t
        if (!tr)
                return NULL;
 
-       //tr->sa = store->sa;
        tr->sa = NULL;
        tr->store = store;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to