[Rt-devel] rt-mailgate issue: Empty Tickets created if Attachment insert fails
Ruslan Zakirov
ruz at bestpractical.com
Fri Jul 9 07:33:29 EDT 2010
Hello Andres,
As I understand the following change will fix the issue for you. If it
does then drop me a note and I'll push it into core. If it doesn't
then we should investigate more. Don't forget to restart the web
server after patching.
I think it's a bug. We can not guaranty that everything will work
perfectly when you're out of space on disks, but this patch should
bring more sanity.
diff --git a/lib/RT/Attachment_Overlay.pm b/lib/RT/Attachment_Overlay.pm
index e3c1b9c..8c60185 100644
--- a/lib/RT/Attachment_Overlay.pm
+++ b/lib/RT/Attachment_Overlay.pm
@@ -154,6 +154,7 @@ sub Create {
unless ($id) {
$RT::Logger->crit("Attachment insert failed - ".
$RT::Handle->dbh->errstr);
+ return ($id);
}
foreach my $part ( $Attachment->parts ) {
@@ -165,6 +166,7 @@ sub Create {
);
unless ($id) {
$RT::Logger->crit("Attachment insert failed: ".
$RT::Handle->dbh->errstr);
+ return ($id);
}
}
return ($id);
On Fri, Jul 9, 2010 at 1:55 PM, Andrés Schiavo <andresschiavo at gmail.com> wrote:
> Hi, I'm currently working with a RT 3 instance and I've found that some
> Tickets could be created with missing content under specific situations.
> This is my scenario:
> * RT 3.8.7 runnig on RHEL5 with perl 5.8.8
> * Oracle 10g database
> * External mail server and fetchmail to recover emails
> This RT instance is quite special, we recive a lot of spam (we are working
> to fix it) and the database grows quickly. During working days our
> monitoring agents alert us about reaching database space limit, but if this
> happen on weekend, nobody extends de DB until Monday.
> Because of Spam we have configured fetchmail with "no keep" option, so if
> Ticket creation fails and fetchmail does not recieve an error return code
> the information of the email is lost.
> I know that this are a lot of "special situations" but I think that
> rt-mailgate should return non zero result when RT couldn't create the Ticket
> correctly.
> I haven't try to reproduce with other databases than Oracle, but I've
> reproduce this behavior on two different Oracle instances
> This are the steps to reproduce the issue:
> When rt database tablesapce is full, fetchmail try to recover an email (with
> an attachment or an html email).
> Ticket is created but we end up with no attach or no text if email was html.
> Fetchmail recive a 0 ret code and erase email from server.
> I've attach the rt log when attachment insert fails.
> I don't know if this is a bug or that's the way it's supposed to work, but
> we can't loose the email information.
> If this is a bug, I think that could be generated by the scope of the
> variable $id in this code (Attachment_Overlay line 140)
> # If a message has no bodyhandle, that means that it has subparts (or
> appears to)
> # and we should act accordingly.
> unless ( defined $Attachment->bodyhandle ) {
> my ($id) = $self->SUPER::Create(
> TransactionId => $args{'TransactionId'},
> Parent => $args{'Parent'},
> ContentType => $Attachment->mime_type,
> Headers => $head,
> MessageId => $MessageId,
> Subject => $Subject,
> );
> unless ($id) {
> $RT::Logger->crit("Attachment insert failed - ".
> $RT::Handle->dbh->errstr);
> }
> foreach my $part ( $Attachment->parts ) {
> my $SubAttachment = new RT::Attachment( $self->CurrentUser );
> my ($id) = $SubAttachment->Create(
> TransactionId => $args{'TransactionId'},
> Parent => $id,
> Attachment => $part,
> );
> unless ($id) {
> $RT::Logger->crit("Attachment insert failed: ".
> $RT::Handle->dbh->errstr);
> }
> }
> return ($id);
> }
> #If it's not multipart
> else {
> my ($ContentEncoding, $Body) = $self->_EncodeLOB(
> $Attachment->bodyhandle->as_string,
>
> If the first SUPER::Create is successfull, the $id value isn't undef, but
> within the foreach loop, if an error ocurred adding Subattachments the crit
> message is printed because the inner $id is undef, but the returned value is
> the outer $id that is not undef, so the Ticket is created despite the error
> adding a subattachment. Adding a return($id) inside the foreach loop solves
> the problem an RT knows that Ticket can not be completly created.
> This post is too long and don't want to add more info (specially with this
> terrible bad english), but despite the error returned to rt-mailgate when
> Ticket creation fails, it tells fetchmail that everything is ok and email is
> deleted. I've made an ugly hack to make it work, but I think that
> check_for_failure() in rt-mailgate could get te correct return code, I'm not
> a perl expert and couldn't make it work, any help?
> Anyway, do you think that this is a bug or a feature?
> Best regards.
> Andres.
--
Best regards, Ruslan.
More information about the rt-devel
mailing list