i59rh93kn60ca5p9t28e14vsuj6mv6eh · 198 rows
| id | issue_id | event_type | actor | old_value | new_value | comment | created_at |
|---|---|---|---|---|---|---|---|
| bcea305e-5ca6-4623-8b11-710a5a27b86f | tarantool-etcd-828 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:18Z |
| be256022-9e6a-4ff4-932c-654e04c46a07 | tarantool-etcd-ag2 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:28Z |
| beca352f-1006-4b4f-8d9e-65a76a3f674e | tarantool-etcd-1dk | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m2-production | 2026-05-21T14:37:04Z |
| c0beb3fb-6fd4-4d27-8652-a98fc096c766 | tarantool-etcd-234 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m3-performance | 2026-05-21T14:37:08Z |
| c1386207-32df-49c3-b25c-ee876836ea2f | tarantool-etcd-buq | created | Eugene Blikh | NULL | 2026-05-19T16:34:52Z | ||
| c414b76a-3624-4dfd-818b-f089ff9db282 | tarantool-etcd-unw | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m2-production | 2026-05-21T14:37:03Z |
| c5de34b0-c93e-4818-ae30-6aa927aede67 | tarantool-etcd-9z2 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m1-conformance | 2026-05-21T14:37:00Z |
| c6b02065-1911-4de5-8c58-703f1b1692a0 | tarantool-etcd-acp | created | Eugene Blikh | NULL | 2026-05-19T17:53:51Z | ||
| c880b8b0-ed63-4ece-b5de-692020db5a8e | tarantool-etcd-kbc | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m1-conformance | 2026-05-21T14:37:00Z |
| c9078539-4e4c-4834-97ee-a664a9929575 | tarantool-etcd-w5r | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:12Z |
| c96c50eb-e2fe-408f-963c-a7e10063d341 | tarantool-etcd-3c2 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:20Z |
| ca3b2459-193c-4ac8-b6e5-8eda8a4ef8fd | tarantool-etcd-sdt | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:29Z |
| cb892177-bcbc-4882-91f0-1785edb94ff0 | tarantool-etcd-070 | created | Eugene Blikh | NULL | 2026-05-19T17:53:57Z | ||
| ccedcf22-e6e2-405a-8858-3f9736f1fa40 | tarantool-etcd-jg3 | created | Eugene Blikh | NULL | 2026-05-20T09:17:53Z | ||
| cec28fbf-5a6f-4db7-b464-7e342c8db297 | tarantool-etcd-75u | created | Eugene Blikh | NULL | 2026-05-20T09:17:55Z | ||
| d03951d3-60b2-45c7-840f-7d0341f72993 | tarantool-etcd-wqn | created | Eugene Blikh | NULL | 2026-05-19T17:54:30Z | ||
| d2e53a79-8623-4b49-bb6e-49bbf78e2cec | tarantool-etcd-584 | created | Eugene Blikh | NULL | 2026-05-19T17:53:53Z | ||
| d635b4b2-1fd9-464f-b4b5-d6cc4ce38eef | tarantool-etcd-sqv | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:11Z |
| d6b47667-9634-4546-8b96-39a6728f21dd | tarantool-etcd-b08 | created | Eugene Blikh | NULL | 2026-05-19T16:34:09Z | ||
| da7cd87b-3369-4644-93f4-161970cc913d | tarantool-etcd-hx9 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:20Z |
| daf8dd2b-bb5f-4961-8464-27cd5bddd3f5 | tarantool-etcd-3sp | updated | Eugene Blikh | {"id":"tarantool-etcd-3sp","title":"LeaseKeepAlive fsyncs WAL on every renew","description":"On btrfs SSD bench (2026-05-19 disk run), LeaseKeepAlive/n_X drops from 4 234 ops/s (tmpfs) to 207 ops/s on tarantool while etcd holds at ~7 400 ops/s in both configs.\n\np50 goes from 224 µs (tmpfs) to 4 548 µs (disk) — exactly one btrfs fsync. Root cause at app/etcd/lease.lua:191:\n\n box.space.leases:update(id, {{'=', 'expiry_time', now + lease.ttl}})\n\nThe leases space is is_sync=true so every keep-alive does a full WAL append + fsync. Etcd's KeepAlive is an in-memory TTL bump with no disk write.\n\nFix sketch: split expiry into an in-memory map (refreshed on every KeepAlive) and persist only on grant/revoke. The expiry fiber should read from the in-memory map. Trade-off: leases may extend further into the future than the on-disk record after a crash, which is fine — clients have to re-keep-alive after reconnect anyway.\n\nSee docs/BENCH.md Linux x86_64 disk section (Open follow-ups).","status":"open","priority":2,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-05-19T17:33:47Z","created_by":"Eugene Blikh","updated_at":"2026-05-19T17:33:47Z"} | {"design":"GOAL: lease keep-alive must not touch the WAL. Mirror etcd's split — durable\nstate = {lease record, granted TTL, attached keys}; ephemeral leader-local\nstate = the expiry deadline (refreshed on every keep-alive, never persisted).\n\n=== STATE MODEL ===\nAdd a module-level in-memory map in app/etcd/lease.lua:\n local deadlines = {} -- [lease_id] = monotonic deadline (clock.monotonic()+ttl)\nThis is leader-local. Followers never keep-alive (the gRPC write gate routes\nLeaseKeepAlive to the leader), and only the leader runs the expiry fiber and\ncan revoke. So the countdown is structurally a leader concern.\n\nThe `leases` space (schema.lua:97-118) stays is_sync=true and keeps its\n{id, ttl, expiry_time, granted_ttl} format. The `expiry_time` FIELD and its\nTREE index (schema.lua:113) become vestigial — written once at grant, never\nthe source of liveness again. Leave them to avoid a space migration; an\noptional follow-up can drop the field+index. Nothing reads expiry_time after\nthis change.\n\n=== HANDLER CHANGES (app/etcd/lease.lua) ===\n1. grant() ~L70: after `box.space.leases:insert(...)`, seed\n `deadlines[id] = now + ttl`. Insert still persists (durable, required).\n2. keepalive() ~L191: REPLACE\n box.space.leases:update(id, {{'=', 'expiry_time', now + lease.ttl}})\n with\n deadlines[id] = clock.monotonic() + lease.ttl\n Keep the `box.space.leases:get(id)` existence check above it (cheap read,\n no fsync) — it supplies lease.ttl and preserves the NOT_FOUND-raises\n contract the gRPC stream handler depends on (see L169-171).\n3. revoke() ~L150: after `box.space.leases:delete(id)`, clear\n `deadlines[id] = nil`.\n4. time_to_live() ~L236: REPLACE `lease.expiry_time` read with `deadlines[id]`.\n If deadlines[id] is nil (lease loaded but not yet rebuilt), fall back to\n `clock.monotonic() + lease.granted_ttl`. remaining = max(0, floor(dl - now)).\n5. expiry_loop() L287-338: REPLACE the `box.space.leases.index.expiry_time`\n scan (L302-309) with a scan of `deadlines`: collect ids where\n `deadline \u003c= now`. Plain full-table scan is fine (numeric compares in Lua,\n runs every 500ms); a min-heap (etcd's leaseExpiredNotifier shape) is the\n optional optimization if lease counts get large. revoke() already nils the\n map entry on success.\n\n=== REBUILD ON PROMOTE ===\nAdd lease.M.rebuild_deadlines():\n clears `deadlines`, then for each tuple in box.space.leases:pairs() sets\n deadlines[tuple.id] = clock.monotonic() + tuple.ttl\nCall it in the RW branch of the box.watch('box.status', ...) callback in\napp/roles/etcd.lua (L341-353), immediately before lease.start_expiry().\nThis resets every inherited lease's deadline to a full-TTL grace period on the\nnew leader — exactly etcd's failover behavior.\n\n=== LATENT BUG THIS ALSO FIXES ===\nexpiry_time is currently computed as clock.monotonic()+ttl and REPLICATED.\nclock.monotonic() is process-local (relative to boot), so the persisted value\nis meaningless on any other node. Today a promoted replica's fiber scans\ninherited expiry_time values from a different monotonic timeline — could\nexpire leases instantly or never. Rebuild-on-promote with the new leader's own\nclock removes this entirely."} | NULL | 2026-05-20T07:39:02Z |
| dcd911a2-525b-42a5-ba99-d233997fc980 | tarantool-etcd-kbc | created | Eugene Blikh | NULL | 2026-05-19T17:11:01Z | ||
| dd019f0d-8692-4c41-8f1b-bb1af4927659 | tarantool-etcd-8ss | updated | Eugene Blikh | {"id":"tarantool-etcd-8ss","title":"Example 2: 3-node EE replicaset self-hosting its own etcd config (file → etcd migration)","description":"Add examples/tarantool-ee-self-hosted-etcd: boot a 3-instance EE replicaset (election failover) from a local cluster-config.yaml where every node runs app.roles.etcd (replicated KV store, read_pref=any). Seed the cluster's OWN etcd store with that config, then rolling-restart each instance to bootstrap from TT_CONFIG_ETCD_* (no --config). Document the cold-boot circularity: self-hosted etcd-config is HA under rolling restart but needs the local file retained as a cold-boot seed. Justfile + README + cluster-config.yaml.","status":"in_progress","priority":2,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-05-20T11:16:17Z","created_by":"Eugene Blikh","updated_at":"2026-05-20T11:16:28Z","started_at":"2026-05-20T11:16:28Z"} | {"notes":"Files written + phases 1-2 (up-file/seed/probe/config-show) verified on Community Tarantool 3.8. Ports 3501-3503/2382-2482-2582 (distinct from example-1's 3401/2379). migrate+reload need an EE binary (config.etcd source) so were not run here; mechanics mirror the working tarantool-ee-config example. EE guard on migrate verified to fire."} | NULL | 2026-05-20T14:22:44Z |
| df2b94c8-bd36-41b6-9ec4-b110aacf7d66 | tarantool-etcd-huo | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m2-production | 2026-05-21T14:37:05Z |
| df3a88fb-c2b8-4d6f-9361-b23f36715f46 | tarantool-etcd-1dk | created | Eugene Blikh | NULL | 2026-05-20T09:55:21Z | ||
| df888647-1004-458a-ab8c-f20d22c88a16 | tarantool-etcd-16d | created | Eugene Blikh | NULL | 2026-05-20T08:47:58Z | ||
| dfa2b7f3-da7b-4bed-b088-cf7c47f382ec | tarantool-etcd-9ar | created | Eugene Blikh | NULL | 2026-05-19T17:54:46Z | ||
| e349074e-24a3-48d4-905a-f9fe17c88bb9 | tarantool-etcd-929 | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:17Z |
| e793c7f3-1499-4923-80a5-477a82c1c79c | tarantool-etcd-bdf | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m2-production | 2026-05-21T14:37:04Z |
| e91e2679-fee3-46d9-8484-85e92b91b5f6 | tarantool-etcd-216 | created | Eugene Blikh | NULL | 2026-05-19T17:54:37Z | ||
| eb63d18a-8e99-45da-81bc-084a910243c7 | tarantool-etcd-5zx | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:15Z |
| ed0c9b90-0a6d-4bfa-a337-7c8a4e6741cb | tarantool-etcd-35y | created | Eugene Blikh | NULL | 2026-05-20T09:31:01Z | ||
| eedfcc8b-a1c9-45c3-af4a-4ad6e93734b9 | tarantool-etcd-w6z | created | Eugene Blikh | NULL | 2026-05-19T17:54:44Z | ||
| efd948f0-4fb5-4ad3-83fa-deb2c084e8e3 | tarantool-etcd-9cd | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m4-iproto-parity | 2026-05-21T14:37:31Z |
| f202ff35-a371-4fa7-86aa-22fe67c0c86b | tarantool-etcd-bdf | created | Eugene Blikh | NULL | 2026-05-20T09:55:23Z | ||
| f3c28483-ca86-40b9-9390-534e6b20d0e4 | tarantool-etcd-8ss | updated | Eugene Blikh | {"id":"tarantool-etcd-8ss","title":"Example 2: 3-node EE replicaset self-hosting its own etcd config (file → etcd migration)","description":"Add examples/tarantool-ee-self-hosted-etcd: boot a 3-instance EE replicaset (election failover) from a local cluster-config.yaml where every node runs app.roles.etcd (replicated KV store, read_pref=any). Seed the cluster's OWN etcd store with that config, then rolling-restart each instance to bootstrap from TT_CONFIG_ETCD_* (no --config). Document the cold-boot circularity: self-hosted etcd-config is HA under rolling restart but needs the local file retained as a cold-boot seed. Justfile + README + cluster-config.yaml.","notes":"Files written + phases 1-2 (up-file/seed/probe/config-show) verified on Community Tarantool 3.8. Ports 3501-3503/2382-2482-2582 (distinct from example-1's 3401/2379). migrate+reload need an EE binary (config.etcd source) so were not run here; mechanics mirror the working tarantool-ee-config example. EE guard on migrate verified to fire.","status":"in_progress","priority":2,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-05-20T11:16:17Z","created_by":"Eugene Blikh","updated_at":"2026-05-20T11:22:45Z","started_at":"2026-05-20T11:16:28Z"} | {"notes":"v2: hardened migrate after EE run hit 'etcdserver: no leader' on the 2nd node (election churn from restarting a node that became leader). Fixes: (1) recompute leader each step, always migrate a follower, leader last; (2) _wait-healthy gate (all live nodes agree on one leader) between steps; (3) endpoints peers-first/self-last; (4) append logs not truncate. Rolling-restart pacing + leader-pick logic verified on Community; EE etcd-source fetch still needs an EE re-run to confirm."} | NULL | 2026-05-20T14:30:21Z |
| f42ad239-ccf4-40f5-91a1-988037ff1187 | tarantool-etcd-rzr | created | Eugene Blikh | NULL | 2026-05-19T16:34:41Z | ||
| f5810a11-b5ec-4ea8-a8c2-b7280c76e945 | tarantool-etcd-bol | created | Eugene Blikh | NULL | 2026-05-19T17:54:11Z | ||
| f7b9bda6-1670-46e7-b453-60afc8055567 | tarantool-etcd-3dk | created | Eugene Blikh | NULL | 2026-05-19T17:53:55Z | ||
| f88c8e63-910c-41ac-ab6c-cefc6d3fa51d | tarantool-etcd-ozm | created | Eugene Blikh | NULL | 2026-05-19T17:54:08Z | ||
| f9424d26-c20d-45f2-8cd9-54e601a89817 | tarantool-etcd-95d | created | Eugene Blikh | NULL | 2026-05-20T09:55:37Z | ||
| fae764ad-15c4-41e2-bb69-4678fa232a21 | tarantool-etcd-a4v | created | Eugene Blikh | NULL | 2026-05-19T17:54:02Z | ||
| fc355883-8115-4ca6-9602-dc8456aea6de | tarantool-etcd-hlx | created | Eugene Blikh | NULL | 2026-05-20T09:17:54Z | ||
| fd70bc1d-c816-436b-9672-fb158ba1b5fd | tarantool-etcd-tf0 | created | Eugene Blikh | NULL | 2026-05-19T17:54:38Z | ||
| fd9da391-204a-4bbd-a474-ae4feec410a2 | tarantool-etcd-ns0 | created | Eugene Blikh | NULL | 2026-05-19T17:54:34Z | ||
| fdac6be5-c569-4565-a3cc-95c9ebdd2109 | tarantool-etcd-m0w | created | Eugene Blikh | NULL | 2026-05-19T17:54:17Z | ||
| fdccfbd6-05cc-4879-a9fa-bc5019a2aa29 | tarantool-etcd-4yb | created | Eugene Blikh | NULL | 2026-05-20T09:45:14Z | ||
| fe86a4cc-54f0-4722-bd65-bc0594b45046 | tarantool-etcd-35y | label_added | Eugene Blikh | NULL | NULL | Added label: milestone:m1-conformance | 2026-05-21T14:37:01Z |