Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package cowsql for openSUSE:Factory checked in at 2024-04-02 16:42:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cowsql (Old) and /work/SRC/openSUSE:Factory/.cowsql.new.1905 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cowsql" Tue Apr 2 16:42:57 2024 rev:2 rq:1163774 version:1.15.6 Changes: -------- --- /work/SRC/openSUSE:Factory/cowsql/cowsql.changes 2024-02-22 20:59:15.508792287 +0100 +++ /work/SRC/openSUSE:Factory/.cowsql.new.1905/cowsql.changes 2024-04-02 16:44:44.794153292 +0200 @@ -1,0 +2,8 @@ +Sun Mar 31 09:05:19 UTC 2024 - Andreas Stieger <andreas.stie...@gmx.de> + +- update to 1.15.6: + * leader: Fix double-frees + * More raft protocol errors are translated into sqlite errors + * Improved handling of SQLITE_DIRECT_OVERFLOW_READ + +------------------------------------------------------------------- Old: ---- cowsql-1.15.4.tar.gz New: ---- cowsql-1.15.6.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cowsql.spec ++++++ --- /var/tmp/diff_new_pack.55ibBg/_old 2024-04-02 16:44:45.394174710 +0200 +++ /var/tmp/diff_new_pack.55ibBg/_new 2024-04-02 16:44:45.394174710 +0200 @@ -18,12 +18,10 @@ %define lname libcowsql0 Name: cowsql -Version: 1.15.4 +Version: 1.15.6 Release: 0 Summary: Embeddable, replicated and fault tolerant SQL engine License: LGPL-3.0-only WITH LGPL-3.0-linking-exception -# FIXME: use correct group or remove it, see "https://en.opensuse.org/openSUSE:Package_group_guidelines" -Group: https://github.com/cowsql/cowsql URL: https://github.com/cowsql/cowsql Source: https://github.com/cowsql/cowsql/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz BuildRequires: autoconf @@ -87,6 +85,9 @@ %ldconfig_scriptlets -n %{lname} +%check +%make_build check + %files devel %license LICENSE %doc AUTHORS README.md ++++++ cowsql-1.15.4.tar.gz -> cowsql-1.15.6.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/README.md new/cowsql-1.15.6/README.md --- old/cowsql-1.15.4/README.md 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/README.md 2024-03-29 11:28:23.000000000 +0100 @@ -79,7 +79,7 @@ cowsql's [dev PPA](https://launchpad.net/~cowsql/+archive/ubuntu/master): ``` -sudo add-apt-repository ppa:cowsql/master +sudo add-apt-repository ppa:cowsql/main sudo apt-get update sudo apt-get install libcowsql-dev ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/README_CH.md new/cowsql-1.15.6/README_CH.md --- old/cowsql-1.15.4/README_CH.md 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/README_CH.md 2024-03-29 11:28:23.000000000 +0100 @@ -5,9 +5,16 @@ **注æ**ï¼ä¸æææ¡£æå¯è½æªåæ¶æ´æ°ï¼è¯·ä»¥ææ°çè±æ[readme](./README.md)为åã -[cowsql](https://cowsql.io)æ¯ä¸ä¸ªç¨Cè¯è¨å¼åçå¯åµå ¥çï¼æ¯ææµå¤å¶çæ°æ®åºå¼æï¼å ·å¤é«å¯ç¨æ§åèªå¨æ é转移åè½ã +[cowsql](https://cowsql.dev) (/ËkaÊ,siËkwÉl/ +[listen](http://ipa-reader.xyz/?text=%CB%88ka%CA%8A%2Csi%CB%90kw%C9%99l)) æ¯ä¸ä¸ªç¨Cè¯è¨å¼åçå¯åµå ¥çï¼æ¯ææµå¤å¶çæ°æ®åºå¼æï¼å ·å¤é«å¯ç¨æ§åèªå¨æ é转移åè½ã -âcowsqlâæ¯âdistributed SQLiteâçç®åï¼å³åå¸å¼SQLiteãæå³çcowsqléè¿ç½ç»åè®®æ©å±SQLiteï¼å°åºç¨ç¨åºçå个å®ä¾è¿æ¥å¨ä¸èµ·ï¼è®©å®ä»¬ä½ä¸ºä¸ä¸ªé«å¯ç¨çé群ï¼èä¸ä¾èµå¤é¨æ°æ®åºã +cowsqléè¿ç½ç»åè®®æ©å±[SQLite](https://sqlite.org/)ï¼å°åºç¨ç¨åºçå个å®ä¾è¿æ¥å¨ä¸èµ·ï¼è®©å®ä»¬ä½ä¸ºä¸ä¸ªé«å¯ç¨çé群ï¼èä¸ä¾èµå¤é¨æ°æ®åºã + +"cowsql"åå大è´åæ["å® ç©ä¸ç²å£åºç¨æ辨"](https://iamondemand.com/blog/devops-concepts-pets-vs-cattle/)ï¼å é¤æé建ä¸ä¸ªåå¨ä½¿ç¨cowsqlåºç¨çç¹å®èç¹ï¼åºç¨åºæ¬ä½¿ç¨ä¸åå½±åã + +## Canonical dqlite åæ¯ + +cowsql æ¯Canonical [dqlite](https://github.com/canonical/dqlite)项ç®ä¸ä¸ªåæ¯ï¼dqliteåå ä¹æ¯cowsqlä½è [èªå·±](https://github.com/canonical/dqlite/commits?author=freeekanayaka)å½æ¶å¨Canonicalå·¥ä½æ¶åå¼åçã ## è®¾è®¡äº®ç¹ @@ -84,4 +91,4 @@ ## 注æäºé¡¹ -å½ç¯å¢åéLIBRAFT_TRACEå¨å¯å¨æ¶è¢«è®¾ç½®ï¼å°å¯ç¨è¯¦ç»è·è¸ªã \ No newline at end of file +å½ç¯å¢åéLIBRAFT_TRACEå¨å¯å¨æ¶è¢«è®¾ç½®ï¼å°å¯ç¨è¯¦ç»è·è¸ªã diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/configure.ac new/cowsql-1.15.6/configure.ac --- old/cowsql-1.15.4/configure.ac 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/configure.ac 2024-03-29 11:28:23.000000000 +0100 @@ -1,5 +1,5 @@ AC_PREREQ(2.60) -AC_INIT([libcowsql], [1.15.4], [https://github.com/cowsql/cowsql]) +AC_INIT([libcowsql], [1.15.6], [https://github.com/cowsql/cowsql]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([ac]) @@ -54,7 +54,7 @@ # Checks for libraries PKG_CHECK_MODULES(SQLITE, [sqlite3 >= 3.22.0], [], []) PKG_CHECK_MODULES(UV, [libuv >= 1.8.0], [], []) -PKG_CHECK_MODULES(RAFT, [raft >= 0.17.1], [], []) +PKG_CHECK_MODULES(RAFT, [raft >= 0.18], [], []) CC_CHECK_FLAGS_APPEND([AM_CFLAGS],[CFLAGS],[ \ -std=c11 \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/include/cowsql.h new/cowsql-1.15.6/include/cowsql.h --- old/cowsql-1.15.4/include/cowsql.h 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/include/cowsql.h 2024-03-29 11:28:23.000000000 +0100 @@ -26,8 +26,8 @@ * Version. */ #define COWSQL_VERSION_MAJOR 1 -#define COWSQL_VERSION_MINOR 14 -#define COWSQL_VERSION_RELEASE 0 +#define COWSQL_VERSION_MINOR 15 +#define COWSQL_VERSION_RELEASE 6 #define COWSQL_VERSION_NUMBER \ (COWSQL_VERSION_MAJOR * 100 * 100 + COWSQL_VERSION_MINOR * 100 + \ COWSQL_VERSION_RELEASE) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/src/client/protocol.c new/cowsql-1.15.6/src/client/protocol.c --- old/cowsql-1.15.4/src/client/protocol.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/src/client/protocol.c 2024-03-29 11:28:23.000000000 +0100 @@ -139,8 +139,10 @@ assert(rv == 0); if (context != NULL) { millis = - (context->deadline.tv_sec - now.tv_sec) * 1000 + - (context->deadline.tv_nsec - now.tv_nsec) / 1000000; + (long)((context->deadline.tv_sec - now.tv_sec) * + 1000 + + (context->deadline.tv_nsec - now.tv_nsec) / + 1000000); if (millis < 0) { /* poll(2) will block indefinitely if the * timeout argument is negative, and we don't @@ -219,8 +221,10 @@ assert(rv == 0); if (context != NULL) { millis = - (context->deadline.tv_sec - now.tv_sec) * 1000 + - (context->deadline.tv_nsec - now.tv_nsec) / 1000000; + (long)((context->deadline.tv_sec - now.tv_sec) * + 1000 + + (context->deadline.tv_nsec - now.tv_nsec) / + 1000000); if (millis < 0) { /* poll(2) will block indefinitely if the * timeout argument is negative, and we don't diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/src/gateway.c new/cowsql-1.15.6/src/gateway.c --- old/cowsql-1.15.4/src/gateway.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/src/gateway.c 2024-03-29 11:28:23.000000000 +0100 @@ -43,6 +43,7 @@ if (g->req != NULL) { if (g->leader->inflight != NULL) { tracef("finish inflight apply request"); + g->leader->inflight->canceled = true; struct raft_apply *req = &g->leader->inflight->req; req->cb(req, reason, NULL); assert(g->req == NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/src/leader.c new/cowsql-1.15.6/src/leader.c --- old/cowsql-1.15.4/src/leader.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/src/leader.c 2024-03-29 11:28:23.000000000 +0100 @@ -238,7 +238,7 @@ tracef("apply frames cb id:%" PRIu64, idExtract(req->req_id)); struct apply *apply = req->data; struct leader *l = apply->leader; - if (l == NULL) { + if (l == NULL || apply->fired) { raft_free(apply); return; } @@ -276,7 +276,13 @@ VfsAbort(vfs, l->db->filename); } - raft_free(apply); + apply->fired = true; + + /* Don't free the request object if we're being canceled by + * gateway__leader_close, as raft will call this callback again. */ + if (!apply->canceled) { + raft_free(apply); + } if (status == 0) { leaderMaybeCheckpointLegacy(l); @@ -324,10 +330,15 @@ apply->leader = req->leader; apply->req.data = apply; apply->type = COMMAND_FRAMES; + apply->canceled = false; + apply->fired = false; idSet(apply->req.req_id, req->id); rv = raft_apply(l->raft, &apply->req, &buf, 1, leaderApplyFramesCb); if (rv != 0) { + if (rv == RAFT_NOSPACE) { + rv = SQLITE_IOERR_WRITE; + } tracef("raft apply failed %d", rv); goto err_after_command_encode; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/src/leader.h new/cowsql-1.15.6/src/leader.h --- old/cowsql-1.15.4/src/leader.h 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/src/leader.h 2024-03-29 11:28:23.000000000 +0100 @@ -29,12 +29,8 @@ int status; /* Raft apply result */ struct leader *leader; /* Leader connection that triggered the hook */ int type; /* Command type */ - union { /* Command-specific data */ - struct - { - bool is_commit; - } frames; - }; + bool canceled; /* Request canceled by gateway__leader_close */ + bool fired; /* True if the req callback was fired. */ }; struct leader diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/src/vfs.c new/cowsql-1.15.6/src/vfs.c --- old/cowsql-1.15.4/src/vfs.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/src/vfs.c 2024-03-29 11:28:23.000000000 +0100 @@ -796,10 +796,13 @@ assert(amount <= (int)page_size); pgno = 1; } else { - /* For pages greater than 1, we expect a full - * page read, with an offset that starts exectly - * at the page boundary. */ - assert(amount == (int)page_size); + /* For pages greater than 1, we expect an offset + * that starts exactly at a page boundary. The read + * size can be less than a full page when SQLite + * is compiled with SQLITE_DIRECT_OVERFLOW_READ + * (enabled by default since 3.45.1). */ + assert(amount <= (int)page_size); + assert((offset % (int)page_size) == 0); pgno = (unsigned)(offset / (int)page_size) + 1; } @@ -812,7 +815,7 @@ /* Read the desired part of page 1. */ memcpy(buf, (char *)page + offset, (size_t)amount); } else { - /* Read the full page. */ + /* Read the page. */ memcpy(buf, page, (size_t)amount); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/test/integration/test_role_management.c new/cowsql-1.15.6/test/integration/test_role_management.c --- old/cowsql-1.15.4/test/integration/test_role_management.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/test/integration/test_role_management.c 2024-03-29 11:28:23.000000000 +0100 @@ -110,6 +110,11 @@ const char *address = "@2"; int tries; + /* TODO: this test is time-dependant and flaky on some platforms */ + if (getenv("CI") == NULL) { + return MUNIT_SKIP; + } + HANDSHAKE; id = 2; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cowsql-1.15.4/test/lib/server.c new/cowsql-1.15.6/test/lib/server.c --- old/cowsql-1.15.4/test/lib/server.c 2023-11-04 21:25:04.000000000 +0100 +++ new/cowsql-1.15.6/test/lib/server.c 2024-03-29 11:28:23.000000000 +0100 @@ -82,31 +82,35 @@ munit_assert_int(rv, ==, 0); } - const char *target_voters_param = - munit_parameters_get(params, "target_voters"); - if (target_voters_param != NULL) { - int n = atoi(target_voters_param); - rv = cowsql_node_set_target_voters(s->cowsql, n); - munit_assert_int(rv, ==, 0); - } - - const char *target_standbys_param = - munit_parameters_get(params, "target_standbys"); - if (target_standbys_param != NULL) { - int n = atoi(target_standbys_param); - rv = cowsql_node_set_target_standbys(s->cowsql, n); - munit_assert_int(rv, ==, 0); - } + if (getenv("CI") != NULL) { + const char *target_voters_param = + munit_parameters_get(params, "target_voters"); + if (target_voters_param != NULL) { + int n = atoi(target_voters_param); + rv = cowsql_node_set_target_voters(s->cowsql, n); + munit_assert_int(rv, ==, 0); + } - const char *role_management_param = - munit_parameters_get(params, "role_management"); - if (role_management_param != NULL) { - bool role_management = (bool)atoi(role_management_param); - s->role_management = role_management; - if (role_management) { - rv = cowsql_node_enable_role_management(s->cowsql); + const char *target_standbys_param = + munit_parameters_get(params, "target_standbys"); + if (target_standbys_param != NULL) { + int n = atoi(target_standbys_param); + rv = cowsql_node_set_target_standbys(s->cowsql, n); munit_assert_int(rv, ==, 0); } + + const char *role_management_param = + munit_parameters_get(params, "role_management"); + if (role_management_param != NULL) { + bool role_management = + (bool)atoi(role_management_param); + s->role_management = role_management; + if (role_management) { + rv = cowsql_node_enable_role_management( + s->cowsql); + munit_assert_int(rv, ==, 0); + } + } } rv = cowsql_node_start(s->cowsql);