Skip to content

Commit 515e422

Browse files
committed
Cleanup code in metadata cache, also fixes issue with charset aliases
1 parent fd83f03 commit 515e422

17 files changed

Lines changed: 154 additions & 217 deletions

src/dsql/DsqlRequests.cpp

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
#include "../dsql/errd_proto.h"
3636
#include "../dsql/movd_proto.h"
3737
#include "../jrd/exe_proto.h"
38-
#include "../common/utils_proto.h"
3938

4039
using namespace Firebird;
4140
using namespace Jrd;
@@ -554,47 +553,17 @@ void DsqlDmlRequest::doExecute(thread_db* tdbb, jrd_tra** traHandle,
554553
firstRowFetched = false;
555554
const dsql_msg* message = dsqlStatement->getSendMsg();
556555

557-
for (int i = 0; i < EXEC_RESTARTS; ++i)
556+
if (!message)
558557
{
559-
try
560-
{
561-
if (!message)
562-
{
563-
JRD_start(tdbb, request, req_transaction);
564-
}
565-
else
566-
{
567-
fb_assert(inMsg != nullptr);
568-
569-
const ULONG inMsgLength = dsqlStatement->getStatement()->getMessage(message->msg_number)->
570-
getFormat(request)->fmt_length;
571-
JRD_start_and_send(tdbb, request, req_transaction, message->msg_number,
572-
inMsgLength, inMsg);
573-
}
574-
575-
break;
576-
}
577-
catch (const Exception& ex)
578-
{
579-
FbLocalStatus st;
580-
ex.stuffException(&st);
581-
582-
if (fb_utils::containsErrorCode(st->getErrors(), isc_old_format))
583-
{
584-
// destroy existing request
585-
auto* statement = request->getStatement();
586-
EXE_release(tdbb, request);
587-
588-
// create fresh one (with changed metadata in cache)
589-
request = statement->findRequest(tdbb);
590-
tdbb->getAttachment()->att_requests.add(request);
591-
592-
tdbb->tdbb_status_vector->init();
593-
continue;
594-
}
558+
JRD_start(tdbb, request, req_transaction);
559+
}
560+
else
561+
{
562+
fb_assert(inMsg != nullptr);
595563

596-
throw;
597-
}
564+
const ULONG inMsgLength = dsqlStatement->getStatement()->getMessage(message->msg_number)->getFormat(request)->fmt_length;
565+
JRD_start_and_send(tdbb, request, req_transaction, message->msg_number,
566+
inMsgLength, inMsg);
598567
}
599568

600569
// Selectable execute block should get the "proc fetch" flag assigned,

src/jrd/CacheVector.h

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,12 @@ namespace CacheFlag
117117
static constexpr ObjectBase::Flag RETIRED = 0x040; // object is in a process of GC
118118
static constexpr ObjectBase::Flag MINISCAN = 0x080; // perform minimum scan and set cache entry to reload state
119119
static constexpr ObjectBase::Flag DB_VERSION = 0x100; // execute version upgrade in database
120+
static constexpr ObjectBase::Flag DEPENDS = 0x200; // collect object dependencies
120121

121122
// Useful combinations
122123
static constexpr ObjectBase::Flag TAG_FOR_UPDATE = NOCOMMIT | MINISCAN | DB_VERSION;
123124
static constexpr ObjectBase::Flag OLD_DROP = MINISCAN | AUTOCREATE;
124-
static constexpr ObjectBase::Flag OLD_ALTER = MINISCAN | AUTOCREATE;
125+
static constexpr ObjectBase::Flag OLD_ALTER = MINISCAN | AUTOCREATE | DEPENDS;
125126
}
126127

127128

