[
https://issues.apache.org/jira/browse/DERBY-7116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17342976#comment-17342976
]
Bryan Pendleton commented on DERBY-7116:
----------------------------------------
Hi Rick, I think that Sam's theory that the other accessor of the file is a
Security scanner or a Backup program or some other sort of utility software is
a pretty good theory.
But I don't know how to write Java software that coordinates with such other
system software cleanly.
> Meta-data for unknown could not be accessed to read
> ---------------------------------------------------
>
> Key: DERBY-7116
> URL: https://issues.apache.org/jira/browse/DERBY-7116
> Project: Derby
> Issue Type: Bug
> Components: SQL, Store
> Affects Versions: 10.14.2.0
> Environment: Windows 10
> Reporter: Sam Hutchins
> Priority: Major
>
> Hi,
>
> I'm afraid I don't have a reproducible case for this, but it's an issue we've
> seen in the wild on customer's machines. I'd guess it's specific to Windows,
> as other platforms don't support exclusive locks, and we've only ever seen it
> reported from Windows users.
>
> The `ConcurrentCache` in the stacktrace makes me wonder if Derby is able to
> lock itself out of the database under the right conditions. Here's the trace:
>
> {code:java}
> Caused by: java.sql.SQLException: Meta-data for unknown could not be accessed
> to read
> C:\Users\USER\.ScreamingFrogSEOSpider\ProjectInstanceData\6b422f28-46c9-492e-bbde-aeb5bc1e6307\results_10505723-008c-4b06-aa69-2c676ef858c8\sql\seg0\c71.dat
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java)
> at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java)
> at
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeQuery(EmbedPreparedStatement.java)
> at
> uk.co.screamingfrog.seospider.db.AbstractDuplicateTableOperations.getSpiderUrls(AbstractDuplicateTableOperations.java:152)
> ... 17 more
> Caused by: ERROR XSDG3: Meta-data for unknown could not be accessed to read
> C:\Users\USER\.ScreamingFrogSEOSpider\ProjectInstanceData\6b422f28-46c9-492e-bbde-aeb5bc1e6307\results_10505723-008c-4b06-aa69-2c676ef858c8\sql\seg0\c71.dat
> at
> org.apache.derby.iapi.error.StandardException.newException(StandardException.java)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory.java)
> ... 28 more
> Caused by: java.io.FileNotFoundException:
> C:\Users\USER\.ScreamingFrogSEOSpider\ProjectInstanceData\6b422f28-46c9-492e-bbde-aeb5bc1e6307\results_10505723-008c-4b06-aa69-2c676ef858c8\sql\seg0\c71.dat
> (The process cannot access the file because it is being used by another
> process)
> at java.base/java.io.RandomAccessFile.open0(Native Method)
> at java.base/java.io.RandomAccessFile.open(Unknown Source)
> at java.base/java.io.RandomAccessFile.<init>(Unknown Source)
> at java.base/java.io.RandomAccessFile.<init>(Unknown Source)
> at
> org.apache.derby.impl.io.DirRandomAccessFile.<init>(DirRandomAccessFile.java)
> at org.apache.derby.impl.io.DirFile.getRandomAccessFile(DirFile.java)
> at
> org.apache.derby.impl.store.raw.data.RAFContainer.run(RAFContainer.java)
> at java.base/java.security.AccessController.doPrivileged(Native Method)
> at
> org.apache.derby.impl.store.raw.data.RAFContainer.openContainer(RAFContainer.java)
> at
> org.apache.derby.impl.store.raw.data.RAFContainer4.openContainer(RAFContainer4.java)
> at
> org.apache.derby.impl.store.raw.data.FileContainer.setIdent(FileContainer.java)
> at
> org.apache.derby.impl.store.raw.data.FileContainer.setIdentity(FileContainer.java)
> at
> org.apache.derby.impl.services.cache.ConcurrentCache.find(ConcurrentCache.java)
> at
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.openContainer(BaseDataFileFactory.java)
> at
> org.apache.derby.impl.store.raw.data.BaseDataFileFactory.openContainer(BaseDataFileFactory.java)
> at org.apache.derby.impl.store.raw.xact.Xact.openContainer(Xact.java)
> at
> org.apache.derby.impl.store.access.btree.OpenBTree.init(OpenBTree.java)
> at
> org.apache.derby.impl.store.access.btree.BTreeScan.init(BTreeScan.java)
> at
> org.apache.derby.impl.store.access.btree.index.B2IForwardScan.init(B2IForwardScan.java)
> at org.apache.derby.impl.store.access.btree.index.B2I.openScan(B2I.java)
> at
> org.apache.derby.impl.store.access.RAMTransaction.openScan(RAMTransaction.java)
> at
> org.apache.derby.impl.store.access.RAMTransaction.openScan(RAMTransaction.java)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getDescriptorViaIndexMinion(DataDictionaryImpl.java)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getDescriptorViaIndex(DataDictionaryImpl.java)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getTableDescriptorIndex1Scan(DataDictionaryImpl.java)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getUncachedTableDescriptor(DataDictionaryImpl.java)
> at
> org.apache.derby.impl.sql.catalog.NameTDCacheable.setIdentity(NameTDCacheable.java)
> at
> org.apache.derby.impl.services.cache.ConcurrentCache.find(ConcurrentCache.java)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.getTableDescriptor(DataDictionaryImpl.java)
> at
> org.apache.derby.impl.sql.compile.QueryTreeNode.getTableDescriptor(QueryTreeNode.java)
> at
> org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(FromBaseTable.java)
> at
> org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(FromBaseTable.java)
> at org.apache.derby.impl.sql.compile.FromList.bindTables(FromList.java)
> at
> org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(SelectNode.java)
> at
> org.apache.derby.impl.sql.compile.DMLStatementNode.bindTables(DMLStatementNode.java)
> at
> org.apache.derby.impl.sql.compile.DMLStatementNode.bind(DMLStatementNode.java)
> at
> org.apache.derby.impl.sql.compile.CursorNode.bindStatement(CursorNode.java)
> at
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java)
> at
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.rePrepare(GenericPreparedStatement.java)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java)
> ... 21 more {code}
>
> The exception message mentions "another process", but it's possible to get
> exactly this error message in a single Java application:
>
> {code:java}
> public static void main(
> final String[] args) throws Exception
> {
> final Path path = Path.of("lock");
> path.toFile().createNewFile();
> try (final FileChannel channel = FileChannel.open(path,
> StandardOpenOption.APPEND))
> {
> channel.lock(0, Long.MAX_VALUE, false);
> System.out.println("Locked");
> final FileInputStream fis = new FileInputStream(path.toFile());
> fis.readAllBytes();
> System.out.println("Done");
> }
> } {code}
>
> On Windows, this will throw a similar exception.
>
> If, however, it is a problem caused by some other piece of software (such as
> antivirus or backup software), is there a way for Derby to use this same
> locking mechanism to lock out those other applications?
--
This message was sent by Atlassian Jira
(v8.3.4#803005)