You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Dmitry Makivsky (JIRA)" <ji...@apache.org> on 2012/11/08 18:48:13 UTC

[jira] [Commented] (JCR-2751) jackrabbit-standalone-server migration option does not work

    [ https://issues.apache.org/jira/browse/JCR-2751?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13493332#comment-13493332 ] 

Dmitry Makivsky commented on JCR-2751:
--------------------------------------

Hello Srinivas,

It seems that my comment is no more actual for you, but in any case it can be useful for some one other.

I have run into the same issue during data migration from a local Derby-based Jackrabbit repository to a remote Oracle-based one, and I was lucky to find a workaround.

I noticed that the repository copier tool works well, when I:
- copy data from a local Derby-based repository to a local Derby-based repository;
- copy data from a remote Oracle-based repository to a local Derby-based repository;
but when I try to copy data from a local Derby-based repository to a remote Oracle-based repository, I get an empty repository.
Also I noticed that tables in my oracle database are filled with data, during data migration.
Bug that you reported, gave me an idea that the problem is somewhere in configuration between Jackrabbit and a remote database.


I tried to debug code of RepositoryCopier and what I found:
1. If you follow by the documentation during the data migration, you should prepare a home folder and file "repository.xml" for a new repository. Jackrabbit installation tool will use this configuration file (repository.xml) to deploy the new repository. So the section of the default workspace configuration from file repository.xml will be copied to a configuration file of each workspace (by default there are two workspaces with names: default, security). As a result your workspaces will have absolutely equal configuration and all PersisnteceManagers of the all workspaces will be pointed to the same table in the database.
It is the first minor issue.

2. Each workspace of Jackrabbit has the root node with nodeId "cafebabe-cafe-babe-cafe-babecafebabe". It is okay, if you are using local Derby-based repository, because each workspace has own database, but in case of remote database solution potentially you can run into issue with names conflict. However, it still be okay in case of remote database. I don't know why, maybe, all is okay, because data-safe methods are used (see more detailed explanation below).
This is the second minor issue.

3. When the migration tool copies data from a source repository to a target one, it executes deep copying of nodes with rewriting of data, if conflicts of node IDs occur. Actually if the target repository already exists, the data will not be removed, but nodes with the same IDs will be rewritten with data from the source repository, including collections of child nodes IDs. And, as I saw from the sourcecode, seems that method of setting of collection of child nodes IDs is called by migration tool only. Maybe, because method for set of collection of child nodes IDs never is never called from other Jacrabbit code (methods "add" and "remove" are used instead) Oracle-based repository works fine.
This is the third minor issue.

What we will get, if we mix these three insignificant issues:
1) the installation tool deploys a repository and creates equal configuration for workspaces: default and security
2) RepositoryCopier creates root node and copies the tree of nodes from workspace "default" of the source repository.
3) RepositoryCopier copies the tree of nodes from workspace "security" and rewrites root node, including rewriting of collection of child nodes IDs, because root node is stored at the same table and has the same nodeID.

Actually, seems that behavior of Jackrabbit in each of situation, described above, is correct and fair, but we have a problem, when they all mix together.

The workaround is quite simple:
1) copy the configuration structure of your repository. (repository.xml, workspaces with their configuration files, but without data)
2) reconfigure repository.xml to point to a database
3) reconfigure file workspace.xml of each workspace separately.
4) check that parameter schemaObjectPrefix is unique for each PersistenceManager (versioning configuration file repository.xml, configuration of each workspace file workspace.xml inside the home folder of each workspace in folder "workspaces").

P.S. Sorry for bad English.
                
