Skip to content

Commit 72b3ec6

Browse files
committed
Add attributes to GET /index
1 parent 50dfabc commit 72b3ec6

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/Index.zig

+32-2
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,11 @@ fn releaseSegments(self: *Self, segments: *SegmentsSnapshot) void {
446446
FileSegmentList.destroySegments(self.allocator, &segments.file_segments);
447447
}
448448

449+
const segment_lists = [_][]const u8{
450+
"file_segments",
451+
"memory_segments",
452+
};
453+
449454
pub fn search(self: *Self, hashes: []const u32, allocator: std.mem.Allocator, deadline: Deadline) !SearchResults {
450455
const sorted_hashes = try allocator.dupe(u32, hashes);
451456
defer allocator.free(sorted_hashes);
@@ -457,14 +462,39 @@ pub fn search(self: *Self, hashes: []const u32, allocator: std.mem.Allocator, de
457462
var snapshot = self.acquireSegments();
458463
defer self.releaseSegments(&snapshot); // FIXME this possibly deletes orphaned segments, do it in a separate thread
459464

460-
try snapshot.file_segments.value.search(sorted_hashes, &results, deadline);
461-
try snapshot.memory_segments.value.search(sorted_hashes, &results, deadline);
465+
inline for (segment_lists) |n| {
466+
const segments = @field(snapshot, n);
467+
try segments.value.search(sorted_hashes, &results, deadline);
468+
}
462469

463470
results.sort();
464471

465472
return results;
466473
}
467474

475+
pub fn getAttributes(self: *Self, allocator: std.mem.Allocator) !std.AutoHashMapUnmanaged(u64, u64) {
476+
var result: std.AutoHashMapUnmanaged(u64, u64) = .{};
477+
errdefer result.deinit(allocator);
478+
479+
var snapshot = self.acquireSegments();
480+
defer self.releaseSegments(&snapshot); // FIXME this possibly deletes orphaned segments, do it in a separate thread
481+
482+
var last_version: u64 = 0;
483+
inline for (segment_lists) |n| {
484+
const segments = @field(snapshot, n);
485+
for (segments.value.nodes.items) |node| {
486+
var iter = node.value.attributes.iterator();
487+
while (iter.next()) |entry| {
488+
try result.put(allocator, entry.key_ptr.*, entry.value_ptr.*);
489+
}
490+
std.debug.assert(node.value.info.version > last_version);
491+
last_version = node.value.info.version;
492+
}
493+
}
494+
495+
return result;
496+
}
497+
468498
test {
469499
_ = @import("index_tests.zig");
470500
}

src/server.zig

+19
Original file line numberDiff line numberDiff line change
@@ -270,16 +270,35 @@ fn handleHeadIndex(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !vo
270270
return;
271271
}
272272

273+
const Attributes = struct {
274+
attributes: std.AutoHashMapUnmanaged(u64, u64),
275+
276+
pub fn jsonStringify(self: Attributes, jws: anytype) !void {
277+
try jws.beginArray();
278+
var iter = self.attributes.iterator();
279+
while (iter.next()) |entry| {
280+
try jws.beginArray();
281+
try jws.write(entry.key_ptr.*);
282+
try jws.write(entry.value_ptr.*);
283+
try jws.endArray();
284+
}
285+
try jws.endArray();
286+
}
287+
};
288+
273289
const GetIndexResponse = struct {
274290
status: []const u8,
291+
attributes: Attributes,
275292
};
276293

277294
fn handleGetIndex(ctx: *Context, req: *httpz.Request, res: *httpz.Response) !void {
278295
const index_ref = try getIndex(ctx, req, res, true) orelse return;
279296
defer releaseIndex(ctx, index_ref);
280297

298+
const attributes = try index_ref.index.getAttributes(req.arena);
281299
const response = GetIndexResponse{
282300
.status = "ok",
301+
.attributes = .{ .attributes = attributes },
283302
};
284303
return res.json(&response, .{});
285304
}

0 commit comments

Comments
 (0)