@@ -747,8 +748,7 @@ class CacheElement : public ElementBase, public P
747748
ListEntry<Versioned>* newEntry = nullptr;
748749
try
749750
{
750-
newEntry = FB_NEW_POOL(*getDefaultMemoryPool())
751-
ListEntry<Versioned>(obj, traNum, fl & ~CacheFlag::ERASED);
751+
newEntry = FB_NEW ListEntry<Versioned>(obj, traNum, fl & ~CacheFlag::ERASED);
752752
}
753753
catch (const Firebird::Exception&)
754754
{
@@ -812,7 +812,7 @@ class CacheElement : public ElementBase, public P
812812

813813
if (!cur)
814814
cur = TransactionNumber::current(tdbb);
815-
ListEntry<Versioned>* newEntry = FB_NEW_POOL(*getDefaultMemoryPool()) ListEntry<Versioned>(obj, cur, fl);
815+
ListEntry<Versioned>* newEntry = FB_NEW ListEntry<Versioned>(obj, cur, fl);
816816
if (!ListEntry<Versioned>::add(tdbb, list, newEntry))
817817
{
818818
newEntry->cleanup(tdbb, false);
@@ -990,13 +990,20 @@ class CacheElement : public ElementBase, public P
990990
CacheFlag::COMMITTED | CacheFlag::MINISCAN | CacheFlag::DB_VERSION, l.getPointer());
991991
if (l.replace(list, newEntry))
992992
return true;
993+
994+
// undo changes
993995
delete newEntry;
994996

995997
// Someone already added entry - see is it OK for us
996998
l.set(list);
997999
return ListEntry<Versioned>::upgradable(l, from);
9981000
}
9991001

1002+
bool nameIs(const QualifiedName& name)
1003+
{
1004+
return this->getName() == name;
1005+
}
1006+
10001007
private:
10011008
void setNewResetAt(TraNumber oldVal, TraNumber newVal)
10021009
{
@@ -1016,6 +1023,21 @@ struct NoData
10161023
NoData() { }
10171024
};
10181025

1026+
template <typename EXTEND = NoData>
1027+
struct ExName
1028+
{
1029+
ExName(const QualifiedName& name)
1030+
: name(name)
1031+
{ }
1032+
1033+
ExName(const QualifiedName& name, EXTEND ex)
1034+
: name(name), ex(ex)
1035+
{ }
1036+
1037+
const QualifiedName& name;
1038+
EXTEND ex = EXTEND();
1039+
};
1040+
10191041
template <class StoredElement, unsigned SUBARRAY_SHIFT = 8, typename EXTEND = NoData>
10201042
class CacheVector : public Firebird::PermanentStorage
10211043
{
@@ -1227,36 +1249,6 @@ class CacheVector : public Firebird::PermanentStorage
12271249
return false;
12281250
}
12291251

1230-
template <typename F>
1231-
StoredElement* lookup(thread_db* tdbb, F&& cmp, ObjectBase::Flag fl) const
1232-
{
1233-
auto a = m_objects.readAccessor();
1234-
for (FB_SIZE_T i = 0; i < a->getCount(); ++i)
1235-
{
1236-
SubArrayData* const sub = a->value(i).load(atomics::memory_order_relaxed);
1237-
if (!sub)
1238-
continue;
1239-
1240-
for (SubArrayData* end = &sub[SUBARRAY_SIZE]; sub < end--;)
1241-
{
1242-
StoredElement* ptr = end->load(atomics::memory_order_relaxed);
1243-
if (ptr)
1244-
{
1245-
auto listEntry = ptr->getEntry(tdbb, TransactionNumber::current(tdbb), fl | CacheFlag::MINISCAN);
1246-
if (listEntry && cmp(ptr))
1247-
{
1248-
// if (!(fl & (CacheFlag::ERASED | CacheFlag::MINISCAN)))
1249-
if (!(fl & CacheFlag::ERASED))
1250-
ptr->reload(tdbb, fl); // found object to be reloaded w/o MINISCAN flag
1251-
return ptr;
1252-
}
1253-
}
1254-
}
1255-
}
1256-
1257-
return nullptr;
1258-
}
1259-
12601252
bool lookup(thread_db* tdbb, const QualifiedName& name, ObjectBase::Flag fl,
12611253
StoredElement** element, Versioned** versioned)
12621254
{
@@ -1274,9 +1266,9 @@ class CacheVector : public Firebird::PermanentStorage
12741266
{
12751267
auto listEntry = ptr->getEntry(tdbb, TransactionNumber::current(tdbb), fl | CacheFlag::MINISCAN);
12761268

1277-
if (listEntry && ptr->getName() == name)
1269+
if (listEntry && ptr->nameIs(name))
12781270
{
1279-
if (!(fl & CacheFlag::ERASED))
1271+
if (!(fl & (CacheFlag::ERASED | CacheFlag::MINISCAN)))
12801272
ptr->reload(tdbb, fl); // found object to be reloaded w/o MINISCAN flag
12811273
if (versioned)
12821274
*versioned = listEntry->getVersioned();
@@ -1292,7 +1284,7 @@ class CacheVector : public Firebird::PermanentStorage
12921284
if (!(fl & CacheFlag::AUTOCREATE))
12931285
return false;
12941286

1295-
auto id = Versioned::getIdByName(tdbb, name);
1287+
auto id = Versioned::getIdByName(tdbb, {name, m_extend});
12961288
if (!id.has_value())
12971289
return false;
12981290

src/jrd/CharSetContainer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ bool CharSetContainer::destroy(thread_db* tdbb, CharSetContainer* container)
5757
return false;
5858
}
5959

60-
int CharSetVers::objectType()
60+
ObjectType CharSetVers::objectType()
6161
{
6262
return obj_charset;
6363
}

src/jrd/CharSetContainer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class CharSetVers final : public ObjectBase
119119
static const enum lck_t LOCKTYPE = LCK_cs_rescan;
120120

121121
ScanResult scan(thread_db* tdbb, ObjectBase::Flag flags);
122-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
122+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<> name);
123123
ScanResult reload(thread_db* tdbb, ObjectBase::Flag flags)
124124
{
125125
return scan(tdbb, flags);
@@ -132,7 +132,7 @@ class CharSetVers final : public ObjectBase
132132
return perm;
133133
}
134134

135-
static int objectType();
135+
static ObjectType objectType() noexcept;
136136

137137
bool hash(thread_db*, Firebird::sha512&)
138138
{

src/jrd/Function.epp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ ScanResult Function::reload(thread_db* tdbb, ObjectBase::Flag /*unused*/)
483483
return found ? ScanResult::COMPLETE : ScanResult::MISS;
484484
}
485485

486-
int Function::objectType()
486+
ObjectType Function::objectType()
487487
{
488488
return obj_udf;
489489
}

src/jrd/Function.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ namespace Jrd
6262

6363
static Function* create(thread_db* tdbb, MemoryPool& pool, Cached::Function* perm);
6464
ScanResult scan(thread_db* tdbb, ObjectBase::Flag flags);
65-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
65+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<> name);
6666
void checkReload(thread_db* tdbb) const override;
6767

6868
static const char* objectFamily(void*)
@@ -81,7 +81,7 @@ namespace Jrd
8181
return obj_functions;
8282
}
8383

84-
static int objectType();
84+
static ObjectType objectType() noexcept;
8585

8686
private:
8787
~Function() override

src/jrd/Package.epp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,9 @@ Package* Package::create(thread_db* tdbb, MemoryPool& pool, Cached::Package* per
235235
return FB_NEW_POOL(perm->getPool()) Package(perm);
236236
}
237237

238-
std::optional<MetaId> Package::getIdByName(thread_db* tdbb, const QualifiedName& name)
238+
std::optional<MetaId> Package::getIdByName(thread_db* tdbb, ExName<> nm)
239239
{
240+
auto& name = nm.name;
240241
fb_assert(name.package.isEmpty());
241242

242243
SET_TDBB(tdbb);
@@ -314,7 +315,7 @@ ScanResult Package::reload(thread_db* tdbb, ObjectBase::Flag fl)
314315
return ScanResult::COMPLETE;
315316
}
316317

317-
int Package::objectType()
318+
ObjectType Package::objectType() noexcept
318319
{
319320
return obj_package_header;
320321
}

src/jrd/Package.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class Package final : public Firebird::PermanentStorage, public ObjectBase
198198
}
199199

