From 0b2bd8a437e2ed5b873d9be4987cf26bb582195d Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@71dcc7fd-b1f2-4e5d-bb8e-274146e81173> Date: Tue, 23 May 2023 19:47:52 +0000 Subject: [PATCH] scrubber; git-svn-id: svn://home0/checkDataIntegrity@3060 71dcc7fd-b1f2-4e5d-bb8e-274146e81173 --- bin/checkDataIntegrity/Main.class | Bin 5940 -> 6396 bytes checkDataIntegrity.jar | Bin 11340 -> 11588 bytes src/checkDataIntegrity/Main.java | 28 +++++++++++++++++----------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/bin/checkDataIntegrity/Main.class b/bin/checkDataIntegrity/Main.class index ef1d21e34c696aef35df4f7e0738e52574f675cc..465e8fbb1cd307d25389aca079005eac6e645eea 100644 GIT binary patch literal 6396 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 delta 2985 zcmZuz3t$x06+L%{lidO%e6{AE!Wpj6#f8aTP`ptckv~gb6~ij47K$kUE0t zo~w1gf(lfru)~yURMcX!2w0k&6{u5jHR{D?OGU%fA%}Xyp%Bwm%;4#eAL>gc!}0Xe zNG!Y{5{*VuJWplSd&0)p9fDN|-|^5@(!6b`{s6MeMa+ zS2jz+Jc4(9@aAA$G#Kx$yFQ(a#JgQ+!*vqo3y-bD+KvUH$`+tSB4Ha}vl!P)SVAZ; zed3Ws-MUCLT-VA!DHTicQG#tlFnS|lkvJ(AiAu#QUa{3q=tP%<<%AN`uP+^m)}_+P za4=>}$&HE?SScFp^^O}WVN*zp zxHP%oW_DPbNZe@d%Pq#fY!pvO<)c4Iu*6ad8gZ+!tTPp~BBSCnxJ{guD#|}caQKat zNI7u_r{oVOlZhnT7vl3OHsek)!@1=S-Qs?^h4zS-eW&IE!dF z-ks*PU_i7P1BX={!FR-+u8Gc895XULE)KeCLd`g76!J8ou(GQC5&{;jSsxCin-Gl?n@3$Rqf)W zS|B$mIE^1k_@Owaj%s@WKjwNE25WisD_72~YIEYJjC0-JZdT)uMN+X~I@F`!=lG?B zUkqc`#L=8&GPse!_ba?8%G}!Y-|zzJ{+3`mc$wd6#GLpY!L9oPw}irG_6Do0_`QlV zctynA>Sd0R6K0z@>nN2yd^~|yyP>ii&Q*ozT2e3im-_8mQGy~&Mlqk~qc9H|IxretC`E|R zi5SLlxH4>l9|Glg0OL9Me7uHsQm}v~VIj4kgO)LeT^xNCWMg-67w+a>0gv5-E#MQI znsF~OTR6LUjLrM-1tv`gN%$hR@&(p~cRBo4PA!CgVH>{0Fo`iS?q|u#2?Y33_%cuM z00;H6=b+X05v%PZRu8h(SJ-McWX}K|gG<5=39bCvB-AxZ;J4X)dnNGO2~MK-0^EE^ z^}5~XVR;+tnu!ld=8d?maDu1QEX)G1j(KC~GGi{&F=MzuiRYZe)e*OHH6v_y4qx5J z9WqVT!2vvqubY9GPlHa@6c=5G16= z4(aj{WGcF9b2!RC(d0oa@Pr1kb!BoECr;oQ#@LpVZ7?iP zcQeDp_F}gyVHh|~1F^YyTqeOj#^`L_{r=>C%kyjQEMCsy4=norI@CY=zP$D`6w~-8 z26*2hlt-o9uBH}7G5E71L?OIkwml3@t4XRPa|Ha6=HNYHN=;z;RHBNX0BW$1FaG6B ztu%j&-HLi9Q3I1@lY8`*IS^Dsa+;4L0jn4?RXR?o7_ za+;5Sv!o(|7x5qbmrsE-Q|o^$c{#~GoW}(&WD}xznK2X2#AkD}lrG}{1w zXn9R88O$>2lwnpex7wIytZ0+)jQI|-?6hPYMDL)9$k}in_I8tVE{oB+-4`GavTuM1 zq+S{J|3x(@`$mg|R|jwnq#^qiLwO82@Df@1Pyt6AFgS^7*x1cVPI8fIN^bH}z9|(@ XF_oB-Mq_9km9f2X@%d>yRX}?Wda|1W diff --git a/checkDataIntegrity.jar b/checkDataIntegrity.jar index 6bda05ededf44aee209363016417e959ecd4dd0a..d376ceca42b32eaed9d93dee1c50d4e647476aa8 100644 GIT binary patch delta 3432 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 T8LR*Q3z}M5lSWm7?9cfhtxBG1 delta 3182 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 "); + if (args.length < 4) { + System.err.println("Usage: checkDataIntegrity.java "); return; } final String path0 = args[0]; final String path1 = args[1]; + final int skip = Integer.parseInt(args[2]); + final int limit = Integer.parseInt(args[3]); System.out.println("Path0: " + path0); System.out.println("Path1: " + path1); + System.out.println("Skip: " + skip); + System.out.println("Limit: " + limit); final long start = System.currentTimeMillis(); final AtomicLong count = new AtomicLong(); @@ -31,9 +38,11 @@ public class Main { walk .parallel() .filter(Files::isRegularFile) - .forEach(p0 -> { + .skip(skip) + .limit(limit) + .forEachOrdered(p0 -> { long cnt = count.incrementAndGet(); - if (cnt % 10000 == 0) { + if (cnt % 1000 == 0) { System.out.println(cnt); } @@ -42,7 +51,7 @@ public class Main { final byte[] buf0 = bufs0.get(); final byte[] buf1 = bufs1.get(); - try (InputStream inputStream0 = Files.newInputStream(p0); InputStream inputStream1 = Files.newInputStream(p1);) { + try (InputStream inputStream0 = new BufferedInputStream(new FileInputStream(p0.toFile()), 65536); InputStream inputStream1 = new BufferedInputStream(new FileInputStream(p1.toFile()), 65536)) { int len0, len1; do { len0 = inputStream0.read(buf0); @@ -52,10 +61,7 @@ public class Main { countErr.incrementAndGet(); break; } - if (len0 == -1) { - break; - } - if (!Arrays.equals(buf0, 0, len0, buf1, 0, len1)) { + if (len0 > -1 && !Arrays.equals(buf0, 0, len0, buf1, 0, len1)) { System.out.println(rel + ": Data mismatch"); countErr.incrementAndGet(); break; @@ -63,7 +69,7 @@ public class Main { } while (len0 > -1); } - catch (NoSuchFileException nsfExc) { + catch (NoSuchFileException | FileNotFoundException nsfExc) { // System.out.println(rel + ": NoSuchFileException"); } catch (final Exception ex) { @@ -74,7 +80,7 @@ public class Main { } System.out.println("Took " + (System.currentTimeMillis() - start) + "ms"); - System.out.println(count.get() + " files"); + System.out.println(count.get() + " files checked"); System.out.println(countErr.get() + " errors"); System.exit(countErr.get() > 0 ? 1 : 0);