search for standard sites pub-search.waow.tech
search zig blog atproto

fix: batch embedded_at updates into single turso call

individual exec() calls per doc were 20 sequential HTTP round-trips.
use queryBatch() to send all updates in one request.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

+17 -7
+17 -7
backend/src/ingest/embedder.zig
··· 165 return error.TpufUpsertFailed; 166 }; 167 168 - // mark docs as embedded in turso (so they won't be re-processed) 169 - for (docs.items) |doc| { 170 - client.exec( 171 - "UPDATE documents SET embedded_at = strftime('%Y-%m-%dT%H:%M:%S', 'now') WHERE uri = ?", 172 - &.{doc.uri}, 173 - ) catch |err| { 174 - logfire.err("embedder: failed to mark {s} as embedded: {}", .{ doc.uri, err }); 175 }; 176 } 177 178 return docs.items.len; 179 }
··· 165 return error.TpufUpsertFailed; 166 }; 167 168 + // mark docs as embedded in turso (single batch call) 169 + var stmts = allocator.alloc(db.Client.Statement, docs.items.len) catch { 170 + logfire.warn("embedder: failed to alloc stmts for embedded_at update", .{}); 171 + return docs.items.len; 172 + }; 173 + defer allocator.free(stmts); 174 + 175 + for (docs.items, 0..) |doc, i| { 176 + stmts[i] = .{ 177 + .sql = "UPDATE documents SET embedded_at = strftime('%Y-%m-%dT%H:%M:%S', 'now') WHERE uri = ?", 178 + .args = &.{doc.uri}, 179 }; 180 } 181 + 182 + var batch_result = client.queryBatch(stmts) catch |err| { 183 + logfire.warn("embedder: embedded_at batch update failed: {}, docs still embedded in tpuf", .{err}); 184 + return docs.items.len; 185 + }; 186 + batch_result.deinit(); 187 188 return docs.items.len; 189 }