fmtindex.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. void
  5. usage(void)
  6. {
  7. fprint(2, "usage: fmtindex config\n");
  8. exits(0);
  9. }
  10. int
  11. main(int argc, char *argv[])
  12. {
  13. Config conf;
  14. Index *ix;
  15. ArenaPart *ap;
  16. Arena **arenas;
  17. AMap *amap;
  18. u64int addr;
  19. char *file;
  20. u32int i, j, n, narenas;
  21. int add;
  22. fmtinstall('V', vtScoreFmt);
  23. fmtinstall('R', vtErrFmt);
  24. vtAttach();
  25. statsInit();
  26. add = 0;
  27. ARGBEGIN{
  28. case 'a':
  29. add = 1;
  30. break;
  31. default:
  32. usage();
  33. break;
  34. }ARGEND
  35. if(argc != 1)
  36. usage();
  37. file = argv[0];
  38. if(!runConfig(file, &conf))
  39. fatal("can't intialization config %s: %R", file);
  40. if(conf.index == nil)
  41. fatal("no index specified in %s", file);
  42. if(!nameOk(conf.index))
  43. fatal("illegal index name %s", conf.index);
  44. narenas = 0;
  45. for(i = 0; i < conf.naparts; i++){
  46. ap = conf.aparts[i];
  47. narenas += ap->narenas;
  48. }
  49. if(add){
  50. ix = initIndex(conf.index, conf.sects, conf.nsects);
  51. if(ix == nil)
  52. fatal("can't initialize index %s: %R", conf.index);
  53. }else{
  54. ix = newIndex(conf.index, conf.sects, conf.nsects);
  55. if(ix == nil)
  56. fatal("can't create new index %s: %R", conf.index);
  57. n = 0;
  58. for(i = 0; i < ix->nsects; i++)
  59. n += ix->sects[i]->blocks;
  60. if(ix->div < 100)
  61. fatal("index divisor too coarse: use bigger block size");
  62. fprint(2, "using %ud buckets of %ud; div=%d\n", ix->buckets, n, ix->div);
  63. }
  64. amap = MKNZ(AMap, narenas);
  65. arenas = MKNZ(Arena*, narenas);
  66. addr = IndexBase;
  67. n = 0;
  68. for(i = 0; i < conf.naparts; i++){
  69. ap = conf.aparts[i];
  70. for(j = 0; j < ap->narenas; j++){
  71. if(n >= narenas)
  72. fatal("too few slots in index's arena set");
  73. arenas[n] = ap->arenas[j];
  74. if(n < ix->narenas){
  75. if(arenas[n] != ix->arenas[n])
  76. fatal("mismatched arenas %s and %s at slot %d\n",
  77. arenas[n]->name, ix->arenas[n]->name, n);
  78. amap[n] = ix->amap[n];
  79. if(amap[n].start != addr)
  80. fatal("mis-located arena %s in index %s\n", arenas[n]->name, ix->name);
  81. addr = amap[n].stop;
  82. }else{
  83. amap[n].start = addr;
  84. addr += ap->arenas[j]->size;
  85. amap[n].stop = addr;
  86. nameCp(amap[n].name, ap->arenas[j]->name);
  87. fprint(2, "add arena %s at [%lld,%lld)\n",
  88. amap[n].name, amap[n].start, amap[n].stop);
  89. }
  90. n++;
  91. }
  92. }
  93. fprint(2, "configured index=%s with arenas=%d and storage=%lld\n",
  94. ix->name, n, addr - IndexBase);
  95. ix->amap = amap;
  96. ix->arenas = arenas;
  97. ix->narenas = narenas;
  98. if(!wbIndex(ix))
  99. fprint(2, "can't write back arena partition header for %s: %R\n", file);
  100. exits(0);
  101. return 0; /* shut up stupid compiler */
  102. }