From b5791638028f9c236477751f738956300163aa7e Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 9 Sep 2022 03:06:34 -0700 Subject: [PATCH] limit number of buckets to 500k (#15668) 500k is a reasonable limit for any single MinIO cluster deployment, in future we may increase this value. However for now we are going to keep this limit. --- cmd/api-errors.go | 6 + cmd/apierrorcode_string.go | 387 +++++++++++++++++++------------------ cmd/bucket-handlers.go | 8 + cmd/bucket-metadata-sys.go | 8 + cmd/generic-handlers.go | 3 + docs/minio-limits.md | 14 +- 6 files changed, 228 insertions(+), 198 deletions(-) diff --git a/cmd/api-errors.go b/cmd/api-errors.go index ee330f8c6..08d0f913e 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -176,6 +176,7 @@ const ( ErrBucketAlreadyOwnedByYou ErrInvalidDuration ErrBucketAlreadyExists + ErrTooManyBuckets ErrMetadataTooLarge ErrUnsupportedMetadata ErrMaximumExpires @@ -684,6 +685,11 @@ var errorCodes = errorCodeMap{ Description: "The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.", HTTPStatusCode: http.StatusBadRequest, }, + ErrTooManyBuckets: { + Code: "TooManyBuckets", + Description: "You have attempted to create more buckets than allowed", + HTTPStatusCode: http.StatusBadRequest, + }, ErrBucketNotEmpty: { Code: "BucketNotEmpty", Description: "The bucket you tried to delete is not empty", diff --git a/cmd/apierrorcode_string.go b/cmd/apierrorcode_string.go index 95dcac876..a9bf5f27f 100644 --- a/cmd/apierrorcode_string.go +++ b/cmd/apierrorcode_string.go @@ -111,202 +111,203 @@ func _() { _ = x[ErrBucketAlreadyOwnedByYou-100] _ = x[ErrInvalidDuration-101] _ = x[ErrBucketAlreadyExists-102] - _ = x[ErrMetadataTooLarge-103] - _ = x[ErrUnsupportedMetadata-104] - _ = x[ErrMaximumExpires-105] - _ = x[ErrSlowDown-106] - _ = x[ErrInvalidPrefixMarker-107] - _ = x[ErrBadRequest-108] - _ = x[ErrKeyTooLongError-109] - _ = x[ErrInvalidBucketObjectLockConfiguration-110] - _ = x[ErrObjectLockConfigurationNotFound-111] - _ = x[ErrObjectLockConfigurationNotAllowed-112] - _ = x[ErrNoSuchObjectLockConfiguration-113] - _ = x[ErrObjectLocked-114] - _ = x[ErrInvalidRetentionDate-115] - _ = x[ErrPastObjectLockRetainDate-116] - _ = x[ErrUnknownWORMModeDirective-117] - _ = x[ErrBucketTaggingNotFound-118] - _ = x[ErrObjectLockInvalidHeaders-119] - _ = x[ErrInvalidTagDirective-120] - _ = x[ErrInvalidEncryptionMethod-121] - _ = x[ErrInvalidEncryptionKeyID-122] - _ = x[ErrInsecureSSECustomerRequest-123] - _ = x[ErrSSEMultipartEncrypted-124] - _ = x[ErrSSEEncryptedObject-125] - _ = x[ErrInvalidEncryptionParameters-126] - _ = x[ErrInvalidSSECustomerAlgorithm-127] - _ = x[ErrInvalidSSECustomerKey-128] - _ = x[ErrMissingSSECustomerKey-129] - _ = x[ErrMissingSSECustomerKeyMD5-130] - _ = x[ErrSSECustomerKeyMD5Mismatch-131] - _ = x[ErrInvalidSSECustomerParameters-132] - _ = x[ErrIncompatibleEncryptionMethod-133] - _ = x[ErrKMSNotConfigured-134] - _ = x[ErrKMSKeyNotFoundException-135] - _ = x[ErrNoAccessKey-136] - _ = x[ErrInvalidToken-137] - _ = x[ErrEventNotification-138] - _ = x[ErrARNNotification-139] - _ = x[ErrRegionNotification-140] - _ = x[ErrOverlappingFilterNotification-141] - _ = x[ErrFilterNameInvalid-142] - _ = x[ErrFilterNamePrefix-143] - _ = x[ErrFilterNameSuffix-144] - _ = x[ErrFilterValueInvalid-145] - _ = x[ErrOverlappingConfigs-146] - _ = x[ErrUnsupportedNotification-147] - _ = x[ErrContentSHA256Mismatch-148] - _ = x[ErrContentChecksumMismatch-149] - _ = x[ErrReadQuorum-150] - _ = x[ErrWriteQuorum-151] - _ = x[ErrStorageFull-152] - _ = x[ErrRequestBodyParse-153] - _ = x[ErrObjectExistsAsDirectory-154] - _ = x[ErrInvalidObjectName-155] - _ = x[ErrInvalidObjectNamePrefixSlash-156] - _ = x[ErrInvalidResourceName-157] - _ = x[ErrServerNotInitialized-158] - _ = x[ErrOperationTimedOut-159] - _ = x[ErrClientDisconnected-160] - _ = x[ErrOperationMaxedOut-161] - _ = x[ErrInvalidRequest-162] - _ = x[ErrTransitionStorageClassNotFoundError-163] - _ = x[ErrInvalidStorageClass-164] - _ = x[ErrBackendDown-165] - _ = x[ErrMalformedJSON-166] - _ = x[ErrAdminNoSuchUser-167] - _ = x[ErrAdminNoSuchGroup-168] - _ = x[ErrAdminGroupNotEmpty-169] - _ = x[ErrAdminNoSuchPolicy-170] - _ = x[ErrAdminInvalidArgument-171] - _ = x[ErrAdminInvalidAccessKey-172] - _ = x[ErrAdminInvalidSecretKey-173] - _ = x[ErrAdminConfigNoQuorum-174] - _ = x[ErrAdminConfigTooLarge-175] - _ = x[ErrAdminConfigBadJSON-176] - _ = x[ErrAdminNoSuchConfigTarget-177] - _ = x[ErrAdminConfigEnvOverridden-178] - _ = x[ErrAdminConfigDuplicateKeys-179] - _ = x[ErrAdminCredentialsMismatch-180] - _ = x[ErrInsecureClientRequest-181] - _ = x[ErrObjectTampered-182] - _ = x[ErrSiteReplicationInvalidRequest-183] - _ = x[ErrSiteReplicationPeerResp-184] - _ = x[ErrSiteReplicationBackendIssue-185] - _ = x[ErrSiteReplicationServiceAccountError-186] - _ = x[ErrSiteReplicationBucketConfigError-187] - _ = x[ErrSiteReplicationBucketMetaError-188] - _ = x[ErrSiteReplicationIAMError-189] - _ = x[ErrSiteReplicationConfigMissing-190] - _ = x[ErrAdminBucketQuotaExceeded-191] - _ = x[ErrAdminNoSuchQuotaConfiguration-192] - _ = x[ErrHealNotImplemented-193] - _ = x[ErrHealNoSuchProcess-194] - _ = x[ErrHealInvalidClientToken-195] - _ = x[ErrHealMissingBucket-196] - _ = x[ErrHealAlreadyRunning-197] - _ = x[ErrHealOverlappingPaths-198] - _ = x[ErrIncorrectContinuationToken-199] - _ = x[ErrEmptyRequestBody-200] - _ = x[ErrUnsupportedFunction-201] - _ = x[ErrInvalidExpressionType-202] - _ = x[ErrBusy-203] - _ = x[ErrUnauthorizedAccess-204] - _ = x[ErrExpressionTooLong-205] - _ = x[ErrIllegalSQLFunctionArgument-206] - _ = x[ErrInvalidKeyPath-207] - _ = x[ErrInvalidCompressionFormat-208] - _ = x[ErrInvalidFileHeaderInfo-209] - _ = x[ErrInvalidJSONType-210] - _ = x[ErrInvalidQuoteFields-211] - _ = x[ErrInvalidRequestParameter-212] - _ = x[ErrInvalidDataType-213] - _ = x[ErrInvalidTextEncoding-214] - _ = x[ErrInvalidDataSource-215] - _ = x[ErrInvalidTableAlias-216] - _ = x[ErrMissingRequiredParameter-217] - _ = x[ErrObjectSerializationConflict-218] - _ = x[ErrUnsupportedSQLOperation-219] - _ = x[ErrUnsupportedSQLStructure-220] - _ = x[ErrUnsupportedSyntax-221] - _ = x[ErrUnsupportedRangeHeader-222] - _ = x[ErrLexerInvalidChar-223] - _ = x[ErrLexerInvalidOperator-224] - _ = x[ErrLexerInvalidLiteral-225] - _ = x[ErrLexerInvalidIONLiteral-226] - _ = x[ErrParseExpectedDatePart-227] - _ = x[ErrParseExpectedKeyword-228] - _ = x[ErrParseExpectedTokenType-229] - _ = x[ErrParseExpected2TokenTypes-230] - _ = x[ErrParseExpectedNumber-231] - _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-232] - _ = x[ErrParseExpectedTypeName-233] - _ = x[ErrParseExpectedWhenClause-234] - _ = x[ErrParseUnsupportedToken-235] - _ = x[ErrParseUnsupportedLiteralsGroupBy-236] - _ = x[ErrParseExpectedMember-237] - _ = x[ErrParseUnsupportedSelect-238] - _ = x[ErrParseUnsupportedCase-239] - _ = x[ErrParseUnsupportedCaseClause-240] - _ = x[ErrParseUnsupportedAlias-241] - _ = x[ErrParseUnsupportedSyntax-242] - _ = x[ErrParseUnknownOperator-243] - _ = x[ErrParseMissingIdentAfterAt-244] - _ = x[ErrParseUnexpectedOperator-245] - _ = x[ErrParseUnexpectedTerm-246] - _ = x[ErrParseUnexpectedToken-247] - _ = x[ErrParseUnexpectedKeyword-248] - _ = x[ErrParseExpectedExpression-249] - _ = x[ErrParseExpectedLeftParenAfterCast-250] - _ = x[ErrParseExpectedLeftParenValueConstructor-251] - _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-252] - _ = x[ErrParseExpectedArgumentDelimiter-253] - _ = x[ErrParseCastArity-254] - _ = x[ErrParseInvalidTypeParam-255] - _ = x[ErrParseEmptySelect-256] - _ = x[ErrParseSelectMissingFrom-257] - _ = x[ErrParseExpectedIdentForGroupName-258] - _ = x[ErrParseExpectedIdentForAlias-259] - _ = x[ErrParseUnsupportedCallWithStar-260] - _ = x[ErrParseNonUnaryAgregateFunctionCall-261] - _ = x[ErrParseMalformedJoin-262] - _ = x[ErrParseExpectedIdentForAt-263] - _ = x[ErrParseAsteriskIsNotAloneInSelectList-264] - _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-265] - _ = x[ErrParseInvalidContextForWildcardInSelectList-266] - _ = x[ErrIncorrectSQLFunctionArgumentType-267] - _ = x[ErrValueParseFailure-268] - _ = x[ErrEvaluatorInvalidArguments-269] - _ = x[ErrIntegerOverflow-270] - _ = x[ErrLikeInvalidInputs-271] - _ = x[ErrCastFailed-272] - _ = x[ErrInvalidCast-273] - _ = x[ErrEvaluatorInvalidTimestampFormatPattern-274] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-275] - _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-276] - _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-277] - _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-278] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-279] - _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-280] - _ = x[ErrEvaluatorBindingDoesNotExist-281] - _ = x[ErrMissingHeaders-282] - _ = x[ErrInvalidColumnIndex-283] - _ = x[ErrAdminConfigNotificationTargetsFailed-284] - _ = x[ErrAdminProfilerNotEnabled-285] - _ = x[ErrInvalidDecompressedSize-286] - _ = x[ErrAddUserInvalidArgument-287] - _ = x[ErrAdminResourceInvalidArgument-288] - _ = x[ErrAdminAccountNotEligible-289] - _ = x[ErrAccountNotEligible-290] - _ = x[ErrAdminServiceAccountNotFound-291] - _ = x[ErrPostPolicyConditionInvalidFormat-292] - _ = x[ErrInvalidChecksum-293] + _ = x[ErrTooManyBuckets-103] + _ = x[ErrMetadataTooLarge-104] + _ = x[ErrUnsupportedMetadata-105] + _ = x[ErrMaximumExpires-106] + _ = x[ErrSlowDown-107] + _ = x[ErrInvalidPrefixMarker-108] + _ = x[ErrBadRequest-109] + _ = x[ErrKeyTooLongError-110] + _ = x[ErrInvalidBucketObjectLockConfiguration-111] + _ = x[ErrObjectLockConfigurationNotFound-112] + _ = x[ErrObjectLockConfigurationNotAllowed-113] + _ = x[ErrNoSuchObjectLockConfiguration-114] + _ = x[ErrObjectLocked-115] + _ = x[ErrInvalidRetentionDate-116] + _ = x[ErrPastObjectLockRetainDate-117] + _ = x[ErrUnknownWORMModeDirective-118] + _ = x[ErrBucketTaggingNotFound-119] + _ = x[ErrObjectLockInvalidHeaders-120] + _ = x[ErrInvalidTagDirective-121] + _ = x[ErrInvalidEncryptionMethod-122] + _ = x[ErrInvalidEncryptionKeyID-123] + _ = x[ErrInsecureSSECustomerRequest-124] + _ = x[ErrSSEMultipartEncrypted-125] + _ = x[ErrSSEEncryptedObject-126] + _ = x[ErrInvalidEncryptionParameters-127] + _ = x[ErrInvalidSSECustomerAlgorithm-128] + _ = x[ErrInvalidSSECustomerKey-129] + _ = x[ErrMissingSSECustomerKey-130] + _ = x[ErrMissingSSECustomerKeyMD5-131] + _ = x[ErrSSECustomerKeyMD5Mismatch-132] + _ = x[ErrInvalidSSECustomerParameters-133] + _ = x[ErrIncompatibleEncryptionMethod-134] + _ = x[ErrKMSNotConfigured-135] + _ = x[ErrKMSKeyNotFoundException-136] + _ = x[ErrNoAccessKey-137] + _ = x[ErrInvalidToken-138] + _ = x[ErrEventNotification-139] + _ = x[ErrARNNotification-140] + _ = x[ErrRegionNotification-141] + _ = x[ErrOverlappingFilterNotification-142] + _ = x[ErrFilterNameInvalid-143] + _ = x[ErrFilterNamePrefix-144] + _ = x[ErrFilterNameSuffix-145] + _ = x[ErrFilterValueInvalid-146] + _ = x[ErrOverlappingConfigs-147] + _ = x[ErrUnsupportedNotification-148] + _ = x[ErrContentSHA256Mismatch-149] + _ = x[ErrContentChecksumMismatch-150] + _ = x[ErrReadQuorum-151] + _ = x[ErrWriteQuorum-152] + _ = x[ErrStorageFull-153] + _ = x[ErrRequestBodyParse-154] + _ = x[ErrObjectExistsAsDirectory-155] + _ = x[ErrInvalidObjectName-156] + _ = x[ErrInvalidObjectNamePrefixSlash-157] + _ = x[ErrInvalidResourceName-158] + _ = x[ErrServerNotInitialized-159] + _ = x[ErrOperationTimedOut-160] + _ = x[ErrClientDisconnected-161] + _ = x[ErrOperationMaxedOut-162] + _ = x[ErrInvalidRequest-163] + _ = x[ErrTransitionStorageClassNotFoundError-164] + _ = x[ErrInvalidStorageClass-165] + _ = x[ErrBackendDown-166] + _ = x[ErrMalformedJSON-167] + _ = x[ErrAdminNoSuchUser-168] + _ = x[ErrAdminNoSuchGroup-169] + _ = x[ErrAdminGroupNotEmpty-170] + _ = x[ErrAdminNoSuchPolicy-171] + _ = x[ErrAdminInvalidArgument-172] + _ = x[ErrAdminInvalidAccessKey-173] + _ = x[ErrAdminInvalidSecretKey-174] + _ = x[ErrAdminConfigNoQuorum-175] + _ = x[ErrAdminConfigTooLarge-176] + _ = x[ErrAdminConfigBadJSON-177] + _ = x[ErrAdminNoSuchConfigTarget-178] + _ = x[ErrAdminConfigEnvOverridden-179] + _ = x[ErrAdminConfigDuplicateKeys-180] + _ = x[ErrAdminCredentialsMismatch-181] + _ = x[ErrInsecureClientRequest-182] + _ = x[ErrObjectTampered-183] + _ = x[ErrSiteReplicationInvalidRequest-184] + _ = x[ErrSiteReplicationPeerResp-185] + _ = x[ErrSiteReplicationBackendIssue-186] + _ = x[ErrSiteReplicationServiceAccountError-187] + _ = x[ErrSiteReplicationBucketConfigError-188] + _ = x[ErrSiteReplicationBucketMetaError-189] + _ = x[ErrSiteReplicationIAMError-190] + _ = x[ErrSiteReplicationConfigMissing-191] + _ = x[ErrAdminBucketQuotaExceeded-192] + _ = x[ErrAdminNoSuchQuotaConfiguration-193] + _ = x[ErrHealNotImplemented-194] + _ = x[ErrHealNoSuchProcess-195] + _ = x[ErrHealInvalidClientToken-196] + _ = x[ErrHealMissingBucket-197] + _ = x[ErrHealAlreadyRunning-198] + _ = x[ErrHealOverlappingPaths-199] + _ = x[ErrIncorrectContinuationToken-200] + _ = x[ErrEmptyRequestBody-201] + _ = x[ErrUnsupportedFunction-202] + _ = x[ErrInvalidExpressionType-203] + _ = x[ErrBusy-204] + _ = x[ErrUnauthorizedAccess-205] + _ = x[ErrExpressionTooLong-206] + _ = x[ErrIllegalSQLFunctionArgument-207] + _ = x[ErrInvalidKeyPath-208] + _ = x[ErrInvalidCompressionFormat-209] + _ = x[ErrInvalidFileHeaderInfo-210] + _ = x[ErrInvalidJSONType-211] + _ = x[ErrInvalidQuoteFields-212] + _ = x[ErrInvalidRequestParameter-213] + _ = x[ErrInvalidDataType-214] + _ = x[ErrInvalidTextEncoding-215] + _ = x[ErrInvalidDataSource-216] + _ = x[ErrInvalidTableAlias-217] + _ = x[ErrMissingRequiredParameter-218] + _ = x[ErrObjectSerializationConflict-219] + _ = x[ErrUnsupportedSQLOperation-220] + _ = x[ErrUnsupportedSQLStructure-221] + _ = x[ErrUnsupportedSyntax-222] + _ = x[ErrUnsupportedRangeHeader-223] + _ = x[ErrLexerInvalidChar-224] + _ = x[ErrLexerInvalidOperator-225] + _ = x[ErrLexerInvalidLiteral-226] + _ = x[ErrLexerInvalidIONLiteral-227] + _ = x[ErrParseExpectedDatePart-228] + _ = x[ErrParseExpectedKeyword-229] + _ = x[ErrParseExpectedTokenType-230] + _ = x[ErrParseExpected2TokenTypes-231] + _ = x[ErrParseExpectedNumber-232] + _ = x[ErrParseExpectedRightParenBuiltinFunctionCall-233] + _ = x[ErrParseExpectedTypeName-234] + _ = x[ErrParseExpectedWhenClause-235] + _ = x[ErrParseUnsupportedToken-236] + _ = x[ErrParseUnsupportedLiteralsGroupBy-237] + _ = x[ErrParseExpectedMember-238] + _ = x[ErrParseUnsupportedSelect-239] + _ = x[ErrParseUnsupportedCase-240] + _ = x[ErrParseUnsupportedCaseClause-241] + _ = x[ErrParseUnsupportedAlias-242] + _ = x[ErrParseUnsupportedSyntax-243] + _ = x[ErrParseUnknownOperator-244] + _ = x[ErrParseMissingIdentAfterAt-245] + _ = x[ErrParseUnexpectedOperator-246] + _ = x[ErrParseUnexpectedTerm-247] + _ = x[ErrParseUnexpectedToken-248] + _ = x[ErrParseUnexpectedKeyword-249] + _ = x[ErrParseExpectedExpression-250] + _ = x[ErrParseExpectedLeftParenAfterCast-251] + _ = x[ErrParseExpectedLeftParenValueConstructor-252] + _ = x[ErrParseExpectedLeftParenBuiltinFunctionCall-253] + _ = x[ErrParseExpectedArgumentDelimiter-254] + _ = x[ErrParseCastArity-255] + _ = x[ErrParseInvalidTypeParam-256] + _ = x[ErrParseEmptySelect-257] + _ = x[ErrParseSelectMissingFrom-258] + _ = x[ErrParseExpectedIdentForGroupName-259] + _ = x[ErrParseExpectedIdentForAlias-260] + _ = x[ErrParseUnsupportedCallWithStar-261] + _ = x[ErrParseNonUnaryAgregateFunctionCall-262] + _ = x[ErrParseMalformedJoin-263] + _ = x[ErrParseExpectedIdentForAt-264] + _ = x[ErrParseAsteriskIsNotAloneInSelectList-265] + _ = x[ErrParseCannotMixSqbAndWildcardInSelectList-266] + _ = x[ErrParseInvalidContextForWildcardInSelectList-267] + _ = x[ErrIncorrectSQLFunctionArgumentType-268] + _ = x[ErrValueParseFailure-269] + _ = x[ErrEvaluatorInvalidArguments-270] + _ = x[ErrIntegerOverflow-271] + _ = x[ErrLikeInvalidInputs-272] + _ = x[ErrCastFailed-273] + _ = x[ErrInvalidCast-274] + _ = x[ErrEvaluatorInvalidTimestampFormatPattern-275] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbolForParsing-276] + _ = x[ErrEvaluatorTimestampFormatPatternDuplicateFields-277] + _ = x[ErrEvaluatorTimestampFormatPatternHourClockAmPmMismatch-278] + _ = x[ErrEvaluatorUnterminatedTimestampFormatPatternToken-279] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternToken-280] + _ = x[ErrEvaluatorInvalidTimestampFormatPatternSymbol-281] + _ = x[ErrEvaluatorBindingDoesNotExist-282] + _ = x[ErrMissingHeaders-283] + _ = x[ErrInvalidColumnIndex-284] + _ = x[ErrAdminConfigNotificationTargetsFailed-285] + _ = x[ErrAdminProfilerNotEnabled-286] + _ = x[ErrInvalidDecompressedSize-287] + _ = x[ErrAddUserInvalidArgument-288] + _ = x[ErrAdminResourceInvalidArgument-289] + _ = x[ErrAdminAccountNotEligible-290] + _ = x[ErrAccountNotEligible-291] + _ = x[ErrAdminServiceAccountNotFound-292] + _ = x[ErrPostPolicyConditionInvalidFormat-293] + _ = x[ErrInvalidChecksum-294] } -const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledMalformedPolicyMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedCredentialRegionMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectiveInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchReadQuorumWriteQuorumStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminNoSuchPolicyAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksum" +const _APIErrorCode_name = "NoneAccessDeniedBadDigestEntityTooSmallEntityTooLargePolicyTooLargeIncompleteBodyInternalErrorInvalidAccessKeyIDAccessKeyDisabledInvalidBucketNameInvalidDigestInvalidRangeInvalidRangePartNumberInvalidCopyPartRangeInvalidCopyPartRangeSourceInvalidMaxKeysInvalidEncodingMethodInvalidMaxUploadsInvalidMaxPartsInvalidPartNumberMarkerInvalidPartNumberInvalidRequestBodyInvalidCopySourceInvalidMetadataDirectiveInvalidCopyDestInvalidPolicyDocumentInvalidObjectStateMalformedXMLMissingContentLengthMissingContentMD5MissingRequestBodyErrorMissingSecurityHeaderNoSuchBucketNoSuchBucketPolicyNoSuchBucketLifecycleNoSuchLifecycleConfigurationInvalidLifecycleWithObjectLockNoSuchBucketSSEConfigNoSuchCORSConfigurationNoSuchWebsiteConfigurationReplicationConfigurationNotFoundErrorRemoteDestinationNotFoundErrorReplicationDestinationMissingLockRemoteTargetNotFoundErrorReplicationRemoteConnectionErrorReplicationBandwidthLimitErrorBucketRemoteIdenticalToSourceBucketRemoteAlreadyExistsBucketRemoteLabelInUseBucketRemoteArnTypeInvalidBucketRemoteArnInvalidBucketRemoteRemoveDisallowedRemoteTargetNotVersionedErrorReplicationSourceNotVersionedErrorReplicationNeedsVersioningErrorReplicationBucketNeedsVersioningErrorReplicationDenyEditErrorReplicationNoExistingObjectsObjectRestoreAlreadyInProgressNoSuchKeyNoSuchUploadInvalidVersionIDNoSuchVersionNotImplementedPreconditionFailedRequestTimeTooSkewedSignatureDoesNotMatchMethodNotAllowedInvalidPartInvalidPartOrderAuthorizationHeaderMalformedMalformedPOSTRequestPOSTFileRequiredSignatureVersionNotSupportedBucketNotEmptyAllAccessDisabledMalformedPolicyMissingFieldsMissingCredTagCredMalformedInvalidRegionInvalidServiceS3InvalidServiceSTSInvalidRequestVersionMissingSignTagMissingSignHeadersTagMalformedDateMalformedPresignedDateMalformedCredentialDateMalformedCredentialRegionMalformedExpiresNegativeExpiresAuthHeaderEmptyExpiredPresignRequestRequestNotReadyYetUnsignedHeadersMissingDateHeaderInvalidQuerySignatureAlgoInvalidQueryParamsBucketAlreadyOwnedByYouInvalidDurationBucketAlreadyExistsTooManyBucketsMetadataTooLargeUnsupportedMetadataMaximumExpiresSlowDownInvalidPrefixMarkerBadRequestKeyTooLongErrorInvalidBucketObjectLockConfigurationObjectLockConfigurationNotFoundObjectLockConfigurationNotAllowedNoSuchObjectLockConfigurationObjectLockedInvalidRetentionDatePastObjectLockRetainDateUnknownWORMModeDirectiveBucketTaggingNotFoundObjectLockInvalidHeadersInvalidTagDirectiveInvalidEncryptionMethodInvalidEncryptionKeyIDInsecureSSECustomerRequestSSEMultipartEncryptedSSEEncryptedObjectInvalidEncryptionParametersInvalidSSECustomerAlgorithmInvalidSSECustomerKeyMissingSSECustomerKeyMissingSSECustomerKeyMD5SSECustomerKeyMD5MismatchInvalidSSECustomerParametersIncompatibleEncryptionMethodKMSNotConfiguredKMSKeyNotFoundExceptionNoAccessKeyInvalidTokenEventNotificationARNNotificationRegionNotificationOverlappingFilterNotificationFilterNameInvalidFilterNamePrefixFilterNameSuffixFilterValueInvalidOverlappingConfigsUnsupportedNotificationContentSHA256MismatchContentChecksumMismatchReadQuorumWriteQuorumStorageFullRequestBodyParseObjectExistsAsDirectoryInvalidObjectNameInvalidObjectNamePrefixSlashInvalidResourceNameServerNotInitializedOperationTimedOutClientDisconnectedOperationMaxedOutInvalidRequestTransitionStorageClassNotFoundErrorInvalidStorageClassBackendDownMalformedJSONAdminNoSuchUserAdminNoSuchGroupAdminGroupNotEmptyAdminNoSuchPolicyAdminInvalidArgumentAdminInvalidAccessKeyAdminInvalidSecretKeyAdminConfigNoQuorumAdminConfigTooLargeAdminConfigBadJSONAdminNoSuchConfigTargetAdminConfigEnvOverriddenAdminConfigDuplicateKeysAdminCredentialsMismatchInsecureClientRequestObjectTamperedSiteReplicationInvalidRequestSiteReplicationPeerRespSiteReplicationBackendIssueSiteReplicationServiceAccountErrorSiteReplicationBucketConfigErrorSiteReplicationBucketMetaErrorSiteReplicationIAMErrorSiteReplicationConfigMissingAdminBucketQuotaExceededAdminNoSuchQuotaConfigurationHealNotImplementedHealNoSuchProcessHealInvalidClientTokenHealMissingBucketHealAlreadyRunningHealOverlappingPathsIncorrectContinuationTokenEmptyRequestBodyUnsupportedFunctionInvalidExpressionTypeBusyUnauthorizedAccessExpressionTooLongIllegalSQLFunctionArgumentInvalidKeyPathInvalidCompressionFormatInvalidFileHeaderInfoInvalidJSONTypeInvalidQuoteFieldsInvalidRequestParameterInvalidDataTypeInvalidTextEncodingInvalidDataSourceInvalidTableAliasMissingRequiredParameterObjectSerializationConflictUnsupportedSQLOperationUnsupportedSQLStructureUnsupportedSyntaxUnsupportedRangeHeaderLexerInvalidCharLexerInvalidOperatorLexerInvalidLiteralLexerInvalidIONLiteralParseExpectedDatePartParseExpectedKeywordParseExpectedTokenTypeParseExpected2TokenTypesParseExpectedNumberParseExpectedRightParenBuiltinFunctionCallParseExpectedTypeNameParseExpectedWhenClauseParseUnsupportedTokenParseUnsupportedLiteralsGroupByParseExpectedMemberParseUnsupportedSelectParseUnsupportedCaseParseUnsupportedCaseClauseParseUnsupportedAliasParseUnsupportedSyntaxParseUnknownOperatorParseMissingIdentAfterAtParseUnexpectedOperatorParseUnexpectedTermParseUnexpectedTokenParseUnexpectedKeywordParseExpectedExpressionParseExpectedLeftParenAfterCastParseExpectedLeftParenValueConstructorParseExpectedLeftParenBuiltinFunctionCallParseExpectedArgumentDelimiterParseCastArityParseInvalidTypeParamParseEmptySelectParseSelectMissingFromParseExpectedIdentForGroupNameParseExpectedIdentForAliasParseUnsupportedCallWithStarParseNonUnaryAgregateFunctionCallParseMalformedJoinParseExpectedIdentForAtParseAsteriskIsNotAloneInSelectListParseCannotMixSqbAndWildcardInSelectListParseInvalidContextForWildcardInSelectListIncorrectSQLFunctionArgumentTypeValueParseFailureEvaluatorInvalidArgumentsIntegerOverflowLikeInvalidInputsCastFailedInvalidCastEvaluatorInvalidTimestampFormatPatternEvaluatorInvalidTimestampFormatPatternSymbolForParsingEvaluatorTimestampFormatPatternDuplicateFieldsEvaluatorTimestampFormatPatternHourClockAmPmMismatchEvaluatorUnterminatedTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternTokenEvaluatorInvalidTimestampFormatPatternSymbolEvaluatorBindingDoesNotExistMissingHeadersInvalidColumnIndexAdminConfigNotificationTargetsFailedAdminProfilerNotEnabledInvalidDecompressedSizeAddUserInvalidArgumentAdminResourceInvalidArgumentAdminAccountNotEligibleAccountNotEligibleAdminServiceAccountNotFoundPostPolicyConditionInvalidFormatInvalidChecksum" -var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1253, 1283, 1292, 1304, 1320, 1333, 1347, 1365, 1385, 1406, 1422, 1433, 1449, 1477, 1497, 1513, 1541, 1555, 1572, 1587, 1600, 1614, 1627, 1640, 1656, 1673, 1694, 1708, 1729, 1742, 1764, 1787, 1812, 1828, 1843, 1858, 1879, 1897, 1912, 1929, 1954, 1972, 1995, 2010, 2029, 2045, 2064, 2078, 2086, 2105, 2115, 2130, 2166, 2197, 2230, 2259, 2271, 2291, 2315, 2339, 2360, 2384, 2403, 2426, 2448, 2474, 2495, 2513, 2540, 2567, 2588, 2609, 2633, 2658, 2686, 2714, 2730, 2753, 2764, 2776, 2793, 2808, 2826, 2855, 2872, 2888, 2904, 2922, 2940, 2963, 2984, 3007, 3017, 3028, 3039, 3055, 3078, 3095, 3123, 3142, 3162, 3179, 3197, 3214, 3228, 3263, 3282, 3293, 3306, 3321, 3337, 3355, 3372, 3392, 3413, 3434, 3453, 3472, 3490, 3513, 3537, 3561, 3585, 3606, 3620, 3649, 3672, 3699, 3733, 3765, 3795, 3818, 3846, 3870, 3899, 3917, 3934, 3956, 3973, 3991, 4011, 4037, 4053, 4072, 4093, 4097, 4115, 4132, 4158, 4172, 4196, 4217, 4232, 4250, 4273, 4288, 4307, 4324, 4341, 4365, 4392, 4415, 4438, 4455, 4477, 4493, 4513, 4532, 4554, 4575, 4595, 4617, 4641, 4660, 4702, 4723, 4746, 4767, 4798, 4817, 4839, 4859, 4885, 4906, 4928, 4948, 4972, 4995, 5014, 5034, 5056, 5079, 5110, 5148, 5189, 5219, 5233, 5254, 5270, 5292, 5322, 5348, 5376, 5409, 5427, 5450, 5485, 5525, 5567, 5599, 5616, 5641, 5656, 5673, 5683, 5694, 5732, 5786, 5832, 5884, 5932, 5975, 6019, 6047, 6061, 6079, 6115, 6138, 6161, 6183, 6211, 6234, 6252, 6279, 6311, 6326} +var _APIErrorCode_index = [...]uint16{0, 4, 16, 25, 39, 53, 67, 81, 94, 112, 129, 146, 159, 171, 193, 213, 239, 253, 274, 291, 306, 329, 346, 364, 381, 405, 420, 441, 459, 471, 491, 508, 531, 552, 564, 582, 603, 631, 661, 682, 705, 731, 768, 798, 831, 856, 888, 918, 947, 972, 994, 1020, 1042, 1070, 1099, 1133, 1164, 1201, 1225, 1253, 1283, 1292, 1304, 1320, 1333, 1347, 1365, 1385, 1406, 1422, 1433, 1449, 1477, 1497, 1513, 1541, 1555, 1572, 1587, 1600, 1614, 1627, 1640, 1656, 1673, 1694, 1708, 1729, 1742, 1764, 1787, 1812, 1828, 1843, 1858, 1879, 1897, 1912, 1929, 1954, 1972, 1995, 2010, 2029, 2043, 2059, 2078, 2092, 2100, 2119, 2129, 2144, 2180, 2211, 2244, 2273, 2285, 2305, 2329, 2353, 2374, 2398, 2417, 2440, 2462, 2488, 2509, 2527, 2554, 2581, 2602, 2623, 2647, 2672, 2700, 2728, 2744, 2767, 2778, 2790, 2807, 2822, 2840, 2869, 2886, 2902, 2918, 2936, 2954, 2977, 2998, 3021, 3031, 3042, 3053, 3069, 3092, 3109, 3137, 3156, 3176, 3193, 3211, 3228, 3242, 3277, 3296, 3307, 3320, 3335, 3351, 3369, 3386, 3406, 3427, 3448, 3467, 3486, 3504, 3527, 3551, 3575, 3599, 3620, 3634, 3663, 3686, 3713, 3747, 3779, 3809, 3832, 3860, 3884, 3913, 3931, 3948, 3970, 3987, 4005, 4025, 4051, 4067, 4086, 4107, 4111, 4129, 4146, 4172, 4186, 4210, 4231, 4246, 4264, 4287, 4302, 4321, 4338, 4355, 4379, 4406, 4429, 4452, 4469, 4491, 4507, 4527, 4546, 4568, 4589, 4609, 4631, 4655, 4674, 4716, 4737, 4760, 4781, 4812, 4831, 4853, 4873, 4899, 4920, 4942, 4962, 4986, 5009, 5028, 5048, 5070, 5093, 5124, 5162, 5203, 5233, 5247, 5268, 5284, 5306, 5336, 5362, 5390, 5423, 5441, 5464, 5499, 5539, 5581, 5613, 5630, 5655, 5670, 5687, 5697, 5708, 5746, 5800, 5846, 5898, 5946, 5989, 6033, 6061, 6075, 6093, 6129, 6152, 6175, 6197, 6225, 6248, 6266, 6293, 6325, 6340} func (i APIErrorCode) String() string { if i < 0 || i >= APIErrorCode(len(_APIErrorCode_index)-1) { diff --git a/cmd/bucket-handlers.go b/cmd/bucket-handlers.go index a24701cb9..9c4300366 100644 --- a/cmd/bucket-handlers.go +++ b/cmd/bucket-handlers.go @@ -769,6 +769,14 @@ func (api objectAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Req return } + // check if client is attempting to create more buckets than allowed maximum. + if currBuckets := globalBucketMetadataSys.Count(); currBuckets+1 > maxBuckets { + apiErr := errorCodes.ToAPIErr(ErrTooManyBuckets) + apiErr.Description = fmt.Sprintf("You have attempted to create %d buckets than allowed %d", currBuckets+1, maxBuckets) + writeErrorResponse(ctx, w, apiErr, r.URL) + return + } + opts := MakeBucketOptions{ Location: location, LockEnabled: objectLockEnabled, diff --git a/cmd/bucket-metadata-sys.go b/cmd/bucket-metadata-sys.go index 08deb0185..b4c2c9b8e 100644 --- a/cmd/bucket-metadata-sys.go +++ b/cmd/bucket-metadata-sys.go @@ -45,6 +45,14 @@ type BucketMetadataSys struct { metadataMap map[string]BucketMetadata } +// Count returns number of bucket metadata map entries. +func (sys *BucketMetadataSys) Count() int { + sys.RLock() + defer sys.RUnlock() + + return len(sys.metadataMap) +} + // Remove bucket metadata from memory. func (sys *BucketMetadataSys) Remove(bucket string) { if globalIsGateway { diff --git a/cmd/generic-handlers.go b/cmd/generic-handlers.go index 211b6b717..7c9985e4b 100644 --- a/cmd/generic-handlers.go +++ b/cmd/generic-handlers.go @@ -53,6 +53,9 @@ const ( // Maximum size for user-defined metadata - See: https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html maxUserDataSize = 2 * 1024 + + // maxBuckets upto 500000 for any MinIO deployment. + maxBuckets = 500 * 1000 ) // ReservedMetadataPrefix is the prefix of a metadata key which diff --git a/docs/minio-limits.md b/docs/minio-limits.md index 1d64fdf4d..efaaca1c8 100644 --- a/docs/minio-limits.md +++ b/docs/minio-limits.md @@ -7,7 +7,6 @@ For best deployment experience MinIO recommends operating systems RHEL/CentOS 8. | Item | Specification | |:----------------------------------------------------------------|:--------------| | Maximum number of servers per cluster | no-limit | -| Maximum number of federated clusters | no-limit | | Minimum number of servers | 02 | | Minimum number of drives per server when server count is 1 | 02 | | Minimum number of drives per server when server count is 2 or 3 | 01 | @@ -20,9 +19,9 @@ For best deployment experience MinIO recommends operating systems RHEL/CentOS 8. | Item | Specification | |:--------------------------------------------------------------------------------|:----------------------------------------------| -| Maximum number of buckets | no-limit | +| Maximum number of buckets | 500000 | | Maximum number of objects per bucket | no-limit | -| Maximum object size | 5 TiB | +| Maximum object size | 50 TiB | | Minimum object size | 0 B | | Maximum object size per PUT operation | 5 TiB | | Maximum number of parts per upload | 10,000 | @@ -52,8 +51,13 @@ We found the following APIs to be redundant or less useful outside of AWS S3. If ## Object name restrictions on MinIO -- Object names that contain characters `^*|\/&";` are unsupported on Windows platform or any other file systems that do not support filenames with special charaters. **This list is non exhaustive, it depends on the operating system and filesystem under use - please consult your operating system vendor**. MinIO recommends using Linux based deployments for production workloads. -- Objects should not have conflicting objects as parent objects, applications using this behavior should change their behavior and use proper unique keys, for example situations such as following conflicting key patterns are not supported. +- Object name restrictions on MinIO are governed by OS and filesystem limitations. For example object names that contain characters `^*|\/&";` are unsupported on Windows platform or any other file systems that do not support filenames with special charaters. + +> **This list is non exhaustive, it depends on the operating system and filesystem under use - please consult your operating system vendor for a more comprehensiv list**. + +MinIO recommends using Linux operating system for for production workloads. + +- Objects must not have conflicting objects as parent objects, applications using this behavior should change their behavior and use non-conflicting unique keys, for example situations such as following conflicting key patterns are not supported. ``` PUT /a/b/1.txt