> jackrabbit-standalone-server migration option does not work
> -----------------------------------------------------------
>
>                 Key: JCR-2751
>                 URL: https://issues.apache.org/jira/browse/JCR-2751
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-standalone
>    Affects Versions: 2.1.1
>         Environment: Windows running cygwin
>            Reporter: Srinivas Vishnubhotla
>
> I have an original flatfile based repository in a directory called "repo_ff" and its repository.xml definitions are in PropertiesRepoFF.xml. I want to migrate this repository (repo_ff) to another derby DB based repository called "repo". The repository.xml definitions for the new (DerbyDB) based repository are stored in PropertiesRepo.xml.
> When I run the command for migration:
> $ java -jar ./jackrabbit-standalone-2.1.1.jar --backup --repo repo_ff --conf PropertiesRepoFF.xml --backup-repo repo --backup-conf PropertiesRepo.xml
> Welcome to Apache Jackrabbit!
> -------------------------------
> Using repository directory repo_ff
> Writing log messages to repo_ff\log
> Creating a repository copy in repo
> The repository has been successfully copied.
> As can be seen, it says repository has been successfully copied, but when I connect to the new derbyDB based repository (repo), there is nothing in there. (No nodes ... nothing, not even the /default root node).
> =====================================================================
> Contents of PropertiesRepo.xml:
> ==========================
> <?xml version="1.0"?>
> 	<!--
> 		Licensed to the Apache Software Foundation (ASF) under one or more
> 		contributor license agreements. See the NOTICE file distributed with
> 		this work for additional information regarding copyright ownership.
> 		The ASF licenses this file to You under the Apache License, Version
> 		2.0 (the "License"); you may not use this file except in compliance
> 		with the License. You may obtain a copy of the License at
> 		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
> 		applicable law or agreed to in writing, software distributed under the
> 		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
> 		CONDITIONS OF ANY KIND, either express or implied. See the License for
> 		the specific language governing permissions and limitations under the
> 		License.
> 	-->
> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.5//EN"
>                             "http://jackrabbit.apache.org/dtd/repository-1.5.dtd">
> 	<!--
> 		Example Repository Configuration File Used by -
> 		org.apache.jackrabbit.core.config.RepositoryConfigTest.java -
> 	-->
> <Repository>
> 	<!--
> 		virtual file system where the repository stores global state (e.g.
> 		registered namespaces, custom node types, etc.)
> 	-->
> 	<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 		<param name="path" value="${rep.home}/repository" />
> 	</FileSystem>
> 	<!--
>         security configuration
>     -->
> 	<Security appName="Jackrabbit">
> 		<!--
> 			security manager: class: FQN of class implementing the
> 			JackrabbitSecurityManager interface
> 		-->
> 		<SecurityManager
> 			class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager"
> 			workspaceName="security">
> 		</SecurityManager>
> 		<!--
> 			access manager: class: FQN of class implementing the AccessManager
> 			interface
> 		-->
> 		<AccessManager
> 			class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager">
> 			<!-- <param name="config" value="${rep.home}/access.xml"/> -->
> 		</AccessManager>
> 		<LoginModule
> 			class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule">
> 			<!--
> 				anonymous user name ('anonymous' is the default value)
> 			-->
> 			<param name="anonymousId" value="anonymous" />
> 			<!--
> 				administrator user id (default value if param is missing is 'admin')
> 			-->
> 			<param name="adminId" value="admin" />
> 		</LoginModule>
> 	</Security>
> 	<!--
> 		location of workspaces root directory and name of default workspace
> 	-->
> 	<Workspaces rootPath="${rep.home}/workspaces"
> 		defaultWorkspace="default" />
> 	<!--
> 		workspace configuration template: used to create the initial workspace
> 		if there's no workspace yet
> 	-->
> 	<Workspace name="${wsp.name}">
> 		<!--
> 			virtual file system of the workspace: class: FQN of class
> 			implementing the FileSystem interface
> 		-->
> 		<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 			<param name="path" value="${wsp.home}" />
> 		</FileSystem>
> 		<!--
> 			persistence manager of the workspace: class: FQN of class
> 			implementing the PersistenceManager interface
> 		-->
> 		<!-- PersistenceManager
> 			class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager" / -->
> 			
> 		        <PersistenceManager
>                  	class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
>                     <param name="url" value="jdbc:derby:${rep.home}/repository/db;create=true" />
>                 </PersistenceManager>
> 		
> 		<!--
> 			Search index and the file system it uses. class: FQN of class
> 			implementing the QueryHandler interface
> 		-->
> 		<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
> 			<param name="path" value="${wsp.home}/index" />
> 			<param name="textFilterClasses"
> 				value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" />
> 			<param name="extractorPoolSize" value="2" />
> 			<param name="supportHighlighting" value="true" />
> 		</SearchIndex>
> 	</Workspace>
> 	<!--
>         Configures the versioning
>     -->
> 	<Versioning rootPath="${rep.home}/version">
> 		<!--
> 			Configures the filesystem to use for versioning for the respective
> 			persistence manager
> 		-->
> 		<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 			<param name="path" value="${rep.home}/version" />
> 		</FileSystem>
> 		<!--
> 			Configures the persistence manager to be used for persisting version
> 			state. Please note that the current versioning implementation is
> 			based on a 'normal' persistence manager, but this could change in
> 			future implementations.
> 		-->
> 		<PersistenceManager
> 			class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
> 			<param name="url" value="jdbc:derby:${rep.home}/version/db;create=true" />
> 			<param name="schemaObjectPrefix" value="version_" />
> 		</PersistenceManager>
> 	</Versioning>
> 	<!--
> 		Search index for content that is shared repository wide (/jcr:system
> 		tree, contains mainly versions)
> 	-->
> 	<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
> 		<param name="path" value="${rep.home}/repository/index" />
> 		<param name="textFilterClasses"
> 			value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" />
> 		<param name="extractorPoolSize" value="2" />
> 		<param name="supportHighlighting" value="true" />
> 	</SearchIndex>
> </Repository>
> Contents of PropertiesRepoFF.xml:
> ===========================
> <?xml version="1.0"?>
> 	<!--
> 		Licensed to the Apache Software Foundation (ASF) under one or more
> 		contributor license agreements. See the NOTICE file distributed with
> 		this work for additional information regarding copyright ownership.
> 		The ASF licenses this file to You under the Apache License, Version
> 		2.0 (the "License"); you may not use this file except in compliance
> 		with the License. You may obtain a copy of the License at
> 		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
> 		applicable law or agreed to in writing, software distributed under the
> 		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
> 		CONDITIONS OF ANY KIND, either express or implied. See the License for
> 		the specific language governing permissions and limitations under the
> 		License.
> 	-->
> <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.5//EN"
>                             "http://jackrabbit.apache.org/dtd/repository-1.5.dtd">
> 	<!--
> 		Example Repository Configuration File Used by -
> 		org.apache.jackrabbit.core.config.RepositoryConfigTest.java -
> 	-->
> <Repository>
> 	<!--
> 		virtual file system where the repository stores global state (e.g.
> 		registered namespaces, custom node types, etc.)
> 	-->
> 	<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 		<param name="path" value="${rep.home}/repository" />
> 	</FileSystem>
> 	<!--
>         security configuration
>     -->
> 	<Security appName="Jackrabbit">
> 		<!--
> 			security manager: class: FQN of class implementing the
> 			JackrabbitSecurityManager interface
> 		-->
> 		<SecurityManager
> 			class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager"
> 			workspaceName="security">
> 		</SecurityManager>
> 		<!--
> 			access manager: class: FQN of class implementing the AccessManager
> 			interface
> 		-->
> 		<AccessManager
> 			class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager">
> 			<!-- <param name="config" value="${rep.home}/access.xml"/> -->
> 		</AccessManager>
> 		<LoginModule
> 			class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule">
> 			<!--
> 				anonymous user name ('anonymous' is the default value)
> 			-->
> 			<param name="anonymousId" value="anonymous" />
> 			<!--
> 				administrator user id (default value if param is missing is 'admin')
> 			-->
> 			<param name="adminId" value="admin" />
> 		</LoginModule>
> 	</Security>
> 	<!--
> 		location of workspaces root directory and name of default workspace
> 	-->
> 	<Workspaces rootPath="${rep.home}/workspaces"
> 		defaultWorkspace="default" />
> 	<!--
> 		workspace configuration template: used to create the initial workspace
> 		if there's no workspace yet
> 	-->
> 	<Workspace name="${wsp.name}">
> 		<!--
> 			virtual file system of the workspace: class: FQN of class
> 			implementing the FileSystem interface
> 		-->
> 		<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 			<param name="path" value="${wsp.home}" />
> 		</FileSystem>
> 		<!--
> 			persistence manager of the workspace: class: FQN of class
> 			implementing the PersistenceManager interface
> 		-->
> 		<PersistenceManager
> 			class="org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager" />
> 			
> 		        <!-- PersistenceManager
>                  	class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
>                     <param name="url" value="jdbc:derby:${rep.home}/repository/db;create=true" />
>                     <param name="user" value="user"/>
>        				<param name="password" value="toCharArray"/>
>                 </PersistenceManager -->
> 		
> 		<!--
> 			Search index and the file system it uses. class: FQN of class
> 			implementing the QueryHandler interface
> 		-->
> 		<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
> 			<param name="path" value="${wsp.home}/index" />
> 			<param name="textFilterClasses"
> 				value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" />
> 			<param name="extractorPoolSize" value="2" />
> 			<param name="supportHighlighting" value="true" />
> 		</SearchIndex>
> 	</Workspace>
> 	<!--
>         Configures the versioning
>     -->
> 	<Versioning rootPath="${rep.home}/version">
> 		<!--
> 			Configures the filesystem to use for versioning for the respective
> 			persistence manager
> 		-->
> 		<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
> 			<param name="path" value="${rep.home}/version" />
> 		</FileSystem>
> 		<!--
> 			Configures the persistence manager to be used for persisting version
> 			state. Please note that the current versioning implementation is
> 			based on a 'normal' persistence manager, but this could change in
> 			future implementations.
> 		-->
> 		<PersistenceManager
> 			class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
> 			<param name="url" value="jdbc:derby:${rep.home}/version/db;create=true" />
> 			<param name="schemaObjectPrefix" value="version_" />
> 		</PersistenceManager>
> 	</Versioning>
> 	<!--
> 		Search index for content that is shared repository wide (/jcr:system
> 		tree, contains mainly versions)
> 	-->
> 	<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
> 		<param name="path" value="${rep.home}/repository/index" />
> 		<param name="textFilterClasses"
> 			value="org.apache.jackrabbit.extractor.PlainTextExtractor,org.apache.jackrabbit.extractor.HTMLTextExtractor,org.apache.jackrabbit.extractor.XMLTextExtractor" />
> 		<param name="extractorPoolSize" value="2" />
> 		<param name="supportHighlighting" value="true" />
> 	</SearchIndex>
> </Repository>

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira