Example #1
0
    def parse(self, op, timeStamp):
        '''
        Parse the inputdate from user.
        '''

        self.detDeadlock()
        self.run()

        op = self.formalize(op)
        # print(op)
        if op.startswith('beginro'):
            transId = int(op[op.find('(') + 2:op.find(')')])
            trans = Transaction(transId, timeStamp, readOnly=True)
            trans.makeVarsCopy(self.sites)
            self.curTrans[transId] = trans
        elif op.startswith('begin'):
            transId = int(op[op.find('(') + 2:op.find(')')])
            trans = Transaction(transId, timeStamp)
            self.curTrans[transId] = trans
        elif op.startswith('recover'):
            siteId = int(op[op.find('(') + 1:op.find(')')])
            site = self.sites[siteId]
            site.recover(self.sites)
        elif op.startswith('r'):
            args = op[op.find('(') + 1:op.find(')')].split(',')
            transId, varId = int(args[0][1:]), int(args[1][1:])
            trans = self.curTrans[transId]
            if trans.readOnly:
                if trans.varsCopy[varId] is not None:
                    print('x{}: {}'.format(varId, trans.varsCopy[varId]))
                else:
                    print('T{} cannot read x{} at this time'.format(
                        transId, varId))
            else:
                if not trans.abort:
                    trans.acquireReadLock(self.sites, varId)
                    self.ops.append(['r', trans, varId])
        elif op.startswith('w'):
            args = op[op.find('(') + 1:op.find(')')].split(',')
            transId, varId, value = int(args[0][1:]), int(args[1][1:]), int(
                args[2])
            trans = self.curTrans[transId]
            if not trans.abort:
                trans.acquireWriteLock(self.sites, varId)
                self.ops.append(['w', trans, varId, value])
        elif op.startswith('dump'):
            arg = op[op.find('(') + 1:op.find(')')]
            if arg == '':
                print(self.dumpAll())
            elif arg.startswith('x'):
                varId = int(arg[1:])
                print('\n'.join(self.dumpBySite(varId)))
            else:
                siteId = int(arg)
                print(self.sites[siteId].dump())
        elif op.startswith('end'):
            transId = int(op[op.find('(') + 2:op.find(')')])
            trans = self.curTrans[transId]
            if trans.abort:
                print('T{} aborts ({})'.format(transId, trans.reason))
            else:
                log = trans.commit(self.sites)
                if log:
                    print(log)
                print('T{} commits'.format(transId))
        elif op.startswith('fail'):
            siteId = int(op[op.find('(') + 1:op.find(')')])
            site = self.sites[siteId]
            abortSet = site.fail()
            for transId in abortSet:
                if transId in self.curTrans:
                    self.curTrans[transId].setAbort(self.sites, self.ops,
                                                    'site down')

        # print('-----before------')
        # print(self.ops)
        # print('----------------')
        # print('input: {}, locks: {}'.format(op, self.sites[1].vars[2].locks.keys()))
        self.run()