Changeset: 532040f4f0ff for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=532040f4f0ff
Added Files:
        monetdb5/modules/mal/wlc.c
        monetdb5/modules/mal/wlc.h
        monetdb5/modules/mal/wlc.mal
        monetdb5/optimizer/opt_wlc.c
        monetdb5/optimizer/opt_wlc.h
        sql/backends/monet5/wlr.c
        sql/backends/monet5/wlr.h
        sql/backends/monet5/wlr.mal
Removed Files:
        monetdb5/modules/mal/wlcr.c
        monetdb5/modules/mal/wlcr.h
        monetdb5/modules/mal/wlcr.mal
        monetdb5/optimizer/opt_wlcr.c
        monetdb5/optimizer/opt_wlcr.h
        sql/backends/monet5/sql_wlcr.c
        sql/backends/monet5/sql_wlcr.h
        sql/backends/monet5/sql_wlcr.mal
Modified Files:
        monetdb5/mal/mal.c
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_client.h
        monetdb5/modules/mal/Makefile.ag
        monetdb5/modules/mal/mal_init.mal
        monetdb5/optimizer/Makefile.ag
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        monetdb5/optimizer/opt_support.c
        monetdb5/optimizer/opt_wrapper.c
        monetdb5/optimizer/optimizer.mal
        sql/backends/monet5/40_sql.mal
        sql/backends/monet5/Makefile.ag
        sql/backends/monet5/sql_scenario.c
        sql/scripts/60_wlcr.sql
        sql/server/sql_mvc.c
        sql/test/wlcr/Tests/wlc01.py
Branch: wlcr
Log Message:

Simplify the interface
- use a heartbeat approach
- split wlcr naming according to their role
- update documentation


diffs (truncated from 1626 to 300 lines):

diff --git a/monetdb5/mal/mal.c b/monetdb5/mal/mal.c
--- a/monetdb5/mal/mal.c
+++ b/monetdb5/mal/mal.c
@@ -36,7 +36,7 @@ int have_hge;
 #include "mal_runtime.h"
 #include "mal_resource.h"
 #include "opt_statistics.h"
