Changeset: 6cf3f7077b2f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6cf3f7077b2f
Modified Files:
        monetdb5/optimizer/opt_dataflow.c
Branch: parappend
Log Message:

Implement parallel appends


diffs (183 lines):

diff --git a/monetdb5/optimizer/opt_dataflow.c 
b/monetdb5/optimizer/opt_dataflow.c
--- a/monetdb5/optimizer/opt_dataflow.c
+++ b/monetdb5/optimizer/opt_dataflow.c
@@ -54,6 +54,7 @@ typedef enum {
        singleton_region, // only ever a single statement
        dataflow_region,  // statements without side effects, in parallel
        existing_region,  // existing barrier..exit region, copied as-is
+       sql_region,       // region of nonconflicting sql.append/sql.updates 
only
 } region_type;
 
 typedef struct {
@@ -167,25 +168,135 @@ dflowGarbagesink(Client cntxt, MalBlkPtr
        return top;
 }
 
+
+static str
+get_str_arg(MalBlkPtr mb, InstrPtr p, int argno)
+{
+       int var = getArg(p, argno);
+       return getVarConstant(mb, var).val.sval;
+}
+
+static str
+get_sql_sname(MalBlkPtr mb, InstrPtr p)
+{
+       return get_str_arg(mb, p, 2);
+}
+
+static str
+get_sql_tname(MalBlkPtr mb, InstrPtr p)
+{
+       return get_str_arg(mb, p, 3);
+}
+
+static str
+get_sql_cname(MalBlkPtr mb, InstrPtr p)
+{
+       return get_str_arg(mb, p, 4);
+}
+
+
 static bool
-checkBreakpoint(Client cntxt, MalBlkPtr mb, InstrPtr p, States states, 
region_state *state)
+isSqlAppendUpdate(MalBlkPtr mb, InstrPtr p)
 {
+       if (p->modname != sqlRef)
+               return false;
+       if (p->fcnname != appendRef) //  && p->fcnname != updateRef)
+               return false;
+
+       // pattern("sql", "append", mvc_append_wrap, false, "...", args(1,7, 
arg("",int),
+       //              arg("mvc",int
+       //              arg("sname",str
+       //              arg("tname",str
+       //              arg("cname",str
+       //              arg("offset",lng
+       //              argany("ins",0))),
+
+       // pattern("sql", "update", mvc_update_wrap, false, "...", args(1,7, 
arg("",int
+       //              arg("mvc",int),
+       //              arg("sname",str
+       //              arg("tname",str
+       //              arg("cname",str
+       //              argany("rids",0
+       //              argany("upd",0))
+
+       if (p->argc != 7)
+               return false;
+
+       int mvc_var = getArg(p, 1);
+       if (getVarType(mb, mvc_var) != TYPE_int)
+               return false;
+
+       int sname_var = getArg(p, 2);
+       if (getVarType(mb, sname_var) != TYPE_str || !isVarConstant(mb, 
sname_var))
+               return false;
+
+       int tname_var = getArg(p, 3);
+       if (getVarType(mb, tname_var) != TYPE_str || !isVarConstant(mb, 
tname_var))
+               return false;
+
+       int cname_var = getArg(p, 4);
+       if (getVarType(mb, cname_var) != TYPE_str || !isVarConstant(mb, 
cname_var))
+               return false;
+
+       return true;
+}
+
+static bool
+sqlBreakpoint(MalBlkPtr mb, InstrPtr *first, InstrPtr *p)
+{
+       InstrPtr instr = *p;
+       if (!isSqlAppendUpdate(mb, instr))
+               return true;
+
+       str my_sname = get_sql_sname(mb, instr);
+       str my_tname = get_sql_tname(mb, instr);
+       str my_cname = get_sql_cname(mb, instr);
+       for (InstrPtr *q = first; q < p; q++) {
+               str sname = get_sql_sname(mb, *q);
+               if (strcmp(my_sname, sname) != 0) {
+                       // different sname, no conflict
+                       continue;
+               }
+               str tname = get_sql_tname(mb, *q);
+               if (strcmp(my_tname, tname) != 0) {
+                       // different tname, no conflict
+                       continue;
+               }
+               str cname = get_sql_cname(mb, *q);
+               if (strcmp(my_cname, cname) != 0) {
+                       // different cname, no conflict
+                       continue;
+               }
+               // Found a statement in the region that works on the same 
column so this is a breakpoint
+               return true;
+       }
+
+       // None of the statements in the region works on this column so no 
breakpoint necessary
+       return false;
+}
+
+static bool
+checkBreakpoint(Client cntxt, MalBlkPtr mb, InstrPtr *first, InstrPtr *p, 
States states, region_state *state)
+{
+       InstrPtr instr = *p;
        switch (state->type) {
                case singleton_region:
                        return true;
                case dataflow_region:
-                       return dataflowBreakpoint(cntxt, mb, p, states);
+                       return dataflowBreakpoint(cntxt, mb, instr, states);
                case existing_region:
                        if (state->st.existing_region.level == 0) {
                                // previous statement ended the region
                                return true;
                        }
-                       if (blockStart(p)) {
+                       if (blockStart(instr)) {
                                state->st.existing_region.level += 1;
-                       } else if (blockExit(p)) {
+                       } else if (blockExit(instr)) {
                                state->st.existing_region.level -= 1;
                        }
                        return false;
+               case sql_region:
+                       return sqlBreakpoint(mb, first, p);
                default:
                        // serious corruption has occurred.
                        assert(0 && "corrupted region_type");
@@ -200,11 +311,14 @@ decideRegionType(Client cntxt, MalBlkPtr
 {
        (void) cntxt;
 
+       state->type = no_region;
        if (blockStart(p)) {
                state->type = existing_region;
                state->st.existing_region.level = 1;
        } else if (p->token == ENDsymbol) {
                state->type = existing_region;
+       } else if (isSqlAppendUpdate(mb,p)) {
+               state->type = sql_region;
        } else if (p->barrier) {
                state->type = singleton_region;
        } else if (isUnsafeFunction(p)) {
@@ -216,6 +330,7 @@ decideRegionType(Client cntxt, MalBlkPtr
        } else {
                state->type = dataflow_region;
        }
+       assert(state->type != no_region);
 }
 
 
@@ -298,7 +413,7 @@ OPTdataflowImplementation_wrapped(Client
        for (i = 1; i<limit; i++) {
                p = old[i];
                assert(p);
-               breakpoint = checkBreakpoint(cntxt, mb, p, states, &state);
+               breakpoint = checkBreakpoint(cntxt, mb, &old[start], &old[i], 
states, &state);
                if ( breakpoint ){
                        /* close previous flow block */
                        simple = simpleFlow(old,start,i, &state);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to