smiklosovic commented on code in PR #4278: URL: https://github.com/apache/cassandra/pull/4278#discussion_r2254612569
########## src/java/org/apache/cassandra/io/sstable/format/TOCComponent.java: ########## @@ -78,20 +80,36 @@ public static Set<Component> loadTOC(Descriptor descriptor, boolean skipMissing) } /** - * Appends new component names to the TOC component. + * Updates the TOC file by reading existing component entries, merging them with the given components, + * sorting the combined list in lexicographic order for deterministic output. + * + * @param descriptor the SSTable descriptor for which to update the TOC + * @param components new components to merge into the TOC (existing TOC entries are preserved) + * @throws FSWriteError if an I/O error occurs when creating or overwriting the TOC file */ - public static void appendTOC(Descriptor descriptor, Collection<Component> components) + public static void updateTOC(Descriptor descriptor, Collection<Component> components) { + if (components.isEmpty()) + return; + File tocFile = descriptor.fileFor(Components.TOC); - try (FileOutputStreamPlus out = tocFile.newOutputStream(APPEND); - PrintWriter w = new PrintWriter(out)) + + Set<String> componentNames = new TreeSet<>(Collections2.transform(components, Component::name)); + + if (tocFile.exists()) { - for (Component component : components) - w.println(component.name); - w.flush(); - out.sync(); + List<String> lines = FileUtils.readLines(tocFile); + if (lines.isEmpty()) Review Comment: Also, if we fail to read, then it will return empty list. Empty list might be returned both when file is genuinely empty as well as when it failed to be read from. So we might indeed just proceed and add empty `lines` to `componentNames` in case we fail to read. But then, this file might already contain something, we just failed to read it. So we would not update `lines` with its content and then in `write` we might overwrite it even though it is quite improbable we would read with error but we would write successfully. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org For additional commands, e-mail: pr-h...@cassandra.apache.org