Sonar Configuration MySQL
L'installation de Sonar étudiée est basée sur MySql
.
Sommaire
Votre avis
Current user rating: 89/100 (19 votes)
|
|
Création de la base
Un nouveau schéma est créé.
mysql> CREATE DATABASE sonar CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
Création du compte MySQL
Un compte est mis en place pour ne pas interférer avec les autres installations.
mysql> CREATE USER 'sonar'@'localhost' IDENTIFIED BY 'SONAR_PASSWORD';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Où SONAR_PASSWORD
est remplacé par le mot de passe souhaité.
Les privilèges mis en place sont assez forts, mais seront réduits en fin d'installation à l'aide des requêtes suivantes.
mysql> REVOKE ALL ON sonar.* FROM 'sonar'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sonar.* TO 'sonar'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
Configuration de la base de données
La dernière étape consiste à référencer ce compte au niveau de Sonar. Pour cela, il faut éditer le fichier <UNZIP_DIRECTORY>/conf/sonar.properties et éditer la section #----- MySQL 5.x/6.x
ainsi:
#----- Embedded database Derby
# Note : it does accept connections from remote hosts, so the
# sonar server and the maven plugin must be executed on the same host.
# Comment the 3 following lines to deactivate the default embedded database
#sonar.jdbc.url: jdbc:derby://localhost:1527/sonar;create=true
#sonar.jdbc.driverClassName: org.apache.derby.jdbc.ClientDriver
#sonar.jdbc.validationQuery: values(1)
# directory containing Derby database files. By default it's the /data directory in the sonar installation.
#sonar.embeddedDatabase.dataDir:
# derby embedded database server listening port, defaults to 1527
#sonar.derby.drda.portNumber: 1527
# uncomment to accept connections from remote hosts. Ba default it only accepts localhost connections.
#sonar.derby.drda.host: 0.0.0.0
#----- MySQL 5.x/6.x
# Comment the embedded database and uncomment the following lines to use MySQL
sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
sonar.jdbc.validationQuery: select 1
Cela permet d'activer l'utilisation de MySql au lieu de la base Derby embarquée. Il faut ensuite renseigné le compte et le mot de passe utilisé pour se connecter à cette base de données, en reprenant la définition du compte déclaré dans la base
#----- Global database settings
sonar.jdbc.username: sonar
sonar.jdbc.password: SONAR_PASSWORD
sonar.jdbc.maxActive: 10
sonar.jdbc.maxIdle: 5
sonar.jdbc.minIdle: 2
sonar.jdbc.maxWait: 5000
sonar.jdbc.minEvictableIdleTimeMillis: 600000
sonar.jdbc.timeBetweenEvictionRunsMillis: 30000
Mise à jour
Lors de l'installation de la version 4.4, le fichier de paramétrage a été revu. Le format du fichier est légèrement différent et quelques paramètres sont devenus obsolètes. Il suffit de désactiver la base par défaut au profit de MySql, et de renseigner les identifiants de connexion.
# Permissions to create tables, indices and triggers must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username=sonar
sonar.jdbc.password=SONAR_PASSWORD
#----- Embedded database H2
# Note: it does not accept connections from remote hosts, so the
# SonarQube server and the maven plugin must be executed on the same host.
# Comment the following line to deactivate the default embedded database.
#sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar
# directory containing H2 database files. By default it's the /data directory in the SonarQube installation.
#sonar.embeddedDatabase.dataDir=
# H2 embedded database server listening port, defaults to 9092
#sonar.embeddedDatabase.port=9092
#----- MySQL 5.x
# Comment the embedded database and uncomment the following line to use MySQL
#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
Droits accès
Lors de l'ouverture de la connexion à Mysql sur l'ensemble d'un réseau, le paramètre bind-address
a été modifié avec la valeur 0.0.0.0
. Or au redémarrage de Sonar
, l'application est devenue inaccessible. La log Tomcat
, fichier catalina.out
, dans le cadre de cet article fichier /var/log/tomcat6/catalina.out
, indique les messages suivants:
8 janv. 2014 23:31:45 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc GRAVE: The web application [/sonar] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 8 janv. 2014 23:31:45 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads GRAVE: The web application [/sonar] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. 8 janv. 2014 23:31:45 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks GRAVE: The web application [/sonar] created a ThreadLocal with key of type [org.jruby.RubyEncoding$2] (value [org.jruby.RubyEncoding$2@1d117b06]) and a value of type [org.jruby.RubyEncoding.UTF8Coder] (value [org.jruby.RubyEncoding$UTF8Coder@66a3d5d2]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak. 8 janv. 2014 23:31:45 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks GRAVE: The web application [/sonar] created a ThreadLocal with key of type [org.joni.StackMachine$1] (value [org.joni.StackMachine$1@7b358035]) and a value of type [java.lang.ref.WeakReference] (value [java.lang.ref.WeakReference@757456c4]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak. 8 janv. 2014 23:31:45 org.apache.catalina.startup.HostConfig undeployApps ATTENTION: Error while removing context [/sonar] java.lang.NoClassDefFoundError: org/picocontainer/DefaultPicoContainer$1 at java.lang.Class.getDeclaringClass(Native Method) at java.lang.Class.getEnclosingClass(Class.java:1085) at java.lang.Class.getCanonicalName(Class.java:1169) at org.apache.catalina.loader.WebappClassLoader.getPrettyClassName(WebappClassLoader.java:2518) at org.apache.catalina.loader.WebappClassLoader.checkThreadLocalMapForLeaks(WebappClassLoader.java:2455) at org.apache.catalina.loader.WebappClassLoader.clearReferencesThreadLocals(WebappClassLoader.java:2380) at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1921) at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1833) at org.apache.catalina.loader.WebappLoader.stop(WebappLoader.java:740) at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4920) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:936) at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1359) at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1330) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:326) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1098) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1110) at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:468) at org.apache.catalina.core.StandardService.stop(StandardService.java:604) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:788) at org.apache.catalina.startup.Catalina.stop(Catalina.java:662) at org.apache.catalina.startup.Catalina$CatalinaShutdownHook.run(Catalina.java:706) Caused by: java.lang.ClassNotFoundException: org.picocontainer.DefaultPicoContainer$1 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) ... 22 more
Il faut bien avouer que cela n'est pas très parlant. Il faut donc regarder du côté de la log de Sonar
, qui est configuré au niveau du fichier lors de la préparation du package, soit dans le fichier /var/opt/sonar/conf/wrapper.conf
, où l'on trouve ceci:
# Log Level for console output. (See docs for log levels)
wrapper.console.loglevel=INFO
# Log file to use for wrapper output logging.
wrapper.logfile=../../logs/sonar.log
# Format of output for the log file. (See docs for formats)
wrapper.logfile.format=LPTM
# Log Level for log file output. (See docs for log levels)
wrapper.logfile.loglevel=INFO
# Maximum size that the log file will be allowed to grow to before
# the log is rolled. Size is specified in bytes. The default value
# of 0, disables log rolling. May abbreviate with the 'k' (kb) or
# 'm' (mb) suffix. For example: 10m = 10 megabytes.
#wrapper.logfile.maxsize=0
# Maximum number of rolled log files which will be allowed before old
# files are deleted. The default value of 0 implies no limit.
#wrapper.logfile.maxfiles=0
# Log Level for sys/event log output. (See docs for log levels)
wrapper.syslog.loglevel=NONE
Donc la log se trouve à l'emplacement /var/opt/sonar/logs/sonar.log
, avec les messages d'erreurs suivants:
2014.01.08 23:58:16 ERROR jruby.rack unable to create shared application instance org.jruby.rack.RackInitializationException: no connection available from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection.rb:61:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:31:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection_methods.rb:6:in `jdbc_connection' from org/jruby/RubyKernel.java:2080:in `send' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:223:in `new_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:245:in `checkout_new_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:188:in `checkout' from org/jruby/RubyKernel.java:1410:in `loop' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:184:in `checkout' from classpath:/META-INF/jruby.home/lib/ruby/1.8/monitor.rb:191:in `mon_synchronize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:183:in `checkout' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:98:in `connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:326:in `retrieve_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:123:in `retrieve_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:115:in `connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:440:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:401:in `up' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:383:in `migrate' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:63:in `upgrade_and_start' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:75:in `automatic_setup' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:149:in `(root)' from org/jruby/RubyKernel.java:1058:in `load' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:23:in `load_environment' from /var/cache/tomcat6/Catalina/localhost/sonar/loader/jruby/rack/rails_booter.rb:65:in `load_environment' from <script>:1:in `(root)' at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:231) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:58) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:33) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:48) [jruby-rack-1.1.10.jar:na] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardService.start(StandardService.java:525) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:595) [catalina-6.0.37.jar:6.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) [bootstrap.jar:6.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) [bootstrap.jar:6.0.37] org.jruby.exceptions.RaiseException: (ConnectionNotEstablished) no connection available at arjdbc.jdbc.RubyJdbcConnection.set_native_database_types(arjdbc/jdbc/RubyJdbcConnection.java:517) ~[na:na] at JdbcConnection.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection.rb:61) ~[na:na] at JdbcAdapter.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:31) ~[na:na] at (Anonymous).jdbc_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection_methods.rb:6) ~[na:na] at org.jruby.RubyKernel.send(org/jruby/RubyKernel.java:2080) ~[jruby-complete-1.6.7.2.jar:na] at ConnectionPool.new_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:223) ~[na:na] at ConnectionPool.checkout_new_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:245) ~[na:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:188) ~[na:na] at org.jruby.RubyKernel.loop(org/jruby/RubyKernel.java:1410) ~[jruby-complete-1.6.7.2.jar:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:184) ~[na:na] at MonitorMixin.mon_synchronize(classpath:/META-INF/jruby.home/lib/ruby/1.8/monitor.rb:191) ~[na:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:183) ~[na:na] at ConnectionPool.connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:98) ~[na:na] at ConnectionHandler.retrieve_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:326) ~[na:na] at (Anonymous).retrieve_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:123) ~[na:na] at (Anonymous).connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:115) ~[na:na] at Migrator.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:440) ~[na:na] at (Anonymous).up(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:401) ~[na:na] at (Anonymous).migrate(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:383) ~[na:na] at (Anonymous).upgrade_and_start(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:63) ~[na:na] at (Anonymous).automatic_setup(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:75) ~[na:na] at (Anonymous).(root)(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:149) ~[na:na] at org.jruby.RubyKernel.load(org/jruby/RubyKernel.java:1058) ~[jruby-complete-1.6.7.2.jar:na] at Rails2Environment.load_environment(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:23) ~[na:na] at (Anonymous).load_environment(/var/cache/tomcat6/Catalina/localhost/sonar/loader/jruby/rack/rails_booter.rb:65) ~[na:na] at (Anonymous).(root)(<script>:1) ~[na:na] 2014.01.08 23:58:16 ERROR jruby.rack Error: application initialization failed org.jruby.rack.RackInitializationException: no connection available from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection.rb:61:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:31:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection_methods.rb:6:in `jdbc_connection' from org/jruby/RubyKernel.java:2080:in `send' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:223:in `new_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:245:in `checkout_new_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:188:in `checkout' from org/jruby/RubyKernel.java:1410:in `loop' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:184:in `checkout' from classpath:/META-INF/jruby.home/lib/ruby/1.8/monitor.rb:191:in `mon_synchronize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:183:in `checkout' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:98:in `connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:326:in `retrieve_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:123:in `retrieve_connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:115:in `connection' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:440:in `initialize' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:401:in `up' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:383:in `migrate' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:63:in `upgrade_and_start' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:75:in `automatic_setup' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:149:in `(root)' from org/jruby/RubyKernel.java:1058:in `load' from /tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:23:in `load_environment' from /var/cache/tomcat6/Catalina/localhost/sonar/loader/jruby/rack/rails_booter.rb:65:in `load_environment' from <script>:1:in `(root)' at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:231) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:58) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:33) ~[jruby-rack-1.1.10.jar:na] at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:48) ~[jruby-rack-1.1.10.jar:na] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardService.start(StandardService.java:525) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:595) [catalina-6.0.37.jar:6.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) [bootstrap.jar:6.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) [bootstrap.jar:6.0.37] org.jruby.exceptions.RaiseException: (ConnectionNotEstablished) no connection available at arjdbc.jdbc.RubyJdbcConnection.set_native_database_types(arjdbc/jdbc/RubyJdbcConnection.java:517) ~[na:na] at JdbcConnection.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection.rb:61) ~[na:na] at JdbcAdapter.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/adapter.rb:31) ~[na:na] at (Anonymous).jdbc_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.1.3/lib/arjdbc/jdbc/connection_methods.rb:6) ~[na:na] at org.jruby.RubyKernel.send(org/jruby/RubyKernel.java:2080) ~[jruby-complete-1.6.7.2.jar:na] at ConnectionPool.new_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:223) ~[na:na] at ConnectionPool.checkout_new_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:245) ~[na:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:188) ~[na:na] at org.jruby.RubyKernel.loop(org/jruby/RubyKernel.java:1410) ~[jruby-complete-1.6.7.2.jar:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:184) ~[na:na] at MonitorMixin.mon_synchronize(classpath:/META-INF/jruby.home/lib/ruby/1.8/monitor.rb:191) ~[na:na] at ConnectionPool.checkout(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:183) ~[na:na] at ConnectionPool.connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:98) ~[na:na] at ConnectionHandler.retrieve_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_pool.rb:326) ~[na:na] at (Anonymous).retrieve_connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:123) ~[na:na] at (Anonymous).connection(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/connection_specification.rb:115) ~[na:na] at Migrator.initialize(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:440) ~[na:na] at (Anonymous).up(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:401) ~[na:na] at (Anonymous).migrate(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/gems/gems/activerecord-2.3.14/lib/active_record/migration.rb:383) ~[na:na] at (Anonymous).upgrade_and_start(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:63) ~[na:na] at (Anonymous).automatic_setup(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/lib/database_version.rb:75) ~[na:na] at (Anonymous).(root)(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:149) ~[na:na] at org.jruby.RubyKernel.load(org/jruby/RubyKernel.java:1058) ~[jruby-complete-1.6.7.2.jar:na] at Rails2Environment.load_environment(/tmp/tomcat6-tomcat6-tmp/0-sonar/WEB-INF/config/environment.rb:23) ~[na:na] at (Anonymous).load_environment(/var/cache/tomcat6/Catalina/localhost/sonar/loader/jruby/rack/rails_booter.rb:65) ~[na:na] at (Anonymous).(root)(<script>:1) ~[na:na]
A la lecture de la log, il semblerait qu'il y ait un problème de connexion, mais il n'est pas encore bien identifié. Pour avoir un complément d'information, il faut passer le niveau de INFO
à DeBUG
dans le fichier wrapper.conf
:
# Log Level for console output. (See docs for log levels)
# wrapper.console.loglevel=INFO
wrapper.console.loglevel=DEBUG
# Log file to use for wrapper output logging.
wrapper.logfile=../../logs/sonar.log
# Format of output for the log file. (See docs for formats)
wrapper.logfile.format=LPTM
# Log Level for log file output. (See docs for log levels)
wrapper.logfile.loglevel=INFO
# Maximum size that the log file will be allowed to grow to before
# the log is rolled. Size is specified in bytes. The default value
# of 0, disables log rolling. May abbreviate with the 'k' (kb) or
# 'm' (mb) suffix. For example: 10m = 10 megabytes.
#wrapper.logfile.maxsize=0
# Maximum number of rolled log files which will be allowed before old
# files are deleted. The default value of 0 implies no limit.
#wrapper.logfile.maxfiles=0
# Log Level for sys/event log output. (See docs for log levels)
wrapper.syslog.loglevel=NONE
La log va être alors beaucoup plus parlante, avec les messages d'erreurs suivants:
2014.01.09 00:19:36 INFO o.s.s.p.ServerImpl Sonar Server / 3.3.2 / 614afef12ae442ad50831a7bc604664378e31088 2014.01.09 00:19:36 INFO o.s.c.p.Database Create JDBC datasource for jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true 2014.01.09 00:19:36 ERROR o.s.c.p.Database Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.'). org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'sonar'@'127.0.0.1' (using password: YES)) at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) ~[commons-dbcp-1.3.jar:1.3] at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) ~[commons-dbcp-1.3.jar:1.3] at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ~[commons-dbcp-1.3.jar:1.3] at org.sonar.core.persistence.DefaultDatabase.checkConnection(DefaultDatabase.java:131) [sonar-core-3.3.2.jar:na] at org.sonar.core.persistence.DefaultDatabase.start(DefaultDatabase.java:68) [sonar-core-3.3.2.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26] at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.invokeMethod(ReflectionLifecycleStrategy.java:110) [picocontainer-2.14.1.jar:na] at org.picocontainer.lifecycle.ReflectionLifecycleStrategy.start(ReflectionLifecycleStrategy.java:89) [picocontainer-2.14.1.jar:na] at org.picocontainer.injectors.AbstractInjectionFactory$LifecycleAdapter.start(AbstractInjectionFactory.java:84) [picocontainer-2.14.1.jar:na] at org.picocontainer.behaviors.AbstractBehavior.start(AbstractBehavior.java:169) [picocontainer-2.14.1.jar:na] at org.picocontainer.behaviors.Stored$RealComponentLifecycle.start(Stored.java:132) [picocontainer-2.14.1.jar:na] at org.picocontainer.behaviors.Stored.start(Stored.java:110) [picocontainer-2.14.1.jar:na] at org.picocontainer.DefaultPicoContainer.potentiallyStartAdapter(DefaultPicoContainer.java:1009) [picocontainer-2.14.1.jar:na] at org.picocontainer.DefaultPicoContainer.startAdapters(DefaultPicoContainer.java:1002) [picocontainer-2.14.1.jar:na] at org.picocontainer.DefaultPicoContainer.start(DefaultPicoContainer.java:760) [picocontainer-2.14.1.jar:na] at org.sonar.api.platform.ComponentContainer.startComponents(ComponentContainer.java:70) [sonar-plugin-api-3.3.2.jar:na] at org.sonar.server.platform.Platform.startDatabaseConnectors(Platform.java:158) [Platform.class:na] at org.sonar.server.platform.Platform.init(Platform.java:102) [Platform.class:na] at org.sonar.server.platform.PlatformLifecycleListener.contextInitialized(PlatformLifecycleListener.java:33) [PlatformLifecycleListener.class:na] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:675) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:601) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardService.start(StandardService.java:525) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) [catalina-6.0.37.jar:6.0.37] at org.apache.catalina.startup.Catalina.start(Catalina.java:595) [catalina-6.0.37.jar:6.0.37] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_26] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_26] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_26] at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_26] at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) [bootstrap.jar:6.0.37] at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) [bootstrap.jar:6.0.37] Caused by: java.sql.SQLException: Access denied for user 'sonar'@'127.0.0.1' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:943) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4113) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1308) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) ~[mysql-connector-java-5.1.18.jar:na] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.6.0_26] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) ~[na:1.6.0_26] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) ~[na:1.6.0_26] at java.lang.reflect.Constructor.newInstance(Constructor.java:513) ~[na:1.6.0_26] at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) ~[mysql-connector-java-5.1.18.jar:na] at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) ~[mysql-connector-java-5.1.18.jar:na] at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) ~[commons-dbcp-1.3.jar:1.3] at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) ~[commons-dbcp-1.3.jar:1.3] at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) ~[commons-dbcp-1.3.jar:1.3] at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) ~[commons-dbcp-1.3.jar:1.3] ... 45 common frames omitted
Donc, la connexion est refusée par MySql avec le compte sonar
depuis l'emplacement 127.0.0.1
. Ceci s'explique par le fait que le compte a créé avec une autorisation localhost
, et le paramètre bind_adddress
de MySql à 127.0.0.1
. Or ayant été modifié, le compte avec le host 127.0.0.1
doit à présent être créé.
mysql> CREATE USER 'sonar'@'127.0.0.1' IDENTIFIED BY 'SONAR_PASSWORD';
Query OK, 0 rows affected (0.09 sec)
mysql> GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1';
Query OK, 0 rows affected (0.04 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.04 sec)
Où SONAR_PASSWORD
est remplacé par le mot de passe souhaité.
La connexion à la base MySql
sera ensuite réussie au prochain démarrage et l'application de nouveau disponible.
Les privilèges mis en place sont assez forts, mais seront réduits en fin d'installation à l'aide des requêtes suivantes.
mysql> REVOKE ALL ON sonar.* FROM 'sonar'@'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON sonar.* TO 'sonar'@'127.0.0.1';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)