k-rus commented on code in PR #4038:
URL: https://github.com/apache/cassandra/pull/4038#discussion_r2050409084
##########
src/java/org/apache/cassandra/schema/SchemaConstants.java:
##########
@@ -75,14 +77,54 @@ public final class SchemaConstants
*/
public static final int NAME_LENGTH = 48;
+ /**
+ * Longest acceptable file name. Longer names lead to too long file name
error.
+ */
+ public static final int FILENAME_LENGTH = 255;
+
+ /**
+ * Longest acceptable table name, so it can be used in a directory
+ * name constructed with a suffix of a table id and a separator.
+ */
+ public static final int TABLE_NAME_LENGTH = FILENAME_LENGTH - 32 - 1;
+
// 59adb24e-f3cd-3e02-97f0-5b395827453f
public static final UUID emptyVersion;
public static final List<String> LEGACY_AUTH_TABLES =
Arrays.asList("credentials", "users", "permissions");
+ /**
+ * Validates that a name is valid to be used in files. Assumes that the
name length
+ * should fit the default, {@link #NAME_LENGTH}.
+ * See {@link #isValidName(String, int)} for more details.
+ *
+ * @param name the name to check
+ * @return whether the name is safe for use in file paths and file names
+ */
public static boolean isValidName(String name)
{
- return name != null && !name.isEmpty() && name.length() <= NAME_LENGTH
&& PATTERN_WORD_CHARS.matcher(name).matches();
+ return isValidName(name, NAME_LENGTH);
+ }
+
+ /**
+ * Names such as keyspace, table, index names are used in file paths and
file names,
+ * so, they need to be safe for the use there, i.e., short enough and
+ * containing only alphanumeric characters and underscores.
+ * Allows to provide the length of names, since it varies for different
database objects,
+ * especially, they were not historically controlled for {@link
#NAME_LENGTH}, see,
+ * e.g., CASSANDRA-20389.
+ * There are cases when the length cannot be controlled by a single value.
In such case
+ * the length validation is skipped if the given length is smaller than 1.
+ *
+ * @param name the name to check
+ * @param maxLength max acceptable length for the given name. For the
cases when it cannot
+ * be limited, 0 or negative number should be supplied.
Review Comment:
@smiklosovic
I disagree with your statement about didn't care about controlling the
length, like in
> it might be so long, up to Integer.MAX_VALUE, that we effectively do not
care.
>What you are doing is that you say "and put there 0 or negative if you
don't care about the length".
>What is suggested is that you still stay working with the logic of "how
long I want to have it at maximum" and you do not care so you put there
insanely large number.
The point is that controlling the length is important, however, it's not
always possible in this simplistic approach with a single value. E.g., it will
not work for an index name, which will be clear when fixing
[CASSANDRA-20445](https://issues.apache.org/jira/browse/CASSANDRA-20445). Your
points for using `Integer.MAX_VALUE` gives me impression that it will not
deliver the message that the controlling the length is missing here. And I
don't see any case where controlling length is not important and allows to not
care.
From having the discussion I think it's better to separate validation of
names' content from names' length. WDYT?
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]