-#include "wlcr.h"
+#include "wlc.h"
 
 MT_Lock     mal_contextLock MT_LOCK_INITIALIZER("mal_contextLock");
 MT_Lock     mal_namespaceLock MT_LOCK_INITIALIZER("mal_namespaceLock");
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -242,8 +242,8 @@ MCinitClientRecord(Client c, oid user, b
        /* create a recycler cache */
        c->exception_buf_initialized = 0;
        c->error_row = c->error_fld = c->error_msg = c->error_input = NULL;
-       c->wlcr_kind = 0;
-       c->wlcr = NULL;
+       c->wlc_kind = 0;
+       c->wlc = NULL;
 #ifndef HAVE_EMBEDDED /* no authentication in embedded mode */
        {
                str msg = AUTHgetUsername(&c->username, c);
@@ -396,10 +396,10 @@ freeClient(Client c)
                BBPrelease(c->error_msg->batCacheid);
                BBPrelease(c->error_input->batCacheid);
                c->error_row = c->error_fld = c->error_msg = c->error_input = 
NULL;
-               if( c->wlcr)
-                       freeMalBlk(c->wlcr);
-               c->wlcr_kind = 0;
-               c->wlcr = NULL;
+               if( c->wlc)
+                       freeMalBlk(c->wlc);
+               c->wlc_kind = 0;
+               c->wlc = NULL;
        }
        if (t)
                THRdel(t);  /* you may perform suicide */
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -176,8 +176,8 @@ typedef struct CLIENT {
         * It is split into the capturing part (wlc) and the replay part (wlr).
         * This allows a single server to act as both a master and a replica.
         */
-       int wlcr_kind;  // used by master to characterise the compound 
transaction
-       MalBlkPtr wlcr;
+       int wlc_kind;   // used by master to characterise the compound 
transaction
+       MalBlkPtr wlc;
 
        /*      
         *      Errors during copy into are collected in a user specific column 
set
diff --git a/monetdb5/modules/mal/Makefile.ag b/monetdb5/modules/mal/Makefile.ag
--- a/monetdb5/modules/mal/Makefile.ag
+++ b/monetdb5/modules/mal/Makefile.ag
@@ -36,7 +36,7 @@ lib_mal = {
                mkey.c mkey.h \
                manifold.c manifold.h \
                oltp.c oltp.h \
-               wlcr.c wlcr.h \
+               wlc.c wlc.h \
                pcre.c \
                profiler.c profiler.h \
                querylog.c querylog.h \
@@ -60,7 +60,7 @@ headers_mal = {
                inspect.mal manual.mal mal_io.mal mkey.mal manifold.mal \
                iterator.mal clients.mal \
                factories.mal groupby.mal mdb.mal pcre.mal mat.mal \
-               transaction.mal oltp.mal wlcr.mal \
+               transaction.mal oltp.mal wlc.mal \
                mal_mapi.mal sabaoth.mal remote.mal  \
                txtsim.mal \
                tokenizer.mal sample.mal json_util.mal \
diff --git a/monetdb5/modules/mal/mal_init.mal 
b/monetdb5/modules/mal/mal_init.mal
--- a/monetdb5/modules/mal/mal_init.mal
+++ b/monetdb5/modules/mal/mal_init.mal
@@ -94,7 +94,7 @@ include srvpool;
 
 include mal_mapi;
 include oltp;
-include wlcr;
+include wlc;
 
 # Any extensions (MAL scripts) that should be automatically loaded upon
 # startup can be placed in the autoload directory.  One typically finds
diff --git a/monetdb5/modules/mal/wlcr.c b/monetdb5/modules/mal/wlc.c
rename from monetdb5/modules/mal/wlcr.c
rename to monetdb5/modules/mal/wlc.c
--- a/monetdb5/modules/mal/wlcr.c
+++ b/monetdb5/modules/mal/wlc.c
@@ -23,16 +23,18 @@
  * the snapshot until a specific time point or transaction id is reached. 
  * 
  * Some systems also use the logical logs to REPLAY all (expensive) queries
- * against the database. We skip this for the time being.
+ * against the database. We skip this for the time being, as those queries
+ * can be captured already in the server.
  *
  * The goal of this module is to ease BACKUP and REPPLICATION of a master 
database 
- * with a time-bounded delay. 
- * Such a clone is a database replica that aid in query workload sharing,
- * database versioning, and (re-)partitioning.
- * Tables taken from the master version are not protected against local 
updates.
- * However, any transaction being replay that fails finalizes the cloning 
process.
+ * with a time-bounded delay. This means that both master and replica run at a 
certain beat
+ * (in seconds) by which information is made available or read by the replica.
+ *
+ * Such a replica in query workload sharing, database versioning, and 
(re-)partitioning.
+ * Tables taken from the master are not protected against local updates.
+ * However, any replay transaction that fails stops the cloning process.
  * Furthermore, only persistent tables are considered for replication.
- * Tables under the 'tmp' schema are ignored.
+ * Updates under the 'tmp' schema are ignored.
  *
  * Simplicity and ease of end-user control has been the driving argument here.
  *
@@ -45,46 +47,46 @@
  * CALL master()
  * An alternative path to the log records can be given to reduce the IO 
latency,
  * e.g. a nearby SSD.
- * By default, it creates a directory .../dbfarm/dbname/wlcr_logs to hold all 
+ * By default, it creates a directory .../dbfarm/dbname/wlc_logs to hold all 
  * necessary information for the creation of a database clone.
  *
  * A master configuration file is added to the database directory to keep the 
state/
  * It contains the following key=value pairs:
  *             snapshot=<path to a snapshot directory>
- *             logs=<path to the wlcr log directory>
+ *             logs=<path to the wlc log directory>
  *             state=<started, stopped>
  *             batches=<next available batch file to be applied>
- *             drift=<maximal delay before transactions are published as a 
separate log, in seconds>
+ *             beat=<maximal delay between log files, in seconds>
  *             write=<timestamp of the last transaction recorded>
  *
  * A missing path to the snapshot denotes that we can start the clone with an 
empty database.
  * The log files are stored as master/<dbname>_<batchnumber>. They belong to 
the snapshot.
  * 
- * Each wlcr log file contains a serial log of committed compound transactions.
+ * Each wlc log file contains a serial log of committed compound transactions.
  * The log records are represented as ordinary MAL statement blocks, which
  * are executed in serial mode. (parallelism can be considered for large 
updates later)
  * Each transaction job is identified by a unique id, its starting time, and 
the user responsible..
  * The log-record should end with a commit.
  *
- * A transaction log is created by the master. He decides when the log may be 
globally used.
- * The trigger for this is the allowed 'drift'. A new transaction log file is 
published when
- * the system has been collecting logs for some time (drift in seconds).
- * The drift determines the maximal window of transactions loss that is 
permitted.
- * The maximum drift can be set using a SQL command, e.g.
- * CALL setmasterdrift(duration)
+ * A transaction log is created by the master using a heartbeat (in seconds).
+ * A new transaction log file is published when the system has been 
+ * collecting logs for some time.
+ * The cycle time determines the drift of the replica, excluding its own speed 
to catch up.
+ * The beat can be set using a SQL command, e.g.
+ * CALL masterbeat(duration)
  * Setting it to zero leads to a log file per transaction and may cause a 
large log directory.
  * A default of 5 minutes should balance polling overhead in most practical 
situations.
  *
  * A minor problem here is that we should ensure that the log file is closed 
even if there
  * are no transactions running. It is solved with a separate monitor thread, 
which ensures
- * that the logs are flushed at least after 'drift' seconds since the first 
logrecord was created.
+ * that the logs are flushed at least after 'beat' seconds since the first 
logrecord was created.
  * After closing, the replicas can see from the master configuration file that 
a new log batch is available.
  *
  * The final step is to close stop transaction logging with the command
  * CALL stopmaster().
  * It typically is the end-of-life-time for a snapshot. For example, when 
planning to do
  * a large bulk load of the database, stopping logging avoids a double write 
into the
- * database. The database can be brought back into wlcr mode using a fresh 
snapshot.
+ * database. The database can be brought back into wlc mode using a fresh 
snapshot.
  *
  *[TODO] A more secure way to set a database into master mode is to use the 
command
  *      monetdb master <dbname> [ <optional snapshot path>]
@@ -122,30 +124,30 @@
  *
  * SELECT replicaClock();
  * returns the timestamp of the last replicated transaction.
- * SELECT replicaBacklog();
- * returns the number of pending transactions to be in sink with master.
+ * SELECT replicaTick();
+ * returns the transaction id of the last replicated transaction.
  * SELECT masterClock();
  * return the timestamp of the last committed transaction in the master.
+ * SELECT masterTick();
+ * return the transaction id of the last committed transaction in the master.
  *
  * Any failure encountered during a log replay terminates the replication 
process,
  * leaving a message in the merovingian log configuration.
  *
- * The wlcr files purposely have a textual format derived from the MAL 
statements.
+ * The wlc files purposely have a textual format derived from the MAL 
statements.
  * This provides a stepping stone for remote execution later.
  *
- * [TODO] consider the roll forward of SQL session variables, i.e. 
optimizer_pipe (for now assume default pipe).
+ * [TODO] consider the roll forward of SQL session variables, i.e. 
optimizer_pipe
  * For updates we don't need special care for this.
- * [TODO] limit replication logs to persistent tables. Temporary tables should 
never be forwarded to the clone.
  */
 #include "monetdb_config.h"
 #include <time.h>
 #include "mal_builder.h"
-#include "wlcr.h"
+#include "wlc.h"
 
-MT_Lock     wlcr_lock MT_LOCK_INITIALIZER("wlcr_lock");
+MT_Lock     wlc_lock MT_LOCK_INITIALIZER("wlc_lock");
 
 static char wlc_snapshot[PATHLENGTH]; // The location of the snapshot against 
which the logs work
-static lng wlc_start= 0;                       // Start time of first 
transaction
 static stream *wlc_fd = 0;
 
 // These properties are needed by the replica to direct the roll-forward.
@@ -155,13 +157,13 @@ lng   wlc_id = 0;                 // next transaction 
 int  wlc_state = 0;                    // The current status of the in the 
life cycle
 char wlc_write[26];                    // The timestamp of the last committed 
transaction
 int  wlc_batches = 0;          // identifier of next batch
-int  wlc_drift = 10;           // maximal period covered by a single log file 
in seconds
+int  wlc_beat = 10;            // maximal period covered by a single log file 
in seconds
 
 /* The database snapshots are binary copies of the dbfarm/database/bat
  * New snapshots are created currently using the 'monetdb snapshot <db>' 
command
  * or a SQL procedure.
  *
- * The wlcr logs are stored in the snapshot directory as a time-stamped list
+ * The wlc logs are stored in the snapshot directory as a time-stamped list
  */
 
 int
@@ -186,8 +188,8 @@ WLCreadConfig(FILE *fd)
                        strncpy(wlc_write, path + 6, 26);
                if( strncmp("batches=", path, 8) == 0)
                        wlc_batches = atoi(path+ 8);
-               if( strncmp("drift=", path, 6) == 0)
-                       wlc_drift = atoi(path+ 6);
+               if( strncmp("beat=", path, 5) == 0)
+                       wlc_beat = atoi(path+ 5);
                if( strncmp("state=", path, 6) == 0)
                        wlc_state = atoi(path+ 6);
        }
@@ -203,7 +205,7 @@ WLCgetConfig(void){
        fd = fopen(l,"r");
        GDKfree(l);
        if( fd == NULL)
-               throw(MAL,"wlcr.getConfig","Could not access %s\n",l);
+               throw(MAL,"wlc.getConfig","Could not access %s\n",l);
        WLCreadConfig(fd);
        return MAL_SUCCEED;
 }
@@ -218,7 +220,7 @@ str WLCsetConfig(void){
        fd = open_wastream(path);
        GDKfree(path);
        if( fd == NULL)
-               throw(MAL,"wlcr.setConfig","Could not access wlc.config\n");
+               throw(MAL,"wlc.setConfig","Could not access wlc.config\n");
        if( wlc_snapshot[0] )
                mnstr_printf(fd,"snapshot=%s\n", wlc_snapshot);
        mnstr_printf(fd,"logs=%s\n", wlc_dir);
@@ -226,7 +228,7 @@ str WLCsetConfig(void){
        mnstr_printf(fd,"write=%s\n", wlc_write );
        mnstr_printf(fd,"state=%d\n", wlc_state );
        mnstr_printf(fd,"batches=%d\n", wlc_batches );
-       mnstr_printf(fd,"drift=%d\n", wlc_drift );
+       mnstr_printf(fd,"beat=%d\n", wlc_beat );
        close_stream(fd);
        return MAL_SUCCEED;
 }
@@ -239,20 +241,19 @@ WLCsetlogger(void)
        char path[PATHLENGTH];
 
        if( wlc_dir[0] == 0)
-               throw(MAL,"wlcr.setlogger","Path not initalized");
-       MT_lock_set(&wlcr_lock);
+               throw(MAL,"wlc.setlogger","Path not initalized");
+       MT_lock_set(&wlc_lock);
        snprintf(path,PATHLENGTH,"%s%c%s_%012d", wlc_dir, DIR_SEP, wlc_name, 
wlc_batches);
        wlc_fd = open_wastream(path);
        if( wlc_fd == 0){
-               MT_lock_unset(&wlcr_lock);
-               GDKerror("wlcr.logger:Could not create %s\n",path);
-               throw(MAL,"wlcr.logger","Could not create %s\n",path);
+               MT_lock_unset(&wlc_lock);
+               GDKerror("wlc.logger:Could not create %s\n",path);
+               throw(MAL,"wlc.logger","Could not create %s\n",path);
        }
 
        wlc_batches++;
-       wlc_start = GDKms()/1000;
        WLCsetConfig();
-       MT_lock_unset(&wlcr_lock);
+       MT_lock_unset(&wlc_lock);
        return MAL_SUCCEED;
 }
 
@@ -265,42 +266,39 @@ WLCcloselogger(void)
        mnstr_fsync(wlc_fd);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to