Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a case in live-recovery from a writer crash. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | range-delete |
Files: | files | file ages | folders |
SHA1: |
80abdbea2d23287b5d28e8784d7a3801 |
User & Date: | dan 2012-10-15 19:34:24.599 |
Context
2012-10-15
| ||
19:36 | Merge range-delete branch back into trunk. check-in: a7de625f13 user: dan tags: trunk | |
19:34 | Fix a case in live-recovery from a writer crash. Leaf check-in: 80abdbea2d user: dan tags: range-delete | |
16:42 | Fix an assert() that can fail following an OOM condition. check-in: 8a713f17fc user: dan tags: range-delete | |
Changes
Changes to lsm-test/lsmtest8.c.
︙ | ︙ | |||
301 302 303 304 305 306 307 | } void do_writer_crash_test(const char *zPattern, int *pRc){ struct Test { const char *zName; void (*xFunc)(int *); } aTest[] = { | < > | 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 | } void do_writer_crash_test(const char *zPattern, int *pRc){ struct Test { const char *zName; void (*xFunc)(int *); } aTest[] = { { "writercrash1.lsm", doWriterCrash1 }, { "writercrash2.lsm", doWriterCrash2 }, }; int i; for(i=0; i<ArraySize(aTest); i++){ struct Test *p = &aTest[i]; if( testCaseBegin(pRc, zPattern, p->zName) ){ p->xFunc(pRc); testCaseFinish(*pRc); |
︙ | ︙ |
Changes to src/lsm_tree.c.
︙ | ︙ | |||
1173 1174 1175 1176 1177 1178 1179 | u32 iShmid; ShmChunk *p; p = treeShmChunkRc(db, db->treehdr.iFirst, &rc); iShmid = p->iShmid; while( rc==LSM_OK && p ){ if( p->iNext ){ | > > > | | | | | | > | 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 | u32 iShmid; ShmChunk *p; p = treeShmChunkRc(db, db->treehdr.iFirst, &rc); iShmid = p->iShmid; while( rc==LSM_OK && p ){ if( p->iNext ){ if( p->iNext>=db->treehdr.nChunk ){ rc = LSM_CORRUPT_BKPT; }else{ ShmChunk *pNext = treeShmChunkRc(db, p->iNext, &rc); if( rc==LSM_OK ){ if( pNext->iShmid!=p->iShmid+1 ){ rc = LSM_CORRUPT_BKPT; } p = pNext; } } }else{ p = 0; } nVisit++; } |
︙ | ︙ | |||
1262 1263 1264 1265 1266 1267 1268 | nSort = 1; while( nSort < (db->treehdr.nChunk-1) ) nSort = nSort * 2; nByte = sizeof(ShmChunkLoc) * nSort * 2; aSort = lsmMallocZeroRc(db->pEnv, nByte, &rc); iPrevShmid = pMin->iShmid; /* Fix all shm-ids, if required. */ | | > | | > | 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 | nSort = 1; while( nSort < (db->treehdr.nChunk-1) ) nSort = nSort * 2; nByte = sizeof(ShmChunkLoc) * nSort * 2; aSort = lsmMallocZeroRc(db->pEnv, nByte, &rc); iPrevShmid = pMin->iShmid; /* Fix all shm-ids, if required. */ if( rc==LSM_OK ){ iPrevShmid = pMin->iShmid-1; for(i=1; i<db->treehdr.nChunk; i++){ p = treeShmChunk(db, i); aSort[i-1].pShm = p; aSort[i-1].iLoc = i; if( i!=db->treehdr.iFirst ){ if( shm_sequence_ge(p->iShmid, db->treehdr.iNextShmid) ){ p->iShmid = iPrevShmid--; } } } if( iMin!=db->treehdr.iFirst ){ p = treeShmChunk(db, db->treehdr.iFirst); p->iShmid = iPrevShmid; } } if( rc==LSM_OK ){ ShmChunkLoc *aSpace = &aSort[nSort]; for(i=0; i<nSort; i++){ if( aSort[i].pShm ){ assert( shm_sequence_ge(aSort[i].pShm->iShmid, iPrevShmid) ); |
︙ | ︙ |