diff --git a/db/config.c b/db/config.c index 84d4662857..75ef771c76 100644 --- a/db/config.c +++ b/db/config.c @@ -1261,6 +1261,8 @@ static int read_lrl_option(struct dbenv *dbenv, char *line, } else if (tokcmp(tok, ltok, "enable_snapshot_isolation") == 0) { gbl_snapisol = 1; gbl_use_modsnap_for_snapshot = 1; + if (gbl_sql_tranlevel_default == gbl_snapshot_impl) + gbl_sql_tranlevel_default = TRANLEVEL_MODSNAP; gbl_snapshot_impl = TRANLEVEL_MODSNAP; gbl_modsnap_asof = 1; } else if (tokcmp(tok, ltok, "enable_serial_isolation") == 0) { diff --git a/db/process_message.c b/db/process_message.c index 770f0564b4..c1087dc0f1 100644 --- a/db/process_message.c +++ b/db/process_message.c @@ -5144,6 +5144,8 @@ int process_command(struct dbenv *dbenv, char *line, int lline, int st) } } else if (tokcmp(tok, ltok, "do_not_use_modsnap_for_snapshot") == 0) { gbl_use_modsnap_for_snapshot = 0; + if (gbl_sql_tranlevel_default == gbl_snapshot_impl) + gbl_sql_tranlevel_default = TRANLEVEL_SNAPISOL; gbl_snapshot_impl = TRANLEVEL_SNAPISOL; } else if (tokcmp(tok, ltok, "del_llmeta_comdb2_seqno") == 0) { bdb_del_seqno(NULL); diff --git a/plugins/newsql/newsql.c b/plugins/newsql/newsql.c index e9a57e8d3c..8f0752b040 100644 --- a/plugins/newsql/newsql.c +++ b/plugins/newsql/newsql.c @@ -1746,9 +1746,18 @@ int process_set_commands(struct sqlclntstate *clnt, CDB2SQLQUERY *sql_query) sqlstr); rc = ii + 1; } else if (clnt->dbtran.mode != TRANLEVEL_SOSQL) { - snprintf(err, sizeof(err), - "transaction chunks require SOCKSQL transaction mode"); - rc = ii + 1; + int snapshot_by_default = + (clnt->dbtran.mode == TRANLEVEL_MODSNAP && gbl_sql_tranlevel_default == TRANLEVEL_MODSNAP); + if (snapshot_by_default) { + logmsg(LOGMSG_DEBUG, "snapshot is on by default, use socksql instead\n"); + clnt->dbtran.mode = TRANLEVEL_SOSQL; + clnt->dbtran.maxchunksize = tmp; + /* in chunked mode, we disable verify retries */ + clnt->verifyretry_off = 1; + } else { + snprintf(err, sizeof(err), "transaction chunks require SOCKSQL transaction mode"); + rc = ii + 1; + } } else { clnt->dbtran.maxchunksize = tmp; /* in chunked mode, we disable verify retries */ @@ -1792,9 +1801,15 @@ int process_set_commands(struct sqlclntstate *clnt, CDB2SQLQUERY *sql_query) if (clnt->dbtran.mode == TRANLEVEL_INVALID) { rc = ii + 1; } else if (clnt->dbtran.mode != TRANLEVEL_SOSQL && clnt->dbtran.maxchunksize) { - snprintf(err, sizeof(err), - "transaction chunks require SOCKSQL transaction mode"); - rc = ii + 1; + int snapshot_by_default = + (clnt->dbtran.mode == TRANLEVEL_MODSNAP && gbl_sql_tranlevel_default == TRANLEVEL_MODSNAP); + if (snapshot_by_default) { + logmsg(LOGMSG_DEBUG, "snapshot is on by default, use socksql instead\n"); + clnt->dbtran.mode = TRANLEVEL_SOSQL; + } else { + snprintf(err, sizeof(err), "transaction chunks require SOCKSQL transaction mode"); + rc = ii + 1; + } } } } else if (strncasecmp(sqlstr, "timeout", 7) == 0) { diff --git a/tests/chunk_txn_effects.test/snapshot.testopts b/tests/chunk_txn_effects.test/snapshot.testopts new file mode 100644 index 0000000000..38a0e8c63f --- /dev/null +++ b/tests/chunk_txn_effects.test/snapshot.testopts @@ -0,0 +1,2 @@ +enable_snapshot_isolation +sql_tranlevel_default snapshot