mirror of
https://github.com/apache/nifi.git
synced 2025-02-11 20:45:11 +00:00
NIFI-7827 - PutS3Object - configuration of the multipart temp dir (#4541)
This commit is contained in:
parent
fa0a1df23f
commit
a57d38c58d
@ -52,6 +52,7 @@ import org.apache.nifi.annotation.behavior.WritesAttributes;
|
||||
import org.apache.nifi.annotation.documentation.CapabilityDescription;
|
||||
import org.apache.nifi.annotation.documentation.SeeAlso;
|
||||
import org.apache.nifi.annotation.documentation.Tags;
|
||||
import org.apache.nifi.annotation.lifecycle.OnScheduled;
|
||||
import org.apache.nifi.components.AllowableValue;
|
||||
import org.apache.nifi.components.PropertyDescriptor;
|
||||
import org.apache.nifi.expression.ExpressionLanguageScope;
|
||||
@ -130,7 +131,6 @@ public class PutS3Object extends AbstractS3Processor {
|
||||
|
||||
public static final long MIN_S3_PART_SIZE = 50L * 1024L * 1024L;
|
||||
public static final long MAX_S3_PUTOBJECT_SIZE = 5L * 1024L * 1024L * 1024L;
|
||||
public static final String PERSISTENCE_ROOT = "conf/state/";
|
||||
public static final String NO_SERVER_SIDE_ENCRYPTION = "None";
|
||||
public static final String CONTENT_DISPOSITION_INLINE = "inline";
|
||||
public static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment";
|
||||
@ -254,12 +254,23 @@ public class PutS3Object extends AbstractS3Processor {
|
||||
.defaultValue("false")
|
||||
.build();
|
||||
|
||||
public static final PropertyDescriptor MULTIPART_TEMP_DIR = new PropertyDescriptor.Builder()
|
||||
.name("s3-temporary-directory-multipart")
|
||||
.displayName("Temporary Directory Multipart State")
|
||||
.description("Directory in which, for multipart uploads, the processor will locally save the state tracking the upload ID and parts "
|
||||
+ "uploaded which must both be provided to complete the upload.")
|
||||
.required(true)
|
||||
.addValidator(StandardValidators.FILE_EXISTS_VALIDATOR)
|
||||
.defaultValue("${java.io.tmpdir}")
|
||||
.expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY)
|
||||
.build();
|
||||
|
||||
public static final List<PropertyDescriptor> properties = Collections.unmodifiableList(
|
||||
Arrays.asList(KEY, BUCKET, CONTENT_TYPE, CONTENT_DISPOSITION, CACHE_CONTROL, ACCESS_KEY, SECRET_KEY, CREDENTIALS_FILE, AWS_CREDENTIALS_PROVIDER_SERVICE, OBJECT_TAGS_PREFIX, REMOVE_TAG_PREFIX,
|
||||
STORAGE_CLASS, REGION, TIMEOUT, EXPIRATION_RULE_ID, FULL_CONTROL_USER_LIST, READ_USER_LIST, WRITE_USER_LIST, READ_ACL_LIST, WRITE_ACL_LIST, OWNER,
|
||||
CANNED_ACL, SSL_CONTEXT_SERVICE, ENDPOINT_OVERRIDE, SIGNER_OVERRIDE, MULTIPART_THRESHOLD, MULTIPART_PART_SIZE, MULTIPART_S3_AGEOFF_INTERVAL,
|
||||
MULTIPART_S3_MAX_AGE, SERVER_SIDE_ENCRYPTION, ENCRYPTION_SERVICE, USE_CHUNKED_ENCODING, USE_PATH_STYLE_ACCESS,
|
||||
PROXY_CONFIGURATION_SERVICE, PROXY_HOST, PROXY_HOST_PORT, PROXY_USERNAME, PROXY_PASSWORD));
|
||||
Arrays.asList(KEY, BUCKET, CONTENT_TYPE, CONTENT_DISPOSITION, CACHE_CONTROL, ACCESS_KEY, SECRET_KEY, CREDENTIALS_FILE, AWS_CREDENTIALS_PROVIDER_SERVICE,
|
||||
OBJECT_TAGS_PREFIX, REMOVE_TAG_PREFIX, STORAGE_CLASS, REGION, TIMEOUT, EXPIRATION_RULE_ID, FULL_CONTROL_USER_LIST, READ_USER_LIST, WRITE_USER_LIST,
|
||||
READ_ACL_LIST, WRITE_ACL_LIST, OWNER, CANNED_ACL, SSL_CONTEXT_SERVICE, ENDPOINT_OVERRIDE, SIGNER_OVERRIDE, MULTIPART_THRESHOLD, MULTIPART_PART_SIZE,
|
||||
MULTIPART_S3_AGEOFF_INTERVAL, MULTIPART_S3_MAX_AGE, MULTIPART_TEMP_DIR, SERVER_SIDE_ENCRYPTION, ENCRYPTION_SERVICE, USE_CHUNKED_ENCODING,
|
||||
USE_PATH_STYLE_ACCESS, PROXY_CONFIGURATION_SERVICE, PROXY_HOST, PROXY_HOST_PORT, PROXY_USERNAME, PROXY_PASSWORD));
|
||||
|
||||
final static String S3_BUCKET_KEY = "s3.bucket";
|
||||
final static String S3_OBJECT_KEY = "s3.key";
|
||||
@ -282,6 +293,13 @@ public class PutS3Object extends AbstractS3Processor {
|
||||
|
||||
final static String S3_PROCESS_UNSCHEDULED_MESSAGE = "Processor unscheduled, stopping upload";
|
||||
|
||||
private volatile String tempDirMultipart = System.getProperty("java.io.tmpdir");
|
||||
|
||||
@OnScheduled
|
||||
public void setTempDir(final ProcessContext context) {
|
||||
this.tempDirMultipart = context.getProperty(MULTIPART_TEMP_DIR).evaluateAttributeExpressions().getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
|
||||
return properties;
|
||||
@ -298,7 +316,7 @@ public class PutS3Object extends AbstractS3Processor {
|
||||
}
|
||||
|
||||
protected File getPersistenceFile() {
|
||||
return new File(PERSISTENCE_ROOT + getIdentifier());
|
||||
return new File(this.tempDirMultipart + File.pathSeparator + getIdentifier());
|
||||
}
|
||||
|
||||
protected boolean localUploadExistsInS3(final AmazonS3Client s3, final String bucket, final MultipartState localState) {
|
||||
|
@ -70,6 +70,7 @@ public class TestPutS3Object {
|
||||
}
|
||||
};
|
||||
runner = TestRunners.newTestRunner(putS3Object);
|
||||
runner.setVariable("java.io.tmpdir", "conf/state");
|
||||
}
|
||||
|
||||
@Test
|
||||
@ -210,7 +211,7 @@ public class TestPutS3Object {
|
||||
public void testGetPropertyDescriptors() {
|
||||
PutS3Object processor = new PutS3Object();
|
||||
List<PropertyDescriptor> pd = processor.getSupportedPropertyDescriptors();
|
||||
assertEquals("size should be eq", 38, pd.size());
|
||||
assertEquals("size should be eq", 39, pd.size());
|
||||
assertTrue(pd.contains(PutS3Object.ACCESS_KEY));
|
||||
assertTrue(pd.contains(PutS3Object.AWS_CREDENTIALS_PROVIDER_SERVICE));
|
||||
assertTrue(pd.contains(PutS3Object.BUCKET));
|
||||
@ -249,5 +250,6 @@ public class TestPutS3Object {
|
||||
assertTrue(pd.contains(PutS3Object.MULTIPART_PART_SIZE));
|
||||
assertTrue(pd.contains(PutS3Object.MULTIPART_S3_AGEOFF_INTERVAL));
|
||||
assertTrue(pd.contains(PutS3Object.MULTIPART_S3_MAX_AGE));
|
||||
assertTrue(pd.contains(PutS3Object.MULTIPART_TEMP_DIR));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user