<div>Hello Ruslan, thanks for response</div><div><br></div><div>this patch alone does not fix the issue.</div><div>The last post was too long and I&#39;ve preferred to split my solution for the issue into several messages.</div>
<div>I need to change this line in Transaction_Overlay.pm</div><div><br></div><div>--- Transaction_Overlay.pm.orig 2010-07-09 14:45:52.000000000 +0200</div><div>+++ Transaction_Overlay.pm      2010-07-09 14:46:32.000000000 +0200</div>
<div>@@ -513,11 +513,11 @@</div><div>     my $Attachment = RT::Attachment-&gt;new( $self-&gt;CurrentUser );</div><div>     my ($id, $msg) = $Attachment-&gt;Create(</div><div>         TransactionId =&gt; $self-&gt;Id,</div>
<div>         Attachment    =&gt; $MIMEObject</div><div>     );</div><div>-    return ( $Attachment, $msg || $self-&gt;loc(&quot;Attachment created&quot;) );</div><div>+    return ( $id, $msg || $self-&gt;loc(&quot;Attachment created&quot;) );</div>
<div> }</div><div><br></div><div> # }}}</div><div><br></div><div> # }}}</div><div><br></div><div><br></div><div>And finally this ugly patch to rt-mailgate, I hope someone with higher skills in perl/mason could make something better with the returned status.</div>
<div><br></div><div>--- rt-mailgate.orig    2010-07-09 14:57:49.000000000 +0200</div><div>+++ rt-mailgate 2010-07-09 15:18:27.000000000 +0200</div><div>@@ -61,6 +61,7 @@</div><div> $DYNAMIC_FILE_UPLOAD = 1;</div><div><br>
</div><div> use constant EX_TEMPFAIL =&gt; 75;</div><div>+use constant EX_UNKNOWERR =&gt; 76;</div><div> use constant BUFFER_SIZE =&gt; 8192;</div><div><br></div><div> my %opts;</div><div>@@ -131,7 +132,18 @@</div><div> my $content = $r-&gt;content;</div>
<div> print STDERR $content .&quot;\n&quot; if $opts{&#39;debug&#39;};</div><div><br></div><div>-if ( $content !~ /^(ok|not ok)/ ) {</div><div>+if ( $content !~ /^(ok)/ ) {</div><div>+</div><div>+    # Ticket could not be created for unknow reason.</div>
<div>+    # Return non zero to avoid that fetchmail clear email from mail server.</div><div>+    print STDERR &lt;&lt;EOF;</div><div>+RT server error.</div><div>+</div><div>+The RT server sends an unexpected error.</div><div>
+EOF</div><div>+</div><div>+    exit EX_UNKNOWERR;</div><div>+} elsif ( $content !~ /^(not ok)/ ) {</div><div><br></div><div>     # It&#39;s not the server&#39;s fault if the mail is bogus. We just want to know that</div>
<div>     # *something* came out of the server.</div><div>@@ -145,10 +157,10 @@</div><div> EOF</div><div><br></div><div>     exit EX_TEMPFAIL;</div><div>+} else {</div><div>+    exit;</div><div> }</div><div><br></div><div>
-exit;</div><div>-</div><div> END {</div><div>     unlink $message{&#39;filename&#39;} if $message{&#39;filename&#39;};</div><div> }</div><div><br></div><div>I hope those patches fix the issue and don&#39;t break anything else</div>
<div>Andrés.</div><div><br></div><br><div class="gmail_quote">2010/7/9 Ruslan Zakirov <span dir="ltr">&lt;<a href="mailto:ruz@bestpractical.com">ruz@bestpractical.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hello Andres,<br>
<br>
As I understand the following change will fix the issue for you. If it<br>
does then drop me a note and I&#39;ll push it into core. If it doesn&#39;t<br>
then we should investigate more. Don&#39;t forget to restart the web<br>
server after patching.<br>
<br>
I think it&#39;s a bug. We can not guaranty that everything will work<br>
perfectly when you&#39;re out of space on disks, but this patch should<br>
bring more sanity.<br>
<br>
diff --git a/lib/RT/Attachment_Overlay.pm b/lib/RT/Attachment_Overlay.pm<br>
index e3c1b9c..8c60185 100644<br>
--- a/lib/RT/Attachment_Overlay.pm<br>
+++ b/lib/RT/Attachment_Overlay.pm<br>
@@ -154,6 +154,7 @@ sub Create {<br>
<div class="im"><br>
         unless ($id) {<br>
             $RT::Logger-&gt;crit(&quot;Attachment insert failed - &quot;.<br>
$RT::Handle-&gt;dbh-&gt;errstr);<br>
+            return ($id);<br>
         }<br>
<br>
</div><div class="im">         foreach my $part ( $Attachment-&gt;parts ) {<br>
</div>@@ -165,6 +166,7 @@ sub Create {<br>
<div class="im">             );<br>
             unless ($id) {<br>
                 $RT::Logger-&gt;crit(&quot;Attachment insert failed: &quot;.<br>
$RT::Handle-&gt;dbh-&gt;errstr);<br>
+                return ($id);<br>
             }<br>
         }<br>
</div>         return ($id);<br>
<div><div></div><div class="h5"><br>
<br>
On Fri, Jul 9, 2010 at 1:55 PM, Andrés Schiavo &lt;<a href="mailto:andresschiavo@gmail.com">andresschiavo@gmail.com</a>&gt; wrote:<br>
&gt; Hi, I&#39;m currently working with a RT 3 instance and I&#39;ve found that some<br>
&gt; Tickets could be created with missing content under specific situations.<br>
&gt; This is my scenario:<br>
&gt; * RT 3.8.7 runnig on RHEL5 with perl 5.8.8<br>
&gt; * Oracle 10g database<br>
&gt; * External mail server and fetchmail to recover emails<br>
&gt; This RT instance is quite special, we recive a lot of spam (we are working<br>
&gt; to fix it) and the database grows quickly. During working days our<br>
&gt; monitoring agents alert us about reaching  database space limit, but if this<br>
&gt; happen on weekend, nobody extends de DB until Monday.<br>
&gt; Because of Spam we have configured fetchmail with &quot;no keep&quot; option, so if<br>
&gt; Ticket creation fails and fetchmail does not recieve an error return code<br>
&gt; the information of the email is lost.<br>
&gt; I know that this are a lot of &quot;special situations&quot; but I think that<br>
&gt; rt-mailgate should return non zero result when RT couldn&#39;t create the Ticket<br>
&gt; correctly.<br>
&gt; I haven&#39;t try to reproduce with other databases than Oracle, but I&#39;ve<br>
&gt; reproduce this behavior on two different Oracle instances<br>
&gt; This are the steps to reproduce the issue:<br>
&gt; When rt database tablesapce is full, fetchmail try to recover an email (with<br>
&gt; an attachment or an html email).<br>
&gt; Ticket is created but we end up with no attach or no text if email was html.<br>
&gt; Fetchmail recive a 0 ret code and erase email from server.<br>
&gt; I&#39;ve attach the rt log when attachment insert fails.<br>
&gt; I don&#39;t know if this is a bug or that&#39;s the way it&#39;s supposed to work, but<br>
&gt; we can&#39;t loose the email information.<br>
&gt; If this is a bug, I think that could be generated by the scope of the<br>
&gt; variable $id in this code (Attachment_Overlay line 140)<br>
&gt;     # If a message has no bodyhandle, that means that it has subparts (or<br>
&gt; appears to)<br>
&gt;     # and we should act accordingly.<br>
&gt;     unless ( defined $Attachment-&gt;bodyhandle ) {<br>
&gt;         my ($id) = $self-&gt;SUPER::Create(<br>
&gt;             TransactionId =&gt; $args{&#39;TransactionId&#39;},<br>
&gt;             Parent        =&gt; $args{&#39;Parent&#39;},<br>
&gt;             ContentType   =&gt; $Attachment-&gt;mime_type,<br>
&gt;             Headers       =&gt; $head,<br>
&gt;             MessageId     =&gt; $MessageId,<br>
&gt;             Subject       =&gt; $Subject,<br>
&gt;         );<br>
&gt;         unless ($id) {<br>
&gt;             $RT::Logger-&gt;crit(&quot;Attachment insert failed - &quot;.<br>
&gt; $RT::Handle-&gt;dbh-&gt;errstr);<br>
&gt;         }<br>
&gt;         foreach my $part ( $Attachment-&gt;parts ) {<br>
&gt;             my $SubAttachment = new RT::Attachment( $self-&gt;CurrentUser );<br>
&gt;             my ($id) = $SubAttachment-&gt;Create(<br>
&gt;                 TransactionId =&gt; $args{&#39;TransactionId&#39;},<br>
&gt;                 Parent        =&gt; $id,<br>
&gt;                 Attachment    =&gt; $part,<br>
&gt;             );<br>
&gt;             unless ($id) {<br>
&gt;                 $RT::Logger-&gt;crit(&quot;Attachment insert failed: &quot;.<br>
&gt; $RT::Handle-&gt;dbh-&gt;errstr);<br>
&gt;             }<br>
&gt;         }<br>
&gt;         return ($id);<br>
&gt;     }<br>
&gt;     #If it&#39;s not multipart<br>
&gt;     else {<br>
&gt;         my ($ContentEncoding, $Body) = $self-&gt;_EncodeLOB(<br>
&gt;             $Attachment-&gt;bodyhandle-&gt;as_string,<br>
&gt;<br>
&gt; If the first SUPER::Create is successfull, the $id value isn&#39;t undef, but<br>
&gt; within the foreach loop, if an error ocurred adding Subattachments the crit<br>
&gt; message is printed because the inner $id is undef, but the returned value is<br>
&gt; the outer $id that is not undef, so the Ticket is created despite the error<br>
&gt; adding a subattachment. Adding a return($id) inside the foreach loop solves<br>
&gt; the problem an RT knows that Ticket can not be completly created.<br>
&gt; This post is too long and don&#39;t want to add more info (specially with this<br>
&gt; terrible bad english), but despite the error returned to rt-mailgate when<br>
&gt; Ticket creation fails, it tells fetchmail that everything is ok and email is<br>
&gt; deleted. I&#39;ve made an ugly hack to make it work, but I think that<br>
&gt; check_for_failure() in rt-mailgate could get te correct return code, I&#39;m not<br>
&gt; a perl expert and couldn&#39;t make it work, any help?<br>
&gt; Anyway, do you think that this is a bug or a feature?<br>
&gt; Best regards.<br>
&gt; Andres.<br>
<br>
<br>
<br>
</div></div><font color="#888888">--<br>
Best regards, Ruslan.<br>
</font></blockquote></div><br>