[ 
http://issues.apache.org/jira/browse/DERBY-606?page=comments#action_12455046 ] 
            
Suresh Thalamati commented on DERBY-606:
----------------------------------------

Thanks for considering my suggestions.  Extra check(if( !(this instanceof
CompressSpacePageOperation10_2) ) in the  CompressSpacePageOperation.java 
is ok. You need some kind of check in  to correctly call the 
writeExternal/readExternal. Only othe alternative I can think of is to 
check for formatId instead of using the "instanceof". 


While reviewing the latest patches(derby606_impl-v4.diff and 
derby606_upgrade-v4.diff ), 
noticed you are disabling IN_PLACE_COMPRESS  on soft-upgrade to 10.3, in my 
view that is incorrect. If I understand correctly this bug happens only on 
large data size and does not leave the database in the corrupt state. 

I believe right thing to do is to use the old log record on soft-upgrade to
10.3 and allow compress. If you would like to be real nice to the users 
then you can catch the bugs case and throw an error message, but I think it is
not required; users hitting the bug case first time on a a soft-upgrade is 
almost zero probability. 
  
Index: 
java/engine/org/apache/derby/impl/store/raw/data/LoggableAllocActions.java

+       if( 
t.getLogFactory().checkVersion(RawStoreFactory.DERBY_STORE_MAJOR_VERSION_10,
+                                       
RawStoreFactory.DERBY_STORE_MINOR_VERSION_3,
+                                       "CompressSpace operation on an existing 
database") )

Above call throws an exception if version is not at the correct level, in this
case if not at  10.3. I think if you pass "null" for feature name , it will
just return true/false. 


Please also fix the upgrade tests also, if you decide to allow compress on 
soft-upgrade. 

I am sorry for missing this in my previous review. 


There is one major problem with the latest patch, it can make database 
non-recoverable on upgrade from 10.2.

1) Formatid are incorrect for CompressSpacePageOperation10_2 and    
CompressSpacePageOperation. 
   CompressSpacePageOperation should have the new format id and  the
   CompressSpacePageOperation10_2 should have the OLD one. 

Related changes :

Index: 
java/engine/org/apache/derby/impl/store/raw/data/CompressSpacePageOperation10_2.java
+
+       /**
+               Return my format identifier.
+       */
+       public int getTypeFormatId() {
+               return super.getTypeFormatId();
+       }

I am sure , you wanted it to return StoredFormatIds.LOGOP_COMPRESS10_2_SPACE;  

and  also :
Index: java/engine/org/apache/derby/iapi/services/io/RegisteredFormatIds.java
+       /* 465 */   
"org.apache.derby.impl.store.raw.data.CompressSpacePageOperation10_2",

That shoud have been
"org.apache.derby.impl.store.raw.data.CompressSpacePageOperation" and you
should change existing entry for compress to "CompressSpacePageOperation10_2".

and the format id numbers should get changed  also :
Index: java/engine/org/apache/derby/iapi/services/io/StoredFormatIds.java
         public static final int LOGOP_COMPRESS_SPACE =
                 (MIN_ID_2 + 454);
 
+       /* org.apache.derby.impl.store.raw.data.CompressSpacePageOperation10_2 
*/
+        public static final int LOGOP_COMPRESS10_2_SPACE =
+                (MIN_ID_2 + 465);
+



2) In the upgrade test , why you need to insert  104000 rows ? I think you 
can produce the compress log record with less number of records and reduce
the test time.  

+                       try {
+                               checkDataToCase606(conn, 0, 104000, true);
+                       } catch(SQLException sqle) {
+                               passed = isExpectedException(sqle, "XSLB1");
+                       }



Thanks
-suresh

> SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE fails on (very) large tables
> --------------------------------------------------------------------
>
>                 Key: DERBY-606
>                 URL: http://issues.apache.org/jira/browse/DERBY-606
>             Project: Derby
>          Issue Type: Bug
>          Components: Store
>    Affects Versions: 10.1.1.0
>         Environment: Java 1.5.0_04 on Windows Server 2003 Web Edition
>            Reporter: Jeffrey Aguilera
>         Assigned To: Mayuresh Nirhali
>             Fix For: 10.3.0.0
>
>         Attachments: A606Test.java, derby606-v2.diff, derby606-v3.diff, 
> derby606_impl-v4.diff, derby606_upgrade-v4.diff, derby606_v1.diff
>
>
> SYSCS_UTIL.SYSCS_INPLACE_COMPRESS_TABLE fails with one of the following error 
> messages when applied to a very large table (>2GB):
> Log operation null encounters error writing itself out to the log stream, 
> this could be caused by an errant log operation or internal log buffer full 
> due to excessively large log operation. SQLSTATE: XJ001: Java exception: ': 
> java.io.IOException'.
> or
> The exception 'java.lang.ArrayIndexOutOfBoundsException' was thrown while 
> evaluating an expression. SQLSTATE: XJ001: Java exception: ': 
> java.lang.ArrayIndexOutOfBoundsException'.
> In either case, no entry is written to the console log or to derby.log.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to