Changeset: 8e24f88d44aa for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e24f88d44aa
Added Files:
        sql/test/wlcr/Tests/wlc60.py
        sql/test/wlcr/Tests/wlc60.stable.err
        sql/test/wlcr/Tests/wlc60.stable.out
        sql/test/wlcr/Tests/wlr60.py
        sql/test/wlcr/Tests/wlr60.stable.err
        sql/test/wlcr/Tests/wlr60.stable.out
Modified Files:
        monetdb5/modules/mal/wlcr.c
        monetdb5/modules/mal/wlcr.h
        monetdb5/modules/mal/wlcr.mal
        sql/backends/monet5/sql_wlcr.c
        sql/scripts/60_wlcr.sql
        sql/test/wlcr/Tests/All
Branch: wlcr
Log Message:

Implement state changes
Logging can be suspended/resumed with proper warnings.


diffs (truncated from 574 to 300 lines):

diff --git a/monetdb5/modules/mal/wlcr.c b/monetdb5/modules/mal/wlcr.c
--- a/monetdb5/modules/mal/wlcr.c
+++ b/monetdb5/modules/mal/wlcr.c
@@ -363,38 +363,16 @@ WLCdrift(Client cntxt, MalBlkPtr mb, Mal
 
 str 
 WLCmaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       int role = 0;
+{      
        char path[PATHLENGTH];
-       (void) stk;
-       (void) pci;
        (void) cntxt;
        (void) mb;
-       if( pci->argc ==2){
-               role = *getArgReference_int(stk, pci,1);
-               switch(wlcr_role){
-               case 0:
-                       if( role != WLCR_STARTED)
-                               throw(MAL,"master","WARNING: use master() or 
master(1) to start master role");
-                       break;
-               case WLCR_STARTED:
-                       if( role != WLCR_PAUSED && role != WLCR_STOPPED)
-                               throw(MAL,"master","WARNING: use master(2) to 
pause, and master(4) to stop");
-                       break;
-               case WLCR_PAUSED:
-                       if( role != WLCR_RESUMED && role != WLCR_STOPPED)
-                               throw(MAL,"master","WARNING: use master(3) to 
resume, and master(4) to stop");
-                       break;
-               case WLCR_RESUMED:
-                       if( role != WLCR_PAUSED && role != WLCR_STOPPED)
-                               throw(MAL,"master","WARNING: use master(2) to 
pause, and master(4) to stop");
-                       break;
-               default:
-               case WLCR_STOPPED:
-                       // end of life cycle;
-                       ;
-               }
-       }
+       if( wlcr_role == WLCR_STOP)
+               throw(MAL,"master","WARNING: logging has been stopped. Use new 
snapshot");
+       if( wlcr_role == WLCR_RUN)
+               throw(MAL,"master","WARNING: already in master mode, call 
ignored");
+       if( pci->argc == 2)
+               wlcr_logs = GDKstrdup( *getArgReference_str(stk, pci,1));
 
        if ( wlcr_logs == NULL){
                wlcr_dbname = GDKgetenv("gdk_dbname");
@@ -406,25 +384,54 @@ WLCmaster(Client cntxt, MalBlkPtr mb, Ma
                        wlcr_logs = NULL;
                        throw(SQL,"wlcr.master","Could not create %s\n", 
wlcr_logs);
                }
-               wlcr_role = WLCR_STARTED;
-               WLCsetConfig();
-       } else{
-               WLCgetConfig();
-               if( role){
-                       if(role == WLCR_RESUMED){
-                               wlcr_role = WLCR_STARTED;
-                       } else
-                               wlcr_role = role;
-                       if( role == WLCR_PAUSED)
-                               wlcr_pausetag = wlcr_tag;
-                       WLCsetConfig();
-               }
-       }
-#ifdef _WLC_DEBUG_
-       mnstr_printf(cntxt->fdout,"#master batches %d file open %d\n", 
wlcr_batches,  wlcr_fd != NULL);
-#endif
-       if(role == WLCR_RESUMED)
-               throw(MAL,"wlcr.master","#WARNING: %d update transaction missed 
due to paused logging", wlcr_tag - wlcr_pausetag);
+       } 
+       wlcr_role= WLCR_RUN;
+       WLCsetConfig();
+       return MAL_SUCCEED;
+}
+
+str 
+WLCpausemaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{      
+       (void) cntxt;
+       (void) mb;
+       (void) stk;
+       (void) pci;
+       if( wlcr_role != WLCR_RUN )
+               throw(MAL,"master","WARNING: master role not active");
+       wlcr_role = WLCR_PAUSE;
+       wlcr_pausetag = wlcr_tag;
+       WLCsetConfig();
+       return MAL_SUCCEED;
+}
+
+str 
+WLCresumemaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{      
+       (void) cntxt;
+       (void) mb;
+       (void) stk;
+       (void) pci;
+       if( wlcr_role != WLCR_PAUSE )
+               throw(MAL,"master","WARNING: master role not suspended");
+       wlcr_role = WLCR_RUN;
+       WLCsetConfig();
+       if( wlcr_tag - wlcr_pausetag)
+               throw(MAL,"wlcr.master","#WARNING: %d updates missed due to 
paused logging", wlcr_tag - wlcr_pausetag);
+       return MAL_SUCCEED;
+}
+
+str 
+WLCstopmaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{      
+       (void) cntxt;
+       (void) mb;
+       (void) stk;
+       (void) pci;
+       if( wlcr_role != WLCR_RUN )
+               throw(MAL,"master","WARNING: master role not active");
+       wlcr_role = WLCR_STOP;
+       WLCsetConfig();
        return MAL_SUCCEED;
 }
 
@@ -806,6 +813,12 @@ WLCwrite(Client cntxt)
        if( cntxt->wlcr == 0 || cntxt->wlcr->stop <= 1)
                return MAL_SUCCEED;
 
+       if( wlcr_role != WLCR_RUN){
+               trimMalVariables(cntxt->wlcr, NULL);
+               resetMalBlk(cntxt->wlcr, 0);
+               cntxt->wlcr_kind = WLCR_QUERY;
+               return MAL_SUCCEED;
+       }
        if( wlcr_logs ){        
                if( wlcr_start + wlcr_drift < GDKms()/1000)
                        WLCcloselogger();
@@ -821,7 +834,7 @@ WLCwrite(Client cntxt)
                else {
                        // filter out queries that run too shortly
                        p = getInstrPtr(cntxt->wlcr,0);
-                       if ( wlcr_role != WLCR_STOPPED && ( cntxt->wlcr_kind != 
WLCR_QUERY ||  wlcr_threshold == 0 || wlcr_threshold < GDKms() - p->ticks ) ){
+                       if (  cntxt->wlcr_kind != WLCR_QUERY ||  wlcr_threshold 
== 0 || wlcr_threshold < GDKms() - p->ticks ){
                                MT_lock_set(&wlcr_lock);
                                p = getInstrPtr(cntxt->wlcr,0);
                                p = pushLng(cntxt->wlcr,p, GDKms() - p->ticks);
@@ -842,7 +855,7 @@ WLCwrite(Client cntxt)
 #ifdef _WLC_DEBUG_
        printFunction(cntxt->fdout, cntxt->wlcr, 0, LIST_MAL_ALL );
 #endif
-       if( wlcr_role == WLCR_STOPPED)
+       if( wlcr_role == WLCR_STOP)
                throw(MAL,"wlcr.write","Logging for this snapshot has been 
stopped. Use a new snapshot to continue logging.");
        return msg;
 }
diff --git a/monetdb5/modules/mal/wlcr.h b/monetdb5/modules/mal/wlcr.h
--- a/monetdb5/modules/mal/wlcr.h
+++ b/monetdb5/modules/mal/wlcr.h
@@ -23,10 +23,9 @@
 #define WLCR_IGNORE            4
 
 /* WLCR modes */
-#define WLCR_STARTED   1       // started for the current snapshot
-#define WLCR_PAUSED            2       // suspend the creation of log files
-#define WLCR_RESUMED   3       // restart log file creation
-#define WLCR_STOPPED   4       // finished last log file for this snapsho
+#define WLCR_RUN               1       // started for the current snapshot
+#define WLCR_PAUSE             2       // suspend the creation of log files
+#define WLCR_STOP              3       // finished last log file for this 
snapsho
 
 mal_export int wlcr_threshold;
 mal_export int wlcr_batches;
@@ -40,6 +39,9 @@ mal_export int WLCused(void);
 mal_export str WLCgetConfig(void);
 mal_export str WLCinitCmd(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 mal_export str WLCmaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
+mal_export str WLCpausemaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+mal_export str WLCresumemaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+mal_export str WLCstopmaster(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WLClogthreshold(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WLClogrollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 mal_export str WLCdrift(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
diff --git a/monetdb5/modules/mal/wlcr.mal b/monetdb5/modules/mal/wlcr.mal
--- a/monetdb5/modules/mal/wlcr.mal
+++ b/monetdb5/modules/mal/wlcr.mal
@@ -19,6 +19,22 @@ pattern master()
 address WLCmaster
 comment "Activate the workload-capture-replay";
 
+pattern master(path:str)
+address WLCmaster
+comment "Activate the workload-capture-replay. Use a different location for 
the logs.";
+
+pattern pausemaster()
+address WLCpausemaster
+comment "Suspend capturing the logs";
+
+pattern resumemaster()
+address WLCresumemaster
+comment "Resume capturing the logs";
+
+pattern stopmaster()
+address WLCstopmaster
+comment "Stop capturing the logs";
+
 pattern drift(duration:int)
 address WLCdrift
 comment "Maximal duration of collecting a transaction log befor releasing it";
diff --git a/sql/backends/monet5/sql_wlcr.c b/sql/backends/monet5/sql_wlcr.c
--- a/sql/backends/monet5/sql_wlcr.c
+++ b/sql/backends/monet5/sql_wlcr.c
@@ -283,13 +283,19 @@ WLRprocess(void *arg)
                                        msg= runMAL(c,mb,0,0);
                                        wlr_tag++;
                                        WLRsetConfig();
+                                       // ignore warnings
+                                       if (msg && strstr(msg,"WARNING"))
+                                               msg = MAL_SUCCEED;
                                        if( msg != MAL_SUCCEED){
                                                // they should always succeed
                                                mnstr_printf(GDKerr,"ERROR in 
processing batch %d :%s\n", i, msg);
                                                printFunction(GDKerr, mb, 0, 
LIST_MAL_DEBUG );
                                                mvc_rollback(sql,0,NULL);
-                                               break;
-                                       }
+                                               // cleanup
+                                               resetMalBlk(mb, 1);
+                                               trimMalVariables(mb, NULL);
+                                               pc = 0;
+                                       } else
                                        if( mvc_commit(sql, 0, 0) < 0)
                                                
mnstr_printf(GDKerr,"#wlcr.process transaction commit failed");
                                } else {
@@ -303,6 +309,12 @@ WLRprocess(void *arg)
                                resetMalBlk(mb, 1);
                                trimMalVariables(mb, NULL);
                                pc = 0;
+                       } else
+                       if ( getModuleId(q) == wlrRef && getFunctionId(q) == 
rollbackRef ){
+                               // cleanup
+                               resetMalBlk(mb, 1);
+                               trimMalVariables(mb, NULL);
+                               pc = 0;
                        }
                } while( mb->errors == 0 && pc != mb->stop);
                wlr_nextbatch++;
diff --git a/sql/scripts/60_wlcr.sql b/sql/scripts/60_wlcr.sql
--- a/sql/scripts/60_wlcr.sql
+++ b/sql/scripts/60_wlcr.sql
@@ -7,6 +7,21 @@
 -- Workload Capture and Replay
 
 -- Master commands
+create procedure master()
+external name wlcr.master;
+
+create procedure master(path string)
+external name wlcr.master;
+
+create procedure pausemaster()
+external name wlcr.pausemaster;
+
+create procedure resumemaster()
+external name wlcr.resumemaster;
+
+create procedure stopmaster()
+external name wlcr.stopmaster;
+
 create procedure logthreshold(duration int)
 external name wlcr.logthreshold;
 
@@ -16,9 +31,6 @@ external name wlcr.logrollback;
 create procedure drift(duration int)
 external name wlcr.drift;
 
-create procedure master()
-external name wlcr.master;
-
 create procedure master(role integer)
 external name wlcr.master;
 
diff --git a/sql/test/wlcr/Tests/All b/sql/test/wlcr/Tests/All
--- a/sql/test/wlcr/Tests/All
+++ b/sql/test/wlcr/Tests/All
@@ -27,3 +27,7 @@ wlr40
 #clear the complete table
 wlc50
 wlr50
+
+#shuffle the master state
+wlc60
+wlr60
diff --git a/sql/test/wlcr/Tests/wlc60.py b/sql/test/wlcr/Tests/wlc60.py
new file mode 100644
--- /dev/null
+++ b/sql/test/wlcr/Tests/wlc60.py
@@ -0,0 +1,46 @@
+try:
+    from MonetDBtesting import process
+except ImportError:
+    import process
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to