• 下载到99.5卡顿问题定位结论


    近日升级包下载过程中发现一例问题:升级包下载到99.5卡顿,然后报无法获取网络资源。本文对该问题的做详细定位和总结。

    问题原因:下载过程中断网,由于批量写入,因此下载浮标位置更新了,而实际上有一段数据未写入。此时下载完毕了,而系统计算只有99.5左右(有一段数据丢失)。此时服务器上已经无数据可下,而系统由于见到到下载进度未到100%,还在持续刷新,刷新超过2分钟发现进度仍没有增加,因此定为网络资源的问题。

    下载过程中如果出现退出下载,重新进入,系统会根据前报的进度进行继续下载,因此造成局部数据重叠,这种情况下,虽然升级包最终可以下载完毕,但是由于数据遭到破坏,因此校验不会通过。会报MD5校验失败,升级无法进一步进行。

    解决方法:将写书数据库和同步下载浮标位置放在一起,避免造成数据更新不同步,断网引起的数据丢失。

    解决效果:测试无误

     

    问题代码段:

        修改前:===============================================================================

            while (ThreadLock.getSatus() && startPos < endPos

                            && (offset) >0) {

                   

                        batchBufPos += offset;

    startPos += offset;

                        //批量写磁盘写数据库(解决实时写拖慢下载速度问题)

                        if ((batchBufPos + readSize ) >= writeBatchBufSize) {

                            Log.i(TAG,"===========================write disk and save db in...");

                            try {

                                saveFile.write(buffer, 0, batchBufPos);//更新磁盘数据

                                downloader.update(this.threadId, startPos);//更新map数据

                                downloader.saveLogFile();//更新数据库数据:position、downpath、filename、threadid

                                downloader.append(batchBufPos);//累加已下载数据

                                Log.i(TAG,"=========================== downloader.getDownloadSize() = " + downloader.getDownloadSize());

                         

                            } catch (Exception e) {

                                e.printStackTrace();

                            }

                   

                            //清空批量buffer

                            batchBufPos = 0;

                        }

    修改后

                while (ThreadLock.getSatus() && startPos < endPos

                            && (offset) >0) {

                   

                        batchBufPos += offset;

                        //批量写磁盘写数据库(解决实时写拖慢下载速度问题)

                        if ((batchBufPos + readSize ) >= writeBatchBufSize) {

                            Log.i(TAG,"===========================write disk and save db in...");

                            try {

                                saveFile.write(buffer, 0, batchBufPos);//更新磁盘数据

                                downloader.update(this.threadId, startPos);//更新map数据

                                downloader.saveLogFile();//更新数据库数据:position、downpath、filename、threadid

                                downloader.append(batchBufPos);//累加已下载数据

                                Log.i(TAG,"=========================== downloader.getDownloadSize() = " + downloader.getDownloadSize());

                                startPos += batchBufPos; //挪到写数据的阶段同步下载浮标

                            } catch (Exception e) {

                                e.printStackTrace();

                            }

                   

                            //清空批量buffer

                            batchBufPos = 0;

                        }

  • 相关阅读:
    WPF XAML之bing使用StringFormat
    C#程序以管理员权限运行
    注册表REG文件编写大全
    linux 的基本操作(编写shell 脚本)
    linux的基本操作(正则表达式)
    linux的基本操作(shell 脚本的基础知识)
    linux的基本操作(RPM包或者安装源码包)
    linux的基本操作(文件压缩与打包)
    linux的基本操作(文本编辑工具vim)
    linux的基本操作(磁盘管理)
  • 原文地址:https://www.cnblogs.com/huamaoenjoy/p/5123474.html
Copyright © 2020-2023  润新知