/** * overrides the test4 function in TestDriver * * @return whether test4 has passed */ protected boolean test4() { System.out.print("\n Test 4 exercises some of the internals " + "of the buffer manager\n"); int index; int numPages = NUMBUF + 10; Page pg = new Page(); PageId pid = new PageId(); PageId[] pids = new PageId[numPages]; boolean status = OK; System.out.print(" - Allocate bunch of pages together \n"); for (int i = 0; i < numPages / NUMBUF; i++) { for (index = i * NUMBUF; status == OK && index < (i + 1) * NUMBUF; ++index) { pg = new Page(); try { pid = SystemDefs.JavabaseBM.newPage(pg, 1); } catch (Exception e) { status = FAIL; System.err.print("*** Could not allocate new page number " + index + 1 + "\n"); e.printStackTrace(); } if (status == OK) { pids[index] = pid; } if (status == OK) { // Copy the page number + 99999 onto each page. It seems // unlikely that this bit pattern would show up there by // coincidence. int data = pid.pid + 99999; try { Convert.setIntValue(data, 0, pg.getpage()); } catch (IOException e) { System.err.print("*** Convert value failed\n"); status = FAIL; e.printStackTrace(); } } } for (index = i * NUMBUF; status == OK && index < (i + 1) * NUMBUF; ++index) { try { SystemDefs.JavabaseBM.unpinPage(pids[index], true); } catch (Exception e) { status = FAIL; System.err.print("*** Could not unpin page " + pids[index].pid + "\n"); e.printStackTrace(); } } } if (status == OK) { System.out.print(" - Read the pages\n"); for (int i = 0; i < numPages / NUMBUF; i++) { for (index = i * NUMBUF; status == OK && index < (i + 1) * NUMBUF; ++index) { pg = new Page(); pid = pids[index]; try { SystemDefs.JavabaseBM.pinPage(pid, pg, false); } catch (Exception e) { status = FAIL; System.err.print("*** Could not pin page " + pid.pid + "\n"); e.printStackTrace(); } if (status == OK) { int data = 0; try { data = Convert.getIntValue(0, pg.getpage()); } catch (IOException e) { System.err.print("*** Convert value failed \n"); status = FAIL; } if (data != pid.pid + 99999) { status = FAIL; System.err.print("*** Read wrong data back from page " + pid.pid + "\n"); } } } for (index = i * NUMBUF; status == OK && index < (i + 1) * NUMBUF; ++index) { try { SystemDefs.JavabaseBM.unpinPage(pids[index], true); } catch (Exception e) { status = FAIL; System.err.print("*** Could not unpin page " + pids[index].pid + "\n"); e.printStackTrace(); } } } } if (status == OK) { System.out.print(" Test 4 completed successfully.\n"); } return status; }
/** * overrides the test3 function in TestDriver. It exercises some of the internal of the buffer * manager * * @return whether test3 has passed */ protected boolean test3() { System.out.print("\n Test 3 exercises some of the internals " + "of the buffer manager\n"); int index; int numPages = NUMBUF + 10; Page pg = new Page(); PageId pid = new PageId(); PageId[] pids = new PageId[numPages]; boolean status = OK; System.out.print( " - Allocate and dirty some new pages, one at " + "a time, and leave some pinned\n"); for (index = 0; status == OK && index < numPages; ++index) { try { pid = SystemDefs.JavabaseBM.newPage(pg, 1); } catch (Exception e) { status = FAIL; System.err.print("*** Could not allocate new page number " + index + 1 + "\n"); e.printStackTrace(); } if (status == OK) pids[index] = pid; if (status == OK) { // Copy the page number + 99999 onto each page. It seems // unlikely that this bit pattern would show up there by // coincidence. int data = pid.pid + 99999; try { Convert.setIntValue(data, 0, pg.getpage()); } catch (IOException e) { System.err.print("*** Convert value failed\n"); status = FAIL; e.printStackTrace(); } // Leave the page pinned if it equals 12 mod 20. This is a // random number based loosely on a bug report. if (status == OK) { if (pid.pid % 20 != 12) { try { SystemDefs.JavabaseBM.unpinPage(pid, /*dirty:*/ true); } catch (Exception e) { status = FAIL; System.err.print("*** Could not unpin dirty page " + pid.pid + "\n"); } } } } } if (status == OK) { System.out.print(" - Read the pages\n"); for (index = 0; status == OK && index < numPages; ++index) { pid = pids[index]; try { SystemDefs.JavabaseBM.pinPage(pid, pg, false); } catch (Exception e) { status = FAIL; System.err.print("*** Could not pin page " + pid.pid + "\n"); e.printStackTrace(); } if (status == OK) { int data = 0; try { data = Convert.getIntValue(0, pg.getpage()); } catch (IOException e) { System.err.print("*** Convert value failed \n"); status = FAIL; } if (data != pid.pid + 99999) { status = FAIL; System.err.print("*** Read wrong data back from page " + pid.pid + "\n"); } } if (status == OK) { try { SystemDefs.JavabaseBM.unpinPage(pid, true); // might not be dirty } catch (Exception e) { status = FAIL; System.err.print("*** Could not unpin page " + pid.pid + "\n"); e.printStackTrace(); } } if (status == OK && (pid.pid % 20 == 12)) { try { SystemDefs.JavabaseBM.unpinPage(pid, /*dirty:*/ true); } catch (Exception e) { status = FAIL; System.err.print("*** Could not unpin page " + pid.pid + "\n"); e.printStackTrace(); } } } } if (status == OK) System.out.print(" Test 3 completed successfully.\n"); return status; }