1
0
Fork 0

Merge branch 'master' of github.com:rqlite/rqlite into ready-commit

master
Philip O'Toole 7 months ago
commit db971f5073

@ -1,9 +1,17 @@
## 8.20.2 (unreleased)
## 8.21.0 (unreleased)
### New features
- [PR #1689](https://github.com/rqlite/rqlite/pull/1689): `/readyz` can wait for Commit Index.
## 8.20.3 (Feburary 17th 2024)
### Implementation changes and bug fixes
- [PR #1690](https://github.com/rqlite/rqlite/pull/1690): Check for `isTextType` in panic-proof way.
## 8.20.2 (February 16th 2024)
### Implementation changes and bug fixes
- [PR #1685](https://github.com/rqlite/rqlite/pull/1685): Rename a Proto (but not its fields).
- [PR #1686](https://github.com/rqlite/rqlite/pull/1686): Node returns _Meta_, not just Address.
- [PR #1688](https://github.com/rqlite/rqlite/pull/1688): Expose Leader Commit Index, as read from latest AppendEntries RPC.
- [PR #1689](https://github.com/rqlite/rqlite/pull/1689): `/readyz` can wait for Commit Index.
- [Commit 40e3098](https://github.com/rqlite/rqlite/commit/40e3098e3c7ab1512a6436adac32a7017d24dc4c): Seeing some boot failures locally, revert to default GZIP compression. `git bisect` shows this issue was introduced with [this change](https://github.com/rqlite/rqlite/pull/1574/files#diff-e3c4101b534a442b6f05bbaa9c1c2b9e2f459e92d865ae6654a6ae3d532a7a49).
## 8.20.1 (February 13th 2024)
### Implementation changes and bug fixes

@ -1430,8 +1430,10 @@ func normalizeRowValues(row []interface{}, types []string) ([]*command.Parameter
}
case []byte:
if isTextType(types[i]) {
values[i].Value = &command.Parameter_S{
S: string(val),
values[i] = &command.Parameter{
Value: &command.Parameter_S{
S: string(val),
},
}
} else {
values[i] = &command.Parameter{

@ -146,6 +146,35 @@ func testSQLiteTimeTypes(t *testing.T, db *DB) {
}
}
func testSQLiteRandomBlob(t *testing.T, db *DB) {
_, err := db.ExecuteStringStmt("CREATE TABLE large_data (id INTEGER PRIMARY KEY, large_text TEXT)")
if err != nil {
t.Fatalf("failed to create table: %s", err.Error())
}
_, err = db.ExecuteStringStmt(`
WITH RECURSIVE generate_large_data(id, large_text) AS (
SELECT 1, randomblob(1)
UNION ALL
SELECT id + 1, randomblob(1)
FROM generate_large_data
WHERE id < 2
)
INSERT INTO large_data(id, large_text)
SELECT id, large_text FROM generate_large_data
`)
if err != nil {
t.Fatalf("failed to create table: %s", err.Error())
}
r, err := db.QueryStringStmt("SELECT * FROM large_data LIMIT 1")
if err != nil {
t.Fatalf("failed to query master table: %s", err.Error())
}
if !strings.Contains(asJSON(r), "large_text") {
// Just check that it doesn't panic.
t.Fatalf("unexpected results for query, expected large_text, got %s", asJSON(r))
}
}
func testNotNULLField(t *testing.T, db *DB) {
_, err := db.ExecuteStringStmt("CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)")
if err != nil {
@ -1558,6 +1587,7 @@ func Test_DatabaseCommonOperations(t *testing.T) {
{"SQLiteMasterTable", testSQLiteMasterTable},
{"SQLiteTimeTypes", testSQLiteTimeTypes},
{"NotNULLField", testNotNULLField},
{"RandomBlob", testSQLiteRandomBlob},
{"EmptyStatements", testEmptyStatements},
{"SimpleSingleStatements", testSimpleSingleStatements},
{"SimpleStatementsNumeric", testSimpleStatementsNumeric},

@ -735,11 +735,18 @@ func (s *Store) WaitForCommitIndex(idx uint64, timeout time.Duration) error {
defer tck.Stop()
tmr := time.NewTimer(timeout)
defer tmr.Stop()
checkFn := func() bool {
return s.raft.CommitIndex() >= idx
}
// Try the fast path.
if checkFn() {
return nil
}
for {
select {
case <-tck.C:
if s.raft.CommitIndex() >= idx {
if checkFn() {
return nil
}
case <-tmr.C:
@ -905,7 +912,6 @@ func (s *Store) WaitForRemoval(id string, timeout time.Duration) error {
if check() {
return nil
}
tck := time.NewTicker(appliedWaitDelay)
defer tck.Stop()
tmr := time.NewTimer(timeout)
@ -939,7 +945,6 @@ func (s *Store) WaitForLeader(timeout time.Duration) (string, error) {
if check() {
return leaderAddr, nil
}
tck := time.NewTicker(leaderWaitDelay)
defer tck.Stop()
tmr := time.NewTimer(timeout)
@ -1107,7 +1112,6 @@ func (s *Store) Execute(ex *proto.ExecuteRequest) ([]*proto.ExecuteResult, error
if !s.Ready() {
return nil, ErrNotReady
}
return s.execute(ex)
}

@ -1050,23 +1050,23 @@ func Test_MultiNodeIsLeaderHasLeader(t *testing.T) {
if err := s0.Join(joinRequest(s1.ID(), s1.Addr(), true)); err != nil {
t.Fatalf("failed to join to node at %s: %s", s0.Addr(), err.Error())
}
_, err := s1.WaitForLeader(10 * time.Second)
leader, err := s1.WaitForLeader(10 * time.Second)
if err != nil {
t.Fatalf("failed to get leader address on follower: %s", err.Error())
}
if !s0.IsLeader() {
t.Fatalf("s0 is not leader")
}
if !s0.HasLeader() {
t.Fatalf("s0 does not have a leader")
}
if s1.IsLeader() {
t.Fatalf("s1 is leader")
if !s0.IsLeader() {
t.Fatalf("s0 is not leader, leader is %s", leader)
}
if !s1.HasLeader() {
t.Fatalf("s1 does not have a leader")
}
if s1.IsLeader() {
t.Fatalf("s1 is leader, leader is %s", leader)
}
}
func Test_MultiNodeStoreLogTruncation(t *testing.T) {

Loading…
Cancel
Save