Return-Path: X-Original-To: apmail-db-derby-commits-archive@www.apache.org Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 52253D0A5 for ; Fri, 5 Oct 2012 13:50:00 +0000 (UTC) Received: (qmail 87578 invoked by uid 500); 5 Oct 2012 13:50:00 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 87552 invoked by uid 500); 5 Oct 2012 13:50:00 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 87535 invoked by uid 99); 5 Oct 2012 13:49:59 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 05 Oct 2012 13:49:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 05 Oct 2012 13:49:55 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 1296A23888FE; Fri, 5 Oct 2012 13:49:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1394522 - in /db/derby/code/trunk/java/engine/org/apache/derby: iapi/store/raw/data/DataFactory.java impl/store/raw/RawStore.java impl/store/raw/data/BaseDataFileFactory.java impl/store/raw/data/EncryptOrDecryptData.java Date: Fri, 05 Oct 2012 13:49:10 -0000 To: derby-commits@db.apache.org From: kristwaa@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121005134911.1296A23888FE@eris.apache.org> Author: kristwaa Date: Fri Oct 5 13:49:10 2012 New Revision: 1394522 URL: http://svn.apache.org/viewvc?rev=1394522&view=rev Log: DERBY-5792: Make it possible to turn off encryption on an already encrypted database. Simplified code removing old container files generated during encryption and decryption of a database. There were two implementations, I removed one of them and removed the parameter of EncryptOrDecryptData.removeOldVersionOfContainers (and calling methods). Patch file: derby-5792-5b-old_container_removal_cleanup.diff Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/data/DataFactory.java db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseDataFileFactory.java db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/EncryptOrDecryptData.java Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/data/DataFactory.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/data/DataFactory.java?rev=1394522&r1=1394521&r2=1394522&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/data/DataFactory.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/store/raw/data/DataFactory.java Fri Oct 5 13:49:10 2012 @@ -32,7 +32,6 @@ import org.apache.derby.iapi.store.raw.C import org.apache.derby.iapi.store.raw.Corruptable; import org.apache.derby.iapi.store.raw.LockingPolicy; import org.apache.derby.iapi.store.raw.RawStoreFactory; -import org.apache.derby.iapi.store.raw.RecordHandle; import org.apache.derby.iapi.store.raw.StreamContainerHandle; import org.apache.derby.iapi.store.raw.xact.RawTransaction; import org.apache.derby.iapi.store.raw.Transaction; @@ -301,13 +300,10 @@ public interface DataFactory extends Cor throws StandardException; /** - * Remove old versions of the containers after (re)encryption - * of the database. - * @param inRecovery true , if cleanup is - * happening during recovery. - * @exception StandardException Standard Derby Error Policy + * Removes old versions of the containers after a cryptographic operation + * on the database. */ - public void removeOldVersionOfContainers(boolean inRecovery) + public void removeOldVersionOfContainers() throws StandardException; /** Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java?rev=1394522&r1=1394521&r2=1394522&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/RawStore.java Fri Oct 5 13:49:10 2012 @@ -1836,7 +1836,7 @@ public final class RawStore implements R // database is (re)encrypted successfuly, // remove the old version of the container files. - dataFactory.removeOldVersionOfContainers(false); + dataFactory.removeOldVersionOfContainers(); if (decryptDatabase) { // By now we can remove all cryptographic properties. @@ -2047,7 +2047,7 @@ public final class RawStore implements R if (dbEncryptionStatus == RawStoreFactory.DB_ENCRYPTION_IN_CLEANUP) { // remove all the old versions of the containers. - dataFactory.removeOldVersionOfContainers(true); + dataFactory.removeOldVersionOfContainers(); } if (SanityManager.DEBUG) { Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseDataFileFactory.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseDataFileFactory.java?rev=1394522&r1=1394521&r2=1394522&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseDataFileFactory.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/BaseDataFileFactory.java Fri Oct 5 13:49:10 2012 @@ -198,9 +198,6 @@ public class BaseDataFileFactory private Hashtable postRecoveryRemovedFiles; - private EncryptOrDecryptData containerEncrypter; - - // PrivilegedAction actions private int actionCode; private static final int REMOVE_TEMP_DIRECTORY_ACTION = 2; @@ -2102,39 +2099,23 @@ public class BaseDataFileFactory /** {@inheritDoc} */ public void decryptAllContainers(RawTransaction t) throws StandardException { - containerEncrypter = new EncryptOrDecryptData(this); - containerEncrypter.decryptAllContainers(t); + EncryptOrDecryptData containerDecrypter = new EncryptOrDecryptData(this); + containerDecrypter.decryptAllContainers(t); } - + /** {@inheritDoc} */ - public void encryptAllContainers(RawTransaction t) throws StandardException - { - containerEncrypter = new EncryptOrDecryptData(this); - // encrypt all the containers in the database + public void encryptAllContainers(RawTransaction t) + throws StandardException { + EncryptOrDecryptData containerEncrypter = new EncryptOrDecryptData(this); containerEncrypter.encryptAllContainers(t); } - - - /* - * Remover old versions of the containers after (re)encryption - * of the database. - * @param inRecovery true , if cleanup is - * happening during recovery. - */ - public void removeOldVersionOfContainers(boolean inRecovery) - throws StandardException - { - // check if old containers are being during recovery - // because of a crash after successful completion of - // (re)encryption of the dataabase, but before the - // (re)encryption cleanup was complete. - if (inRecovery) { - containerEncrypter = new EncryptOrDecryptData(this); - } - containerEncrypter.removeOldVersionOfContainers(inRecovery); - containerEncrypter = null; - } + /** {@inheritDoc} */ + public void removeOldVersionOfContainers() + throws StandardException { + EncryptOrDecryptData containerCryptoOp = new EncryptOrDecryptData(this); + containerCryptoOp.removeOldVersionOfContainers(); + } /** * Return a jar file by asking the class's Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/EncryptOrDecryptData.java URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/EncryptOrDecryptData.java?rev=1394522&r1=1394521&r2=1394522&view=diff ============================================================================== --- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/EncryptOrDecryptData.java (original) +++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/raw/data/EncryptOrDecryptData.java Fri Oct 5 13:49:10 2012 @@ -63,9 +63,6 @@ public class EncryptOrDecryptData implem private BaseDataFileFactory dataFactory; private StorageFactory storageFactory; - private StorageFile[] oldFiles; - private int noOldFiles = 0; - /* privileged actions */ private static final int STORAGE_FILE_EXISTS_ACTION = 1; @@ -118,8 +115,6 @@ public class EncryptOrDecryptData implem // simply reading the list of files in seg0. String[] files = dataFactory.getContainerNames(); if (files != null) { - oldFiles = new StorageFile[files.length]; - noOldFiles = 0; long segmentId = 0; // Loop through all the files in seg0 and @@ -141,18 +136,18 @@ public class EncryptOrDecryptData implem ContainerKey ckey = new ContainerKey(segmentId, containerId); - oldFiles[noOldFiles++] = - encryptOrDecryptContainer(t, ckey, doEncrypt); + encryptOrDecryptContainer(t, ckey, doEncrypt); } // Old versions of the container files will // be removed after the (re)encryption of database // is completed. - } else - { - if (SanityManager.DEBUG) - SanityManager.THROWASSERT("encryption process is unable to" + - "read container names in seg0"); + } else { + if (SanityManager.DEBUG) { + SanityManager.THROWASSERT( + (doEncrypt ? "encryption" : "decryption") + + " process is unable to read container names in seg0"); + } } } @@ -164,12 +159,11 @@ public class EncryptOrDecryptData implem * @param t transaction that used to perform the cryptographic operation * @param ckey the key of the container that is being encrypted/decrypted * @param doEncrypt tells whether to encrypt or decrypt - * @return File handle to the old copy of the container. * @exception StandardException Standard Derby error policy */ - private StorageFile encryptOrDecryptContainer(RawTransaction t, - ContainerKey ckey, - boolean doEncrypt) + private void encryptOrDecryptContainer(RawTransaction t, + ContainerKey ckey, + boolean doEncrypt) throws StandardException { @@ -247,8 +241,6 @@ public class EncryptOrDecryptData implem newFile, currentFile); } - - return oldFile ; } @@ -275,14 +267,9 @@ public class EncryptOrDecryptData implem return sb.toString(); } - private boolean isOldContainerFile(String fileName) - { - // all old versions of the conatainer files - // start with prefix "o" and ends with ".dat" - if (fileName.startsWith("o") && fileName.endsWith(".dat")) - return true; - else - return false; + private boolean isOldContainerFile(String fileName) { + // Old versions start with prefix "o" and ends with ".dat". + return (fileName.startsWith("o") && fileName.endsWith(".dat")); } private StorageFile getFile(String ctrFileName) @@ -353,60 +340,30 @@ public class EncryptOrDecryptData implem } - /* - * Remove all the old version (encrypted with old key or - * un-encrypted) of the containers stored in the data directory . - * - * @param inRecovery true , if cleanup is - * happening during recovery. - * @exception StandardException Standard Derby Error Policy + /** + * Removes old versions of the containers after a cryptographic operation + * on the database. */ - public void removeOldVersionOfContainers(boolean inRecovery) - throws StandardException - { - - if (inRecovery) - { - // find the old version of the container files - // and delete them - String[] files = dataFactory.getContainerNames(); - if (files != null) - { - // loop through all the files in seg0 and - // delete all old copies of the containers. - for (int i = files.length-1; i >= 0 ; i--) - { - // if it is a old version of the container file - // delete it. - if (isOldContainerFile(files[i])) - { - StorageFile oldFile = getFile(files[i]); - if (!privDelete(oldFile)) - { - throw StandardException.newException( - SQLState.FILE_CANNOT_REMOVE_FILE, - oldFile); - } + public void removeOldVersionOfContainers() + throws StandardException { + // Find the old version of the container files and delete them. + String[] files = dataFactory.getContainerNames(); + if (files != null) { + // Loop through all the files in seg0 and + // delete all old copies of the containers. + for (int i = files.length-1; i >= 0 ; i--) { + if (isOldContainerFile(files[i])) { + StorageFile oldFile = getFile(files[i]); + if (!privDelete(oldFile)) { + throw StandardException.newException( + SQLState.FILE_CANNOT_REMOVE_FILE, + oldFile); } } } - }else - { - // delete all the old version of the containers. - for (int i = 0 ; i < noOldFiles ; i++) - { - if (!privDelete(oldFiles[i])) - { - throw StandardException.newException( - SQLState.FILE_CANNOT_REMOVE_FILE, - oldFiles[i]); - } - } } } - - private synchronized boolean privExists(StorageFile file) { actionCode = STORAGE_FILE_EXISTS_ACTION;