1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-08 20:16:39 +00:00

Revert "Replace CiderByteStore methods with variants without signature."

This reverts commit 3a1a08106e.

Reason for revert: breaks dartd, can you maybe add instead of replace?

Original change's description:
> Replace CiderByteStore methods with variants without signature.
>
> Change-Id: I42c3aa456554974c1f44b95833e14487542539a5
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/246986
> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
> Reviewed-by: Keerti Parthasarathy <keertip@google.com>

TBR=keertip@google.com,scheglov@google.com

Change-Id: Ia05a618cde2f87b9c3162e28709de31baed18796
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247081
Reviewed-by: Ilya Yanok <yanok@google.com>
Reviewed-by: Alexander Thomas <athom@google.com>
Commit-Queue: Ilya Yanok <yanok@google.com>
This commit is contained in:
Ilya Yanok 2022-06-03 07:14:06 +00:00 committed by Commit Bot
parent 42778832a1
commit 8f1a15daca
4 changed files with 82 additions and 69 deletions

View File

@ -5,6 +5,7 @@
import 'dart:typed_data';
import 'package:analyzer/src/dart/analysis/cache.dart';
import 'package:collection/collection.dart';
class CacheData {
final int id;
@ -22,25 +23,18 @@ class CacheData {
/// Note that associations are not guaranteed to be persistent. The value
/// associated with a key can change or become `null` at any point in time.
abstract class CiderByteStore {
/// Return the bytes associated with the [key], and increment the reference
/// count.
/// Return the bytes associated with the errors for given [key] and
/// [signature].
///
/// Return `null` if the association does not exist.
Uint8List? get2(String key);
CacheData? get(String key, Uint8List signature);
/// Associate [bytes] with [key].
/// Return an internalized version of [bytes], the reference count is `1`.
///
/// This method will throw an exception if there is already an association
/// for the [key]. The client should either use [get2] to access data,
/// or first [release2] it.
Uint8List putGet2(String key, Uint8List bytes);
/// Associate the given [bytes] with the [key] and [signature]. Return the
/// [CacheData].
CacheData putGet(String key, Uint8List signature, Uint8List bytes);
/// Used to decrement reference count for the given ids, if implemented.
void release(Iterable<int> ids);
/// Decrement the reference count for every key in [keys].
void release2(Iterable<String> keys);
}
class CiderByteStoreTestView {
@ -48,33 +42,45 @@ class CiderByteStoreTestView {
}
class CiderCachedByteStore implements CiderByteStore {
final Cache<String, Uint8List> _cache;
final Cache<String, CiderCacheEntry> _cache;
int idCounter = 0;
/// This field gets value only during testing.
CiderByteStoreTestView? testView;
CiderCachedByteStore(int maxCacheSize)
: _cache = Cache<String, Uint8List>(maxCacheSize, (v) => v.length);
: _cache = Cache<String, CiderCacheEntry>(
maxCacheSize, (v) => v.data.bytes.length);
@override
Uint8List? get2(String key) {
return _cache.get(key);
CacheData? get(String key, Uint8List signature) {
final entry = _cache.get(key);
if (entry != null &&
const ListEquality<int>().equals(entry.signature, signature)) {
return entry.data;
}
return null;
}
@override
Uint8List putGet2(String key, Uint8List bytes) {
_cache.put(key, bytes);
CacheData putGet(String key, Uint8List signature, Uint8List bytes) {
idCounter++;
var entry = CiderCacheEntry(signature, CacheData(idCounter, bytes));
_cache.put(key, entry);
testView?.length++;
return bytes;
return entry.data;
}
@override
void release(Iterable<int> ids) {
// do nothing
}
@override
void release2(Iterable<String> keys) {
// TODO(scheglov) implement
}
}
class CiderCacheEntry {
final CacheData data;
final Uint8List signature;
CiderCacheEntry(this.signature, this.data);
}

View File

@ -139,7 +139,7 @@ class FileState {
Source get source => _location.source;
String get unlinkedKey => _unlinked.unlinkedKey;
int get unlinkedId => _unlinked.unlinkedId;
UnlinkedUnit get unlinkedUnit => _unlinked.unlinked.unit;
@ -330,12 +330,12 @@ class FileSystemState {
}
}
/// Clears all the cached files. Returns the list of keys of all the removed
/// Clears all the cached files. Returns the list of ids of all the removed
/// files.
Set<String> collectSharedDataKeys() {
var result = <String>{};
Set<int> collectSharedDataIdentifiers() {
var result = <int>{};
for (var file in _pathToFile.values) {
result.add(file._unlinked.unlinkedKey);
result.add(file._unlinked.unlinkedId);
}
return result;
}
@ -560,9 +560,9 @@ class LibraryCycle {
/// The hash of all the paths of the files in this cycle.
late String cyclePathsHash;
/// The key of the resolution cache entry.
/// The ID of the resolution cache entry.
/// It is `null` if we failed to load libraries of the cycle.
String? resolutionKey;
int? resolutionId;
LibraryCycle();
@ -713,8 +713,8 @@ class _FileStateUnlinked {
final bool exists;
final CiderUnlinkedUnit unlinked;
/// Key of the cache entry with unlinked data.
final String unlinkedKey;
/// id of the cache entry with unlinked data.
final int unlinkedId;
factory _FileStateUnlinked({
required _FileStateLocation location,
@ -723,6 +723,7 @@ class _FileStateUnlinked {
}) {
location._fsState.testView.refreshedFiles.add(location.path);
int unlinkedId;
CiderUnlinkedUnit unlinked;
var digest = performance.run('digest', (performance) {
@ -733,14 +734,15 @@ class _FileStateUnlinked {
var exists = digest.isNotEmpty;
final unlinkedKey = '${hex.encode(digest)}.unlinked';
var unlinkedKey = '${location.path}.unlinked';
var isUnlinkedFromCache = true;
// Prepare bytes of the unlinked bundle - existing or new.
// TODO(migration): should not be nullable
Uint8List? unlinkedBytes;
{
unlinkedBytes = location._fsState._byteStore.get2(unlinkedKey);
var unlinkedData = location._fsState._byteStore.get(unlinkedKey, digest);
unlinkedBytes = unlinkedData?.bytes;
if (unlinkedBytes == null || unlinkedBytes.isEmpty) {
isUnlinkedFromCache = false;
@ -761,12 +763,14 @@ class _FileStateUnlinked {
var unlinkedUnit = serializeAstCiderUnlinked(unit);
unlinkedBytes = unlinkedUnit.toBytes();
performance.getDataInt('length').add(unlinkedBytes!.length);
unlinkedBytes =
location._fsState._byteStore.putGet2(unlinkedKey, unlinkedBytes!);
unlinkedData = location._fsState._byteStore
.putGet(unlinkedKey, digest, unlinkedBytes!);
unlinkedBytes = unlinkedData!.bytes;
});
unlinked = CiderUnlinkedUnit.fromBytes(unlinkedBytes!);
}
unlinkedId = unlinkedData!.id;
}
// Read the unlinked bundle.
@ -778,7 +782,7 @@ class _FileStateUnlinked {
digest: digest,
exists: exists,
unlinked: unlinked,
unlinkedKey: unlinkedKey,
unlinkedId: unlinkedId,
);
if (isUnlinkedFromCache) {
performance.run('prefetch', (_) {
@ -794,7 +798,7 @@ class _FileStateUnlinked {
required this.digest,
required this.exists,
required this.unlinked,
required this.unlinkedKey,
required this.unlinkedId,
}) : _partOfLibrary = partOfLibrary;
FileState? get partOfLibrary {

View File

@ -114,10 +114,10 @@ class FileResolver {
_LibraryContext? libraryContext;
/// List of keys for cache elements that are invalidated. Track elements that
/// List of ids for cache elements that are invalidated. Track elements that
/// are invalidated during [changeFile]. Used in [releaseAndClearRemovedIds]
/// to release the cache items and is then cleared.
final Set<String> removedCacheKeys = {};
final Set<int> removedCacheIds = {};
/// The cache of file results, cleared on [changeFile].
///
@ -173,21 +173,21 @@ class FileResolver {
// Schedule disposing references to cached unlinked data.
for (var removedFile in removedFiles) {
removedCacheKeys.add(removedFile.unlinkedKey);
removedCacheIds.add(removedFile.unlinkedId);
}
// Remove libraries represented by removed files.
// If we need these libraries later, we will relink and reattach them.
if (libraryContext != null) {
libraryContext!.remove(removedFiles, removedCacheKeys);
libraryContext!.remove(removedFiles, removedCacheIds);
}
}
/// Collects all the cached artifacts and add all the cache id's for the
/// removed artifacts to [removedCacheKeys].
/// removed artifacts to [removedCacheIds].
void collectSharedDataIdentifiers() {
removedCacheKeys.addAll(fsState!.collectSharedDataKeys());
removedCacheKeys.addAll(libraryContext!.collectSharedDataKeys());
removedCacheIds.addAll(fsState!.collectSharedDataIdentifiers());
removedCacheIds.addAll(libraryContext!.collectSharedDataIdentifiers());
}
/// Looks for references to the given Element. All the files currently
@ -252,7 +252,7 @@ class FileResolver {
);
var file = fileContext.file;
final errorsSignatureBuilder = ApiSignature();
var errorsSignatureBuilder = ApiSignature();
errorsSignatureBuilder.addBytes(file.libraryCycle.signature);
errorsSignatureBuilder.addBytes(file.digest);
final errorsKey = '${errorsSignatureBuilder.toHex()}.errors';
@ -414,10 +414,10 @@ class FileResolver {
_resetContextObjects();
}
/// Releases from the cache and clear [removedCacheKeys].
/// Update the cache with list of invalidated ids and clears [removedCacheIds].
void releaseAndClearRemovedIds() {
byteStore.release2(removedCacheKeys);
removedCacheKeys.clear();
byteStore.release(removedCacheIds);
removedCacheIds.clear();
}
/// Remove cached [FileState]'s that were not used in the current analysis
@ -427,7 +427,7 @@ class FileResolver {
void removeFilesNotNecessaryForAnalysisOf(List<String> files) {
var removedFiles = fsState!.removeUnusedFiles(files);
for (var removedFile in removedFiles) {
removedCacheKeys.add(removedFile.unlinkedKey);
removedCacheIds.add(removedFile.unlinkedId);
}
}
@ -829,20 +829,20 @@ class _LibraryContext {
/// Clears all the loaded libraries. Returns the cache ids for the removed
/// artifacts.
Set<String> collectSharedDataKeys() {
var keySet = <String>{};
Set<int> collectSharedDataIdentifiers() {
var idSet = <int>{};
void addIfNotNull(String? key) {
if (key != null) {
keySet.add(key);
void addIfNotNull(int? id) {
if (id != null) {
idSet.add(id);
}
}
for (var cycle in loadedBundles) {
addIfNotNull(cycle.resolutionKey);
addIfNotNull(cycle.resolutionId);
}
loadedBundles.clear();
return keySet;
return idSet;
}
/// Load data required to access elements of the given [targetLibrary].
@ -864,8 +864,9 @@ class _LibraryContext {
await loadBundle(directDependency);
}
var resolutionKey = '${cycle.signatureStr}.resolution';
var resolutionBytes = byteStore.get2(resolutionKey);
var resolutionKey = '${cycle.cyclePathsHash}.resolution';
var resolutionData = byteStore.get(resolutionKey, cycle.signature);
var resolutionBytes = resolutionData?.bytes;
var unitsInformativeBytes = <Uri, Uint8List>{};
for (var library in cycle.libraries) {
@ -938,7 +939,9 @@ class _LibraryContext {
librariesLinked += cycle.libraries.length;
resolutionBytes = linkResult.resolutionBytes;
resolutionBytes = byteStore.putGet2(resolutionKey, resolutionBytes);
resolutionData =
byteStore.putGet(resolutionKey, cycle.signature, resolutionBytes);
resolutionBytes = resolutionData.bytes;
performance.getDataInt('bytesPut').add(resolutionBytes.length);
librariesLinkedTimer.stop();
@ -953,7 +956,7 @@ class _LibraryContext {
),
);
}
cycle.resolutionKey = resolutionKey;
cycle.resolutionId = resolutionData!.id;
// We might have just linked dart:core, ensure the type provider.
_createElementFactoryTypeProvider();
@ -972,22 +975,22 @@ class _LibraryContext {
/// Remove libraries represented by the [removed] files.
/// If we need these libraries later, we will relink and reattach them.
void remove(List<FileState> removed, Set<String> removedKeys) {
void remove(List<FileState> removed, Set<int> removedIds) {
elementFactory.removeLibraries(
removed.map((e) => e.uriStr).toSet(),
);
var removedSet = removed.toSet();
void addIfNotNull(String? key) {
if (key != null) {
removedKeys.add(key);
void addIfNotNull(int? id) {
if (id != null) {
removedIds.add(id);
}
}
loadedBundles.removeWhere((cycle) {
if (cycle.libraries.any(removedSet.contains)) {
addIfNotNull(cycle.resolutionKey);
addIfNotNull(cycle.resolutionId);
return true;
}
return false;

View File

@ -337,7 +337,7 @@ class A {}
await resolveFile(aPath);
fileResolver.collectSharedDataIdentifiers();
expect(fileResolver.removedCacheKeys.length,
expect(fileResolver.removedCacheIds.length,
(fileResolver.byteStore as CiderCachedByteStore).testView!.length);
}