URI:
       tsyncindex0.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tsyncindex0.c (1945B)
       ---
            1 #include "stdinc.h"
            2 #include "dat.h"
            3 #include "fns.h"
            4 
            5 static int
            6 syncarenaindex(Arena *arena, u64int a0)
            7 {
            8         int ok;
            9         u32int clump;
           10         u64int a;
           11         ClumpInfo ci;
           12         IAddr ia;
           13         AState as;
           14 
           15         if(arena->diskstats.clumps == arena->memstats.clumps)
           16                 return 0;
           17 
           18         memset(&as, 0, sizeof as);
           19         as.arena = arena;
           20         as.stats = arena->diskstats;
           21 
           22         ok = 0;
           23         a = a0 + arena->diskstats.used;
           24         for(clump=arena->diskstats.clumps; clump < arena->memstats.clumps; clump++){
           25                 if(readclumpinfo(arena, clump, &ci) < 0){
           26                         fprint(2, "%s: clump %d: cannot read clumpinfo\n",
           27                                 arena->name, clump);
           28                         ok = -1;
           29                         break;
           30                 }
           31 
           32                 ia.type = ci.type;
           33                 ia.size = ci.uncsize;
           34                 ia.addr = a;
           35                 ia.blocks = (ClumpSize + ci.size + (1 << ABlockLog) - 1) >> ABlockLog;
           36                 a += ClumpSize + ci.size;
           37 
           38                 as.stats.used += ClumpSize + ci.size;
           39                 as.stats.uncsize += ia.size;
           40                 as.stats.clumps++;
           41                 if(ci.uncsize > ci.size)
           42                         as.stats.cclumps++;
           43                 as.aa = a;
           44                 insertscore(ci.score, &ia, IEDirty, &as);
           45         }
           46         flushdcache();
           47         return ok;
           48 }
           49 
           50 int
           51 syncindex(Index *ix)
           52 {
           53         Arena *arena;
           54         int i, e, e1, ok;
           55 
           56         ok = 0;
           57         for(i = 0; i < ix->narenas; i++){
           58                 trace(TraceProc, "syncindex start %d", i);
           59                 arena = ix->arenas[i];
           60                 e = syncarena(arena, TWID32, 1, 1);
           61                 e1 = e;
           62                 e1 &= ~(SyncHeader|SyncCIZero|SyncCIErr);
           63                 if(e & SyncHeader)
           64                         fprint(2, "arena %s: header is out-of-date\n", arena->name);
           65                 if(e1){
           66                         fprint(2, "arena %s: %x\n", arena->name, e1);
           67                         ok = -1;
           68                         continue;
           69                 }
           70                 flushdcache();
           71 
           72                 if(arena->memstats.clumps == arena->diskstats.clumps)
           73                         continue;
           74 
           75                 fprint(2, "%T %s: indexing %d clumps...\n",
           76                         arena->name,
           77                         arena->memstats.clumps - arena->diskstats.clumps);
           78 
           79                 if(syncarenaindex(arena, ix->amap[i].start) < 0){
           80                         fprint(2, "arena %s: syncarenaindex: %r\n", arena->name);
           81                         ok = -1;
           82                         continue;
           83                 }
           84                 if(wbarena(arena) < 0){
           85                         fprint(2, "arena %s: wbarena: %r\n", arena->name);
           86                         ok = -1;
           87                         continue;
           88                 }
           89                 flushdcache();
           90                 delaykickicache();
           91         }
           92         return ok;
           93 }