This is an automated email from the ASF dual-hosted git repository. michaelo pushed a commit to branch MRESOLVER-191 in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
commit f8dda757836e272fe987fe9fc1f14ba938d0b704 Author: Michael Osipov <[email protected]> AuthorDate: Wed Aug 25 23:19:08 2021 +0200 [MRESOLVER-191] Document how to analyze lock issues This closes #15 --- .../src/site/markdown/analyzing-lock-issues.md | 108 +++++++++++++++++++++ .../src/site/resources/sql/create_lock_events.sql | 40 ++++++++ .../site/resources/sql/create_lock_workflows.sql | 38 ++++++++ .../src/site/resources/sql/schema.sql | 25 +++++ maven-resolver-named-locks/src/site/site.xml | 1 + 5 files changed, 212 insertions(+) diff --git a/maven-resolver-named-locks/src/site/markdown/analyzing-lock-issues.md b/maven-resolver-named-locks/src/site/markdown/analyzing-lock-issues.md new file mode 100644 index 0000000..83fa43f --- /dev/null +++ b/maven-resolver-named-locks/src/site/markdown/analyzing-lock-issues.md @@ -0,0 +1,108 @@ +# Analyzing Lock Issues + +<!-- +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. +--> + +This guide will show you how to collect and analyze lock issues to report with us. + +## Prerequisites + +Make sure that the following applies: + +- Bash or Bash-compatible installed +- BSD or GNU userland installed +- SQLite installed +- At least Maven 4.0.0-alpha-1 and Maven Resolver 1.7.1 installed + +Prepare your environment: + +- Set Maven home to `MAVEN_HOME` +- Select a lock factory, a name mapper, a parallel job count (processes), a build count and set + `LOCK_FACTORY`, `NAME_MAPPER`, `JOB_COUNT`, `BUILD_COUNT` +- Set your root working directory to `ROOT` +- Set your project name with `PROJECT_NAME` +- Obtain your project source into `$PROJECT_NAME-1` to `$PROJECT_NAME-$JOB_COUNT` +- Decide whether each job and build will have its own distinct local repository or a shared one + and set it to `LOCAL_REPO` +- Download [`schema.sql`](./sql/schema.sql), [`create_lock_events.sql`](./sql/create_lock_events.sql), + [`create_lock_workflows.sql`](./sql/create_lock_workflows.sql) and set `SCHEMA_FILE`, + `CREATE_LOCK_EVENTS_FILE`, `CREATE_LOCK_WORKFLOWS_FILE` to their respective locations + +## Running Builds + +Open `$JOB_COUNT` terminals and change into the `$ROOT/$PROJECT_NAME-1` to `$ROOT/$PROJECT_NAME-$JOB_COUNT` +directories. Now start each job in a build loop: +``` +$ for build in $(eval echo {1..$BUILD_COUNT}); do \ + # Only if dedicated + rm -rf $LOCAL_REPO; \ + $MAVEN_HOME/bin/mvn clean compile -T1C -B -DskipTests -Dmaven.repo.local=$LOCAL_REPO \ + -Dorg.slf4j.simpleLogger.showThreadName=true -Dorg.slf4j.simpleLogger.showDateTime=true \ + -Dorg.slf4j.simpleLogger.log.org.eclipse.aether=trace -l $LOCK_FACTORY-$NAME_MAPPER-$build.log \ + # Adjust to your needs + -Daether.connector.basic.threads=8 -Daether.metadataResolver.threads=8 \ + # If downloads take longer consider to increase + -Daether.syncContext.named.time=120 \ + -Daether.syncContext.named.factory=$LOCK_FACTORY -Daether.syncContext.named.nameMapper=$NAME_MAPPER; \ + done +``` + +Wait for all jobs to complete. + +## Analyzing Builds + +We now need to extract, transform and load the data (ETL) into a SQLite database. + +Change back to the `$ROOT` directory and collect all log files with build failures: +``` +$ BUILD_FAILURE_LIST=$(mktemp) +$ grep -l -r "BUILD FAILURE" $PROJECT_NAME-* > $BUILD_FAILURE_LIST +``` +Run extraction and transformation: +``` +$ while read log_file; do \ + grep -e Acquiring -e Releasing -e "Failed to acquire" $log_file | \ + sed -e 's# \[#;[#g' -e 's#\] #];#' -e "s#^#$log_file;#" | \ + sed 's#\[TRACE\];##'; \ + done < $BUILD_FAILURE_LIST > $LOCK_FACTORY-$NAME_MAPPER-locks.txt +``` +Load and process the data in SQLite: +``` +$ SCRIPT=$(mktemp) +$ cat > $SCRIPT <<EOT +.read $SCHEMA_FILE +.separator ; +.import $LOCK_FACTORY-$NAME_MAPPER-locks.txt lock_history +.read $CREATE_LOCK_EVENTS_FILE +.read $CREATE_LOCK_WORKFLOWS_FILE +.save $LOCK_FACTORY-$NAME_MAPPER-locks.db +EOT +$ sqlite3 -batch < $SCRIPT +$ rm -f $SCRIPT +``` + +## Uploading Data + +Compress the SQLite database as well as the log files: +``` +$ tar -caf $LOCK_FACTORY-$NAME_MAPPER-locks.db.xz $LOCK_FACTORY-$NAME_MAPPER-locks.db +$ tar -caf $LOCK_FACTORY-$NAME_MAPPER-logfiles.tar.xz -T $BUILD_FAILURE_LIST +$ rm -f $BUILD_FAILURE_LIST +``` +and upload them to the JIRA issue. diff --git a/maven-resolver-named-locks/src/site/resources/sql/create_lock_events.sql b/maven-resolver-named-locks/src/site/resources/sql/create_lock_events.sql new file mode 100644 index 0000000..1905f9f --- /dev/null +++ b/maven-resolver-named-locks/src/site/resources/sql/create_lock_events.sql @@ -0,0 +1,40 @@ +/* + * 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. + */ + +create table lock_events as +select file, timestamp, substr(thread, 2, length(thread)-2) as thread, +(case +when message like 'Acquiring%' + then 'acquire' +when message like 'Releasing%' + then 'release' +when message like 'Failed to acquire%' + then 'acquire_failed' +end) as lock_event, +(case +when message like '%write%' + then 'write' +when message like '%read%' + then 'read' +end) as lock_mode, +(substr( + substr(message, instr(message, '''') + 1), 1, + instr(substr(message, instr(message, '''') + 1), '''') - 1) +) as lock_name +from lock_history; diff --git a/maven-resolver-named-locks/src/site/resources/sql/create_lock_workflows.sql b/maven-resolver-named-locks/src/site/resources/sql/create_lock_workflows.sql new file mode 100644 index 0000000..79aef22 --- /dev/null +++ b/maven-resolver-named-locks/src/site/resources/sql/create_lock_workflows.sql @@ -0,0 +1,38 @@ +/* + * 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. + */ + +create table lock_workflows as +select lock_held, file, timestamp as start_timestamp, "timestamp:1" as end_timestamp, thread, (lock_event || ' => ' || "lock_event:1") as lock_workflow, lock_mode, lock_name +from ( + select + row_number() over ( + partition by a.file, a.timestamp, a.thread, a.lock_event, a.lock_mode, a.lock_name + order by r.timestamp asc + ) as rn, + (r.timestamp - a.timestamp) as lock_held, a.*, r.* + from lock_events a, lock_events r + where r.file = a.file + and r.thread = a.thread + and r.timestamp >= a.timestamp + and a.lock_event = 'acquire' and r.lock_event in ('release', 'acquire_failed') + and a.lock_mode = r.lock_mode + and a.lock_name = r.lock_name +) +where rn = 1 +order by timestamp; diff --git a/maven-resolver-named-locks/src/site/resources/sql/schema.sql b/maven-resolver-named-locks/src/site/resources/sql/schema.sql new file mode 100644 index 0000000..94bd92f --- /dev/null +++ b/maven-resolver-named-locks/src/site/resources/sql/schema.sql @@ -0,0 +1,25 @@ +/* + * 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. + */ + +create table "lock_history" ( + "file" text not null, + "timestamp" integer not null, + "thread" text not null, + "message" text not null +) diff --git a/maven-resolver-named-locks/src/site/site.xml b/maven-resolver-named-locks/src/site/site.xml index efed113..9dfc2e8 100644 --- a/maven-resolver-named-locks/src/site/site.xml +++ b/maven-resolver-named-locks/src/site/site.xml @@ -26,6 +26,7 @@ under the License. <body> <menu name="Overview"> <item name="Introduction" href="index.html"/> + <item name="Analyzing Lock Issues" href="analyzing-lock-issues.html"/> <item name="Javadoc" href="apidocs/index.html"/> <item name="Source Xref" href="xref/index.html"/> <!--item name="FAQ" href="faq.html"/-->