200200
static Package* create(thread_db* tdbb, MemoryPool& pool, Cached::Package* perm);
201-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
201+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<> name);
202202

203203
ScanResult scan(thread_db* tdbb, ObjectBase::Flag flags);
204204
void checkReload(thread_db* tdbb);
@@ -224,7 +224,7 @@ class Package final : public Firebird::PermanentStorage, public ObjectBase
224224
return obj_package_header;
225225
}
226226

227-
static int objectType();
227+
static ObjectType objectType() noexcept;
228228

229229
bool hash(thread_db* tdbb, Firebird::sha512& digest);
230230

src/jrd/Relation.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,11 @@ void IndexVersion::destroy(thread_db* tdbb, IndexVersion* idv)
712712
delete idv;
713713
}
714714

715+
ObjectType IndexVersion::objectType() noexcept
716+
{
717+
return obj_index;
718+
}
719+
715720

716721
void jrd_rel::releaseTriggers(thread_db* tdbb, bool destroy)
717722
{
@@ -1125,7 +1130,7 @@ const char* jrd_rel::objectFamily(RelationPermanent* perm)
11251130
return perm->isView() ? "view" : "table";
11261131
}
11271132

1128-
int jrd_rel::objectType()
1133+
ObjectType jrd_rel::objectType() noexcept
11291134
{
11301135
return obj_relation;
11311136
}
@@ -1247,7 +1252,7 @@ const QualifiedName& DbTriggersHeader::getName() const noexcept
12471252
return tnames[type];
12481253
}
12491254

1250-
int DbTriggers::objectType()
1255+
ObjectType DbTriggers::objectType() noexcept
12511256
{
12521257
return obj_trigger;
12531258
}

src/jrd/Relation.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class DbTriggers final : public Triggers, public ObjectBase
235235

236236
static const enum lck_t LOCKTYPE = LCK_dbwide_triggers;
237237
ScanResult scan(thread_db* tdbb, ObjectBase::Flag flags);
238-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
238+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<> name);
239239

240240
ScanResult reload(thread_db* tdbb, ObjectBase::Flag flags)
241241
{
@@ -252,7 +252,7 @@ class DbTriggers final : public Triggers, public ObjectBase
252252
return "set of database-wide triggers on";
253253
}
254254

255-
static int objectType();
255+
static ObjectType objectType() noexcept;
256256

257257
private:
258258
DbTriggersHeader* perm;
@@ -562,7 +562,9 @@ class IndexVersion final : public ObjectBase
562562
static void destroy(thread_db* tdbb, IndexVersion* idv);
563563

564564
ScanResult scan(thread_db* tdbb, ObjectBase::Flag flags);
565-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
565+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<RelationPermanent*> name);
566+
static ObjectType objectType() noexcept;
567+
566568
ScanResult reload(thread_db* tdbb, ObjectBase::Flag flags)
567569
{
568570
return scan(tdbb, flags);
@@ -679,7 +681,7 @@ class jrd_rel final : public ObjectBase
679681
static const enum lck_t LOCKTYPE = LCK_rel_rescan;
680682

681683
ScanResult scan(thread_db* tdbb, ObjectBase::Flag& flags); // Scan the newly loaded relation for meta data
682-
static std::optional<MetaId> getIdByName(thread_db* tdbb, const QualifiedName& name);
684+
static std::optional<MetaId> getIdByName(thread_db* tdbb, ExName<> name);
683685
ScanResult reload(thread_db* tdbb, ObjectBase::Flag& flags)
684686
{
685687
return scan(tdbb, flags);
@@ -688,7 +690,7 @@ class jrd_rel final : public ObjectBase
688690
bool hash(thread_db* tdbb, Firebird::sha512& digest);
689691

690692
static const char* objectFamily(RelationPermanent* perm);
691-
static int objectType();
693+
static ObjectType objectType() noexcept;
692694

693695
void releaseTriggers(thread_db* tdbb, bool destroy);
694696
const Trigger* findTrigger(const QualifiedName& trig_name) const;

0 commit comments

Comments
 (0)