From 8cbda918b810c4f923abce207eb0703dd335266c Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 14:59:28 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 178 ++++++++++++++++++++------ 1 file changed, 140 insertions(+), 38 deletions(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 9edb6bb9d..587ef2cb9 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -513,6 +513,111 @@ class ShixunsController < ApplicationController # 以前在开启挑战的时候检测实训是否更新,更新则重置,觉得应该放在TPI更好 # 中间需要一个过渡动画 # TODO: 第一次开启实训都会去判断是否是纯选择题类型,感觉做成在创建关卡的时候就判断该实训是否是纯选择题更加合适 + # def shixun_exec + # if is_shixun_opening? + # tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") + # end + # current_myshixun = @shixun.current_myshixun(current_user.id) + # + # min_challenges = @shixun.challenges.pluck(:id , :st) + # + # Rails.logger.info("11111111112#{current_myshixun.try(:id)}") + # Rails.logger.info("111111111102#{params[:reset] != 1}") + # + # # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1 + # if current_myshixun && params[:reset] != "1" + # games = current_myshixun.games + # # 如果TPM和TPI的管卡数不相等或者关卡顺序错了,说明实训被极大的改动,需要重置,实训发布前打过的实训都需要重置 + # if is_shixun_reset?(games, min_challenges, current_myshixun) + # # 这里页面弹框要收到 当前用户myshixun的identifier. + # tip_show_exception("/myshixuns/#{current_myshixun.try(:identifier)}/reset_my_game") + # end + # + # + # if current_myshixun.repo_name.nil? + # g = Gitlab.client + # repo_name = g.project(current_myshixun.gpid).try(:path_with_namespace) + # current_myshixun.update_column(:repo_name, repo_name) + # end + # + # + # # 如果存在实训,则直接进入实训 + # # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡 + # @current_task = + # if params[:challenge_id] + # game = games.where(challenge_id: params[:challenge_id]).take + # if @shixun.task_pass || game.status != 3 + # game + # else + # current_myshixun.current_task(games) + # end + # else + # current_myshixun.current_task(games) + # end + # else + # # 如果未创建关卡一定不能开启实训,否则TPI没法找到当前的关卡 + # if @shixun.challenges_count == 0 + # tip_exception("开启实战前请先创建实训关卡") + # end + # + # # 判断实训是否全为选择题 + # is_choice_type = (min_challenges.size == min_challenges.select{|challenge| challenge.last == 1}.count) + # if !is_choice_type + # commit = GitService.commits(repo_path: @repo_path).try(:first) + # uid_logger("First comit########{commit}") + # tip_exception("开启实战前请先在版本库中提交代码") if commit.blank? + # commit_id = commit["id"] + # end + # + # ActiveRecord::Base.transaction do + # begin + # cloud_bridge = edu_setting('cloud_bridge') + # myshixun_identifier = generate_identifier Myshixun, 10 + # myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier, + # modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, + # onclick_time: Time.now, commit_id: commit_id) + # uid_logger("myshixun_id is #{myshixun.id}") + # + # + # # 其它创建关卡等操作 + # challenges = @shixun.challenges + # # 之所以增加user_id是为了方便统计查询性能 + # game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] + # Game.bulk_insert(*game_attrs) do |worker| + # base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id } + # challenges.each_with_index do |challenge, index| + # status = (index == 0 ? 0 : 3) + # game_identifier = generate_identifier(Game, 12) + # worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, + # identifier: game_identifier, modify_time: challenge.modify_time)) + # end + # end + # + # # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + # unless is_choice_type + # # fork仓库 + # project_fork(myshixun, @repo_path, current_user.login) + # + # rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path ) + # uid_logger("start openGameInstance") + # uri = "#{cloud_bridge}/bridge/game/openGameInstance" + # logger.info("end openGameInstance") + # params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + # uid_logger("openGameInstance params is #{params}") + # interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" + # end + # + # @current_task = myshixun.current_task(myshixun.games) + # uid_logger("## shixun exec: myshixun id is #{myshixun.id}") + # rescue Exception => e + # uid_logger_error(e.message) + # tip_exception("实训云平台繁忙(繁忙等级:81)") + # raise ActiveRecord::Rollback + # end + # end + # end + # end + def shixun_exec if is_shixun_opening? tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") @@ -520,10 +625,6 @@ class ShixunsController < ApplicationController current_myshixun = @shixun.current_myshixun(current_user.id) min_challenges = @shixun.challenges.pluck(:id , :st) - - Rails.logger.info("11111111112#{current_myshixun.try(:id)}") - Rails.logger.info("111111111102#{params[:reset] != 1}") - # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1 if current_myshixun && params[:reset] != "1" games = current_myshixun.games @@ -540,7 +641,6 @@ class ShixunsController < ApplicationController current_myshixun.update_column(:repo_name, repo_name) end - # 如果存在实训,则直接进入实训 # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡 @current_task = @@ -569,50 +669,52 @@ class ShixunsController < ApplicationController commit_id = commit["id"] end - ActiveRecord::Base.transaction do - begin - cloud_bridge = edu_setting('cloud_bridge') - myshixun_identifier = generate_identifier Myshixun, 10 - myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier, - modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, - onclick_time: Time.now, commit_id: commit_id) - uid_logger("myshixun_id is #{myshixun.id}") - - - # 其它创建关卡等操作 - challenges = @shixun.challenges - # 之所以增加user_id是为了方便统计查询性能 - game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] - Game.bulk_insert(*game_attrs) do |worker| - base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id } - challenges.each_with_index do |challenge, index| - status = (index == 0 ? 0 : 3) - game_identifier = generate_identifier(Game, 12) - worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, - identifier: game_identifier, modify_time: challenge.modify_time)) + begin + ActiveRecord::Base.transaction do + begin + myshixun_identifier = generate_identifier Myshixun, 10 + myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, + modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, + onclick_time: Time.now, commit_id: commit_id} + myshixun = @shixun.myshixuns.create!(myshixun_params) + # 其它创建关卡等操作 + challenges = @shixun.challenges + # 之所以增加user_id是为了方便统计查询性能 + game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] + Game.bulk_insert(*game_attrs) do |worker| + base_attr = {myshixun_id: myshixun.id, user_id: myshixun.user_id} + challenges.each_with_index do |challenge, index| + status = (index == 0 ? 0 : 3) + game_identifier = generate_identifier(Game, 12) + worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, + identifier: game_identifier, modify_time: challenge.modify_time)) + end end + @current_task = myshixun.current_task(myshixun.games) + rescue Exception => e + logger.error("------ActiveRecord::RecordInvalid: #{e.message}") + raise("ActiveRecord::RecordInvalid") end - - # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + end + # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + ActiveRecord::Base.transaction do unless is_choice_type # fork仓库 + cloud_bridge = edu_setting('cloud_bridge') project_fork(myshixun, @repo_path, current_user.login) - - rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path ) + rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uid_logger("start openGameInstance") uri = "#{cloud_bridge}/bridge/game/openGameInstance" logger.info("end openGameInstance") - params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} uid_logger("openGameInstance params is #{params}") interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end - - @current_task = myshixun.current_task(myshixun.games) - uid_logger("## shixun exec: myshixun id is #{myshixun.id}") - rescue Exception => e - uid_logger_error(e.message) - tip_exception("实训云平台繁忙(繁忙等级:81)") - raise ActiveRecord::Rollback + end + rescue Exception => e + if e.message != "ActiveRecord::RecordInvalid" + logger.error("##########project_fork error #{e.message}") + @current_task.destroy! end end end From 1bfe9b6b59a6fd254b84f6cab1f0b36e244b4825 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 15:05:48 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E9=87=8D=E5=86=99=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 587ef2cb9..fbc5c18fb 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -676,13 +676,13 @@ class ShixunsController < ApplicationController myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, onclick_time: Time.now, commit_id: commit_id} - myshixun = @shixun.myshixuns.create!(myshixun_params) + @myshixun = @shixun.myshixuns.create!(myshixun_params) # 其它创建关卡等操作 challenges = @shixun.challenges # 之所以增加user_id是为了方便统计查询性能 game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] Game.bulk_insert(*game_attrs) do |worker| - base_attr = {myshixun_id: myshixun.id, user_id: myshixun.user_id} + base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id} challenges.each_with_index do |challenge, index| status = (index == 0 ? 0 : 3) game_identifier = generate_identifier(Game, 12) @@ -690,7 +690,7 @@ class ShixunsController < ApplicationController identifier: game_identifier, modify_time: challenge.modify_time)) end end - @current_task = myshixun.current_task(myshixun.games) + @current_task = @myshixun.current_task(@myshixun.games) rescue Exception => e logger.error("------ActiveRecord::RecordInvalid: #{e.message}") raise("ActiveRecord::RecordInvalid") @@ -701,12 +701,12 @@ class ShixunsController < ApplicationController unless is_choice_type # fork仓库 cloud_bridge = edu_setting('cloud_bridge') - project_fork(myshixun, @repo_path, current_user.login) + project_fork(@myshixun, @repo_path, current_user.login) rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uid_logger("start openGameInstance") uri = "#{cloud_bridge}/bridge/game/openGameInstance" logger.info("end openGameInstance") - params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} uid_logger("openGameInstance params is #{params}") interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end From 5bebbbcd2f77191784a2f9a15024ac27d32ff0b0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 15:06:56 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=B7=91=E5=87=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index fbc5c18fb..7a2db0666 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -716,6 +716,7 @@ class ShixunsController < ApplicationController logger.error("##########project_fork error #{e.message}") @current_task.destroy! end + raise ActiveRecord::Rollback